* [PATCH v2] sched: pick_next_rt_entity(): checked list_entry
@ 2023-01-31 13:01 Pietro Borrello
2023-02-06 16:23 ` Steven Rostedt
0 siblings, 1 reply; 4+ messages in thread
From: Pietro Borrello @ 2023-01-31 13:01 UTC (permalink / raw)
To: Ingo Molnar, Peter Zijlstra, Juri Lelli, Vincent Guittot,
Dietmar Eggemann, Steven Rostedt, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira, Valentin Schneider, Dmitry Adamushko
Cc: Cristiano Giuffrida, Bos, H.J.,
Jakob Koschel, Ingo Molnar, linux-kernel, Pietro Borrello
Commit 326587b84078 ("sched: fix goto retry in pick_next_task_rt()")
removed any path which could make pick_next_rt_entity() return NULL.
However, BUG_ON(!rt_se) in _pick_next_task_rt() (the only caller of
pick_next_rt_entity()) still checks the error condition, which can
never happen, since list_entry() never returns NULL.
Remove the BUG_ON check, and instead emit a warning in the only
possible error condition here: the queue being empty which should
never happen.
Fixes: 326587b84078 ("sched: fix goto retry in pick_next_task_rt()")
Signed-off-by: Pietro Borrello <borrello@diag.uniroma1.it>
---
Changes in v2:
- pick_next_rt_entity(): emit warning instead of crashing
- Link to v1: https://lore.kernel.org/r/20230128-list-entry-null-check-sched-v1-1-c93085ee0055@diag.uniroma1.it
---
kernel/sched/rt.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index ed2a47e4ddae..c024529d8416 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -1777,6 +1777,7 @@ static struct sched_rt_entity *pick_next_rt_entity(struct rt_rq *rt_rq)
BUG_ON(idx >= MAX_RT_PRIO);
queue = array->queue + idx;
+ SCHED_WARN_ON(list_empty(queue));
next = list_entry(queue->next, struct sched_rt_entity, run_list);
return next;
@@ -1789,7 +1790,6 @@ static struct task_struct *_pick_next_task_rt(struct rq *rq)
do {
rt_se = pick_next_rt_entity(rt_rq);
- BUG_ON(!rt_se);
rt_rq = group_rt_rq(rt_se);
} while (rt_rq);
---
base-commit: 2241ab53cbb5cdb08a6b2d4688feb13971058f65
change-id: 20230128-list-entry-null-check-sched-a3f3dfd6d468
Best regards,
--
Pietro Borrello <borrello@diag.uniroma1.it>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2] sched: pick_next_rt_entity(): checked list_entry
2023-01-31 13:01 [PATCH v2] sched: pick_next_rt_entity(): checked list_entry Pietro Borrello
@ 2023-02-06 16:23 ` Steven Rostedt
2023-02-06 16:57 ` Phil Auld
0 siblings, 1 reply; 4+ messages in thread
From: Steven Rostedt @ 2023-02-06 16:23 UTC (permalink / raw)
To: Pietro Borrello
Cc: Ingo Molnar, Peter Zijlstra, Juri Lelli, Vincent Guittot,
Dietmar Eggemann, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira, Valentin Schneider, Dmitry Adamushko,
Cristiano Giuffrida, Bos, H.J.,
Jakob Koschel, Ingo Molnar, linux-kernel
On Tue, 31 Jan 2023 13:01:16 +0000
Pietro Borrello <borrello@diag.uniroma1.it> wrote:
> index ed2a47e4ddae..c024529d8416 100644
> --- a/kernel/sched/rt.c
> +++ b/kernel/sched/rt.c
> @@ -1777,6 +1777,7 @@ static struct sched_rt_entity *pick_next_rt_entity(struct rt_rq *rt_rq)
> BUG_ON(idx >= MAX_RT_PRIO);
>
> queue = array->queue + idx;
> + SCHED_WARN_ON(list_empty(queue));
I wonder if we should make this:
if (SCHED_WARN_ON(list_empty(queue)))
return NULL;
> next = list_entry(queue->next, struct sched_rt_entity, run_list);
>
> return next;
> @@ -1789,7 +1790,6 @@ static struct task_struct *_pick_next_task_rt(struct rq *rq)
>
> do {
> rt_se = pick_next_rt_entity(rt_rq);
> - BUG_ON(!rt_se);
if (unlikely(!rt_se))
return NULL;
-- Steve
> rt_rq = group_rt_rq(rt_se);
> } while (rt_rq);
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2] sched: pick_next_rt_entity(): checked list_entry
2023-02-06 16:23 ` Steven Rostedt
@ 2023-02-06 16:57 ` Phil Auld
2023-02-06 22:38 ` Pietro Borrello
0 siblings, 1 reply; 4+ messages in thread
From: Phil Auld @ 2023-02-06 16:57 UTC (permalink / raw)
To: Steven Rostedt
Cc: Pietro Borrello, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira, Valentin Schneider, Dmitry Adamushko,
Cristiano Giuffrida, Bos, H.J.,
Jakob Koschel, Ingo Molnar, linux-kernel
On Mon, Feb 06, 2023 at 11:23:42AM -0500 Steven Rostedt wrote:
> On Tue, 31 Jan 2023 13:01:16 +0000
> Pietro Borrello <borrello@diag.uniroma1.it> wrote:
>
> > index ed2a47e4ddae..c024529d8416 100644
> > --- a/kernel/sched/rt.c
> > +++ b/kernel/sched/rt.c
> > @@ -1777,6 +1777,7 @@ static struct sched_rt_entity *pick_next_rt_entity(struct rt_rq *rt_rq)
> > BUG_ON(idx >= MAX_RT_PRIO);
> >
> > queue = array->queue + idx;
> > + SCHED_WARN_ON(list_empty(queue));
>
> I wonder if we should make this:
>
> if (SCHED_WARN_ON(list_empty(queue)))
> return NULL;
>
> > next = list_entry(queue->next, struct sched_rt_entity, run_list);
> >
> > return next;
> > @@ -1789,7 +1790,6 @@ static struct task_struct *_pick_next_task_rt(struct rq *rq)
> >
> > do {
> > rt_se = pick_next_rt_entity(rt_rq);
> > - BUG_ON(!rt_se);
>
> if (unlikely(!rt_se))
> return NULL;
I think that's better than taking a digger in one of the subsequent macros.
Cheers,
Phil
>
> -- Steve
>
> > rt_rq = group_rt_rq(rt_se);
> > } while (rt_rq);
> >
>
--
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2] sched: pick_next_rt_entity(): checked list_entry
2023-02-06 16:57 ` Phil Auld
@ 2023-02-06 22:38 ` Pietro Borrello
0 siblings, 0 replies; 4+ messages in thread
From: Pietro Borrello @ 2023-02-06 22:38 UTC (permalink / raw)
To: Phil Auld
Cc: Steven Rostedt, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira, Valentin Schneider, Dmitry Adamushko,
Cristiano Giuffrida, Bos, H.J.,
Jakob Koschel, Ingo Molnar, linux-kernel
On Mon, 6 Feb 2023 at 17:57, Phil Auld <pauld@redhat.com> wrote:
>
> On Mon, Feb 06, 2023 at 11:23:42AM -0500 Steven Rostedt wrote:
> > On Tue, 31 Jan 2023 13:01:16 +0000
> > Pietro Borrello <borrello@diag.uniroma1.it> wrote:
> >
> > > index ed2a47e4ddae..c024529d8416 100644
> > > --- a/kernel/sched/rt.c
> > > +++ b/kernel/sched/rt.c
> > > @@ -1777,6 +1777,7 @@ static struct sched_rt_entity *pick_next_rt_entity(struct rt_rq *rt_rq)
> > > BUG_ON(idx >= MAX_RT_PRIO);
> > >
> > > queue = array->queue + idx;
> > > + SCHED_WARN_ON(list_empty(queue));
> >
> > I wonder if we should make this:
> >
> > if (SCHED_WARN_ON(list_empty(queue)))
> > return NULL;
> >
> > > next = list_entry(queue->next, struct sched_rt_entity, run_list);
> > >
> > > return next;
> > > @@ -1789,7 +1790,6 @@ static struct task_struct *_pick_next_task_rt(struct rq *rq)
> > >
> > > do {
> > > rt_se = pick_next_rt_entity(rt_rq);
> > > - BUG_ON(!rt_se);
> >
> > if (unlikely(!rt_se))
> > return NULL;
>
> I think that's better than taking a digger in one of the subsequent macros.
>
Thanks for the feedback.
Fixed in v3: https://lore.kernel.org/all/20230128-list-entry-null-check-sched-v3-1-b1a71bd1ac6b@diag.uniroma1.it/T/#u
Best regards,
Pietro
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-02-06 22:38 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-31 13:01 [PATCH v2] sched: pick_next_rt_entity(): checked list_entry Pietro Borrello
2023-02-06 16:23 ` Steven Rostedt
2023-02-06 16:57 ` Phil Auld
2023-02-06 22:38 ` Pietro Borrello
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®