Christian Borntraeger
2022-Sep-26 15:49 UTC
[PATCH v3 6/6] freezer,sched: Rewrite core freezer logic
Am 26.09.22 um 15:37 schrieb Peter Zijlstra:> On Mon, Sep 26, 2022 at 03:23:10PM +0200, Christian Borntraeger wrote: >> Am 26.09.22 um 14:55 schrieb Peter Zijlstra: >> >>> Could you please test with something like the below on? I can boot that >>> with KVM, but obviously I didn't suffer any weirdness to begin with :/ >>> >>> --- >>> diff --git a/kernel/sched/core.c b/kernel/sched/core.c >>> index 4e6a6417211f..ef9ccfc3a8c0 100644 >>> --- a/kernel/sched/core.c >>> +++ b/kernel/sched/core.c >>> @@ -4051,6 +4051,8 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) >>> unsigned long flags; >>> int cpu, success = 0; >>> + WARN_ON_ONCE(state & TASK_FREEZABLE); >>> + >>> preempt_disable(); >>> if (p == current) { >>> /* >> >> Does not seem to trigger. > > Moo -- quite the puzzle this :/ I'll go stare at it more then.Hmm, #define ___wait_is_interruptible(state) \ (!__builtin_constant_p(state) || \ state == TASK_INTERRUPTIBLE || state == TASK_KILLABLE) \ That would not trigger when state is also TASK_FREEZABLE, no?
Peter Zijlstra
2022-Sep-26 18:06 UTC
[PATCH v3 6/6] freezer,sched: Rewrite core freezer logic
On Mon, Sep 26, 2022 at 05:49:16PM +0200, Christian Borntraeger wrote:> Hmm, > > #define ___wait_is_interruptible(state) \ > (!__builtin_constant_p(state) || \ > state == TASK_INTERRUPTIBLE || state == TASK_KILLABLE) \ > > That would not trigger when state is also TASK_FREEZABLE, no?Spot on! signal_pending_state() writes that as: state & (TASK_INTERRUPTIBLE | TASK_WAKEKILL) which is the correct form. diff --git a/include/linux/wait.h b/include/linux/wait.h index 14ad8a0e9fac..7f5a51aae0a7 100644 --- a/include/linux/wait.h +++ b/include/linux/wait.h @@ -281,7 +281,7 @@ static inline void wake_up_pollfree(struct wait_queue_head *wq_head) #define ___wait_is_interruptible(state) \ (!__builtin_constant_p(state) || \ - state == TASK_INTERRUPTIBLE || state == TASK_KILLABLE) \ + (state & (TASK_INTERRUPTIBLE | TASK_WAKEKILL))) extern void init_wait_entry(struct wait_queue_entry *wq_entry, int flags); Let me go git-grep some to see if there's more similar fail.