2023-10-10 03:26:52

by Chen Yu

[permalink] [raw]
Subject: [PATCH] sched/fair: Use printk_deferred instead of printk in pick_eevdf()

When no eligible entity is found in pick_eevdf(), it has to pick
the entity with smallest vruntime. This indicates a potential issue
and scheduler will print this error.

However this printk could introduce possible circular locking issue
because when the code path reaches here with the rq lock held, the
printk could trigger further scheduling which loops back to the
scheduler.

Use printk_deferred() to defer the console write from current context
to the irq work in the next tick.

Fixes: 147f3efaa241 ("sched/fair: Implement an EEVDF-like scheduling policy")
Suggested-by: Phil Auld <[email protected]>
Reported-by: Biju Das <[email protected]>
Reported-by: Marek Szyprowski <[email protected]>
Signed-off-by: Chen Yu <[email protected]>
---
kernel/sched/fair.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 061a30a8925a..70f38e54b6ce 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -973,7 +973,7 @@ static struct sched_entity *pick_eevdf(struct cfs_rq *cfs_rq)
if (!se) {
struct sched_entity *left = __pick_first_entity(cfs_rq);
if (left) {
- pr_err("EEVDF scheduling fail, picking leftmost\n");
+ printk_deferred(KERN_ERR "EEVDF scheduling fail, picking leftmost\n");
return left;
}
}
--
2.25.1


2023-10-10 08:00:10

by Peter Zijlstra

[permalink] [raw]
Subject: Re: [PATCH] sched/fair: Use printk_deferred instead of printk in pick_eevdf()

On Tue, Oct 10, 2023 at 11:25:41AM +0800, Chen Yu wrote:
> When no eligible entity is found in pick_eevdf(), it has to pick
> the entity with smallest vruntime. This indicates a potential issue
> and scheduler will print this error.
>
> However this printk could introduce possible circular locking issue
> because when the code path reaches here with the rq lock held, the
> printk could trigger further scheduling which loops back to the
> scheduler.
>
> Use printk_deferred() to defer the console write from current context
> to the irq work in the next tick.

No.. I detest printk_deferred with a passion. This is effectively a WARN
and we don't do silly buggers for them either.

2023-10-10 12:27:27

by Phil Auld

[permalink] [raw]
Subject: Re: [PATCH] sched/fair: Use printk_deferred instead of printk in pick_eevdf()

On Tue, Oct 10, 2023 at 09:59:28AM +0200 Peter Zijlstra wrote:
> On Tue, Oct 10, 2023 at 11:25:41AM +0800, Chen Yu wrote:
> > When no eligible entity is found in pick_eevdf(), it has to pick
> > the entity with smallest vruntime. This indicates a potential issue
> > and scheduler will print this error.
> >
> > However this printk could introduce possible circular locking issue
> > because when the code path reaches here with the rq lock held, the
> > printk could trigger further scheduling which loops back to the
> > scheduler.
> >
> > Use printk_deferred() to defer the console write from current context
> > to the irq work in the next tick.

Chen: I was not actually suggesting you make this change, just answering your
question about printk/rq lock. You don't need to put that line in there.

>
> No.. I detest printk_deferred with a passion. This is effectively a WARN
> and we don't do silly buggers for them either.
>

Sure, printk_deferred is not ideal, but is getting this message in the right
order worth locking up people's machines? Not sure you get the message at
all when that happens. I have to dig the code location out of the crash
dump to find which sched warning fired and took down the (usually virtual)
machine.


Cheers,
Phil

--

2023-10-10 14:13:12

by Peter Zijlstra

[permalink] [raw]
Subject: Re: [PATCH] sched/fair: Use printk_deferred instead of printk in pick_eevdf()

On Tue, Oct 10, 2023 at 08:26:00AM -0400, Phil Auld wrote:

> > No.. I detest printk_deferred with a passion. This is effectively a WARN
> > and we don't do silly buggers for them either.
> >
>
> Sure, printk_deferred is not ideal, but is getting this message in the right
> order worth locking up people's machines? Not sure you get the message at
> all when that happens. I have to dig the code location out of the crash
> dump to find which sched warning fired and took down the (usually virtual)
> machine.

Same thing with WARN(), we don't have a silly bugger version of that
either. Just use a sane printk() / console or whatever.

Virt stuff has perfectly functional serial consoles that works just fine
and don't lock up the machine -- mostly. Use my early_printk hacks if
you want something reliable:

https://git.kernel.org/pub/scm/linux/kernel/git/peterz/queue.git/log/?h=debug/experimental

Boot with: "earlyprintk=serial,ttyS0,115200 force_early_printk". And all
will be well.

The fact that crashdump is more reliable than printk is a *BIG* problem
and the only solution is fixing printk() (people are sorta working on
that). We should not try and work around this problem.

I fundamentally despise the delayed stuff, I've had countless insteances
where delaying output means you have no output because the machine is
dead.

2023-10-11 10:27:59

by Chen Yu

[permalink] [raw]
Subject: Re: [PATCH] sched/fair: Use printk_deferred instead of printk in pick_eevdf()

On 2023-10-10 at 16:12:44 +0200, Peter Zijlstra wrote:
> On Tue, Oct 10, 2023 at 08:26:00AM -0400, Phil Auld wrote:
>
> > > No.. I detest printk_deferred with a passion. This is effectively a WARN
> > > and we don't do silly buggers for them either.
> > >
> >
> > Sure, printk_deferred is not ideal, but is getting this message in the right
> > order worth locking up people's machines? Not sure you get the message at
> > all when that happens. I have to dig the code location out of the crash
> > dump to find which sched warning fired and took down the (usually virtual)
> > machine.
>
> Same thing with WARN(), we don't have a silly bugger version of that
> either. Just use a sane printk() / console or whatever.
>
> Virt stuff has perfectly functional serial consoles that works just fine
> and don't lock up the machine -- mostly. Use my early_printk hacks if
> you want something reliable:
>
> https://git.kernel.org/pub/scm/linux/kernel/git/peterz/queue.git/log/?h=debug/experimental
>
> Boot with: "earlyprintk=serial,ttyS0,115200 force_early_printk". And all
> will be well.
>
> The fact that crashdump is more reliable than printk is a *BIG* problem
> and the only solution is fixing printk() (people are sorta working on
> that). We should not try and work around this problem.
>
> I fundamentally despise the delayed stuff, I've had countless insteances
> where delaying output means you have no output because the machine is
> dead.

I see, thanks for this information.

thanks,
Chenyu

2023-10-11 10:31:53

by Chen Yu

[permalink] [raw]
Subject: Re: [PATCH] sched/fair: Use printk_deferred instead of printk in pick_eevdf()

On 2023-10-10 at 08:26:00 -0400, Phil Auld wrote:
> On Tue, Oct 10, 2023 at 09:59:28AM +0200 Peter Zijlstra wrote:
> > On Tue, Oct 10, 2023 at 11:25:41AM +0800, Chen Yu wrote:
> > > When no eligible entity is found in pick_eevdf(), it has to pick
> > > the entity with smallest vruntime. This indicates a potential issue
> > > and scheduler will print this error.
> > >
> > > However this printk could introduce possible circular locking issue
> > > because when the code path reaches here with the rq lock held, the
> > > printk could trigger further scheduling which loops back to the
> > > scheduler.
> > >
> > > Use printk_deferred() to defer the console write from current context
> > > to the irq work in the next tick.
>
> Chen: I was not actually suggesting you make this change, just answering your
> question about printk/rq lock. You don't need to put that line in there.
>

Phil,

Sorry for misunderstanding that, and thanks again for your guidance.

thanks,
Chenyu