According to the comments, we need to test if this is
the first throttled task, however, list_empty() tests on
the entry cfs_rq->throttled_list, not the head, this is wrong.
This is a bug because we don't re-init the list entry after
removing it from the list, so list_empty() could return false
even if the list is really empty.
Cc: Ingo Molnar <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Signed-off-by: Cong Wang <[email protected]>
Signed-off-by: Cong Wang <[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 40a7fcb..ee91917 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -3683,7 +3683,7 @@ static void throttle_cfs_rq(struct cfs_rq *cfs_rq)
cfs_rq->throttled = 1;
cfs_rq->throttled_clock = rq_clock(rq);
raw_spin_lock(&cfs_b->lock);
- empty = list_empty(&cfs_rq->throttled_list);
+ empty = list_empty(&cfs_b->throttled_cfs_rq);
/*
* Add to the _head_ of the list, so that an already-started
--
1.8.3.1
Cong Wang <[email protected]> writes:
> According to the comments, we need to test if this is
> the first throttled task, however, list_empty() tests on
> the entry cfs_rq->throttled_list, not the head, this is wrong.
>
> This is a bug because we don't re-init the list entry after
> removing it from the list, so list_empty() could return false
> even if the list is really empty.
>
> Cc: Ingo Molnar <[email protected]>
> Cc: Peter Zijlstra <[email protected]>
> Signed-off-by: Cong Wang <[email protected]>
> Signed-off-by: Cong Wang <[email protected]>
Agreed.
Reviewed-by: Ben Segall <[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 40a7fcb..ee91917 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -3683,7 +3683,7 @@ static void throttle_cfs_rq(struct cfs_rq *cfs_rq)
> cfs_rq->throttled = 1;
> cfs_rq->throttled_clock = rq_clock(rq);
> raw_spin_lock(&cfs_b->lock);
> - empty = list_empty(&cfs_rq->throttled_list);
> + empty = list_empty(&cfs_b->throttled_cfs_rq);
>
> /*
> * Add to the _head_ of the list, so that an already-started
On Wed, Jun 24, 2015 at 12:41 PM, Cong Wang <[email protected]> wrote:
> According to the comments, we need to test if this is
> the first throttled task, however, list_empty() tests on
> the entry cfs_rq->throttled_list, not the head, this is wrong.
>
> This is a bug because we don't re-init the list entry after
> removing it from the list, so list_empty() could return false
> even if the list is really empty.
>
> Cc: Ingo Molnar <[email protected]>
> Cc: Peter Zijlstra <[email protected]>
> Signed-off-by: Cong Wang <[email protected]>
> Signed-off-by: Cong Wang <[email protected]>
ping.
What's the status of this patch?
On Fri, Jul 03, 2015 at 09:09:12AM -0700, Cong Wang wrote:
> On Wed, Jun 24, 2015 at 12:41 PM, Cong Wang <[email protected]> wrote:
> > According to the comments, we need to test if this is
> > the first throttled task, however, list_empty() tests on
> > the entry cfs_rq->throttled_list, not the head, this is wrong.
> >
> > This is a bug because we don't re-init the list entry after
> > removing it from the list, so list_empty() could return false
> > even if the list is really empty.
> >
> > Cc: Ingo Molnar <[email protected]>
> > Cc: Peter Zijlstra <[email protected]>
> > Signed-off-by: Cong Wang <[email protected]>
> > Signed-off-by: Cong Wang <[email protected]>
>
> ping.
>
> What's the status of this patch?
Queued, will likely hit tip after the merge window etc has settled.
On Fri, Jul 3, 2015 at 9:10 AM, Peter Zijlstra <[email protected]> wrote:
>
> Queued, will likely hit tip after the merge window etc has settled.
Great.
Thanks!
Commit-ID: d49db342f0e276b354383b3281c5668b6b80f5c2
Gitweb: http://git.kernel.org/tip/d49db342f0e276b354383b3281c5668b6b80f5c2
Author: Cong Wang <[email protected]>
AuthorDate: Wed, 24 Jun 2015 12:41:47 -0700
Committer: Ingo Molnar <[email protected]>
CommitDate: Mon, 6 Jul 2015 14:15:08 +0200
sched/fair: Test list head instead of list entry in throttle_cfs_rq()
According to the comments, we need to test if this is
the first throttled task, however, list_empty() tests on
the entry cfs_rq->throttled_list, not the head, this is wrong.
This is a bug because we don't re-init the list entry after
removing it from the list, so list_empty() could return false
even if the list is really empty.
Signed-off-by: Cong Wang <[email protected]>
Signed-off-by: Cong Wang <[email protected]>
Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
Reviewed-by: Ben Segall <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[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 65c8f3e..d113c3b 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -3683,7 +3683,7 @@ static void throttle_cfs_rq(struct cfs_rq *cfs_rq)
cfs_rq->throttled = 1;
cfs_rq->throttled_clock = rq_clock(rq);
raw_spin_lock(&cfs_b->lock);
- empty = list_empty(&cfs_rq->throttled_list);
+ empty = list_empty(&cfs_b->throttled_cfs_rq);
/*
* Add to the _head_ of the list, so that an already-started