Messages in this thread | | | From | Valentin Schneider <> | Subject | Re: [PATCH 2/2] sched: Consider task_struct::saved_state in wait_task_inactive(). | Date | Tue, 26 Jul 2022 11:18:20 +0100 |
| |
On 26/07/22 08:17, Sebastian Andrzej Siewior wrote: > On 2022-07-25 18:47:58 [+0100], Valentin Schneider wrote: >> > --- a/kernel/sched/core.c >> > +++ b/kernel/sched/core.c >> > @@ -3257,6 +3257,40 @@ int migrate_swap(struct task_struct *cur >> > } >> > #endif /* CONFIG_NUMA_BALANCING */ >> > >> > +#ifdef CONFIG_PREEMPT_RT >> >> Would something like the below be useful? >> >> /* >> * If p->saved_state is anything else than TASK_RUNNING, then p blocked on an >> * rtlock *before* voluntarily calling into schedule() after setting its state >> * to X. For things like ptrace (X=TASK_TRACED), the task could have more work >> * to do upon acquiring the lock before whoever called wait_task_inactive() >> * should return. IOW, we have to wait for: >> * >> * p.saved_state = TASK_RUNNING >> * p.__state = X >> * >> * which implies the task isn't blocked on an RT lock and got to schedule() by >> * itself. >> * >> * Also see comments in ttwu_state_match(). >> */ > > This sums up the code. I would s/schedule/schedule_rtlock/ since there > are two entrypoints.
Right, this any better?
/* * Consider: * * set_special_state(X); * * do_things() * // Somewhere in there is an rtlock that can be contended: * current_save_and_set_rtlock_wait_state(); * [...] * schedule_rtlock(); (A) * [...] * current_restore_rtlock_saved_state(); * * schedule(); (B) * * If p->saved_state is anything else than TASK_RUNNING, then p blocked on an * rtlock (A) *before* voluntarily calling into schedule() (B) after setting its * state to X. For things like ptrace (X=TASK_TRACED), the task could have more * work to do upon acquiring the lock in do_things() before whoever called * wait_task_inactive() should return. IOW, we have to wait for: * * p.saved_state = TASK_RUNNING * p.__state = X * * which implies the task isn't blocked on an RT lock and got to schedule() (B). * * Also see comments in ttwu_state_match(). */
| |