Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1440314 > unrolled thread
| Started by | Wanpeng Li <kernellwp@gmail.com> |
|---|---|
| First post | 2016-07-11 09:30 +0200 |
| Last post | 2016-07-15 01:10 +0200 |
| Articles | 17 — 4 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair Wanpeng Li <kernellwp@gmail.com> - 2016-07-11 09:30 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair Konstantin Khlebnikov <khlebnikov@yandex-team.ru> - 2016-07-11 10:20 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair Xunlei Pang <xpang@redhat.com> - 2016-07-11 10:30 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair Xunlei Pang <xpang@redhat.com> - 2016-07-11 10:50 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair Wanpeng Li <kernellwp@gmail.com> - 2016-07-11 12:00 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair Xunlei Pang <xpang@redhat.com> - 2016-07-11 14:20 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair Konstantin Khlebnikov <khlebnikov@yandex-team.ru> - 2016-07-11 14:30 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair bsegall@google.com - 2016-07-12 19:30 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair Wanpeng Li <kernellwp@gmail.com> - 2016-07-13 04:00 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair Xunlei Pang <xpang@redhat.com> - 2016-07-13 04:10 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair Wanpeng Li <kernellwp@gmail.com> - 2016-07-13 04:20 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair bsegall@google.com - 2016-07-13 19:10 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair Wanpeng Li <kernellwp@gmail.com> - 2016-07-14 14:20 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair bsegall@google.com - 2016-07-14 20:00 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair Wanpeng Li <kernellwp@gmail.com> - 2016-07-15 00:40 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair bsegall@google.com - 2016-07-15 00:50 +0200
Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair Wanpeng Li <kernellwp@gmail.com> - 2016-07-15 01:10 +0200
| From | Wanpeng Li <kernellwp@gmail.com> |
|---|---|
| Date | 2016-07-11 09:30 +0200 |
| Subject | Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair |
| Message-ID | <rTDPb-3Uh-11@gated-at.bofh.it> |
2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>: > Hierarchy could be already throttled at this point. Throttled next > buddy could trigger null pointer dereference in pick_next_task_fair(). There is cfs_rq->next check in pick_next_entity(), so how can null pointer dereference happen? Regards, Wanpeng Li
[toc] | [next] | [standalone]
| From | Konstantin Khlebnikov <khlebnikov@yandex-team.ru> |
|---|---|
| Date | 2016-07-11 10:20 +0200 |
| Subject | Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair |
| Message-ID | <rTEBz-4qX-11@gated-at.bofh.it> |
| In reply to | #1440314 |
On 11.07.2016 10:25, Wanpeng Li wrote: > 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>: >> Hierarchy could be already throttled at this point. Throttled next >> buddy could trigger null pointer dereference in pick_next_task_fair(). > > There is cfs_rq->next check in pick_next_entity(), so how can null > pointer dereference happen? > If we nominate task from throttled hiearchy as a next buddy then at some level in pick_next_task_fair we could pick cfs_rq which has no runnable entities - in pick_next_entiry both "curr" and "left" are NULL. -- Konstantin
[toc] | [prev] | [next] | [standalone]
| From | Xunlei Pang <xpang@redhat.com> |
|---|---|
| Date | 2016-07-11 10:30 +0200 |
| Subject | Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair |
| Message-ID | <rTELf-4vb-7@gated-at.bofh.it> |
| In reply to | #1440314 |
On 2016/07/11 at 15:25, Wanpeng Li wrote:
> 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>:
>> Hierarchy could be already throttled at this point. Throttled next
>> buddy could trigger null pointer dereference in pick_next_task_fair().
> There is cfs_rq->next check in pick_next_entity(), so how can null
> pointer dereference happen?
I guess it's the following code leading to a NULL se returned:
pick_next_entity():
if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1)
se = cfs_rq->next;
Regards,
Xunlei
> Regards,
> Wanpeng Li
[toc] | [prev] | [next] | [standalone]
| From | Xunlei Pang <xpang@redhat.com> |
|---|---|
| Date | 2016-07-11 10:50 +0200 |
| Subject | Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair |
| Message-ID | <rTF4C-4Da-27@gated-at.bofh.it> |
| In reply to | #1440353 |
On 2016/07/11 at 16:22, Xunlei Pang wrote: > On 2016/07/11 at 15:25, Wanpeng Li wrote: >> 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>: >>> Hierarchy could be already throttled at this point. Throttled next >>> buddy could trigger null pointer dereference in pick_next_task_fair(). >> There is cfs_rq->next check in pick_next_entity(), so how can null >> pointer dereference happen? > I guess it's the following code leading to a NULL se returned: s/NULL/empty-entity cfs_rq se/ > pick_next_entity(): > if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1) > se = cfs_rq->next; > > Regards, > Xunlei > >> Regards, >> Wanpeng Li
[toc] | [prev] | [next] | [standalone]
| From | Wanpeng Li <kernellwp@gmail.com> |
|---|---|
| Date | 2016-07-11 12:00 +0200 |
| Message-ID | <rTGan-5j1-47@gated-at.bofh.it> |
| In reply to | #1440370 |
Hi Konstantin, Xunlei,
2016-07-11 16:42 GMT+08:00 Xunlei Pang <xpang@redhat.com>:
> On 2016/07/11 at 16:22, Xunlei Pang wrote:
>> On 2016/07/11 at 15:25, Wanpeng Li wrote:
>>> 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>:
>>>> Hierarchy could be already throttled at this point. Throttled next
>>>> buddy could trigger null pointer dereference in pick_next_task_fair().
>>> There is cfs_rq->next check in pick_next_entity(), so how can null
>>> pointer dereference happen?
>> I guess it's the following code leading to a NULL se returned:
>
> s/NULL/empty-entity cfs_rq se/
>
>> pick_next_entity():
>> if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1)
^^^^^^^^^^^^^
I think this will return false.
Regards,
Wanpeng Li
[toc] | [prev] | [next] | [standalone]
| From | Xunlei Pang <xpang@redhat.com> |
|---|---|
| Date | 2016-07-11 14:20 +0200 |
| Subject | Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair |
| Message-ID | <rTIlQ-6Tf-1@gated-at.bofh.it> |
| In reply to | #1440406 |
On 2016/07/11 at 17:54, Wanpeng Li wrote:
> Hi Konstantin, Xunlei,
> 2016-07-11 16:42 GMT+08:00 Xunlei Pang <xpang@redhat.com>:
>> On 2016/07/11 at 16:22, Xunlei Pang wrote:
>>> On 2016/07/11 at 15:25, Wanpeng Li wrote:
>>>> 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>:
>>>>> Hierarchy could be already throttled at this point. Throttled next
>>>>> buddy could trigger null pointer dereference in pick_next_task_fair().
>>>> There is cfs_rq->next check in pick_next_entity(), so how can null
>>>> pointer dereference happen?
>>> I guess it's the following code leading to a NULL se returned:
>> s/NULL/empty-entity cfs_rq se/
>>
>>> pick_next_entity():
>>> if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1)
> ^^^^^^^^^^^^^
> I think this will return false.
With the wrong throttled_hierarchy(), I think this can happen. But after we have the
corrected throttled_hierarchy() patch, I can't see how it is possible.
dequeue_task_fair():
if (task_sleep && parent_entity(se))
set_next_buddy(parent_entity(se));
How does dequeue_task_fair() with DEQUEUE_SLEEP set(true task_sleep) happen to a throttled hierarchy?
IOW, a task belongs to a throttled hierarchy is running?
Maybe Konstantin knows the reason.
Regards,
Xunlei
[toc] | [prev] | [next] | [standalone]
| From | Konstantin Khlebnikov <khlebnikov@yandex-team.ru> |
|---|---|
| Date | 2016-07-11 14:30 +0200 |
| Subject | Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair |
| Message-ID | <rTIvv-6WO-15@gated-at.bofh.it> |
| In reply to | #1440518 |
On 11.07.2016 15:12, Xunlei Pang wrote: > On 2016/07/11 at 17:54, Wanpeng Li wrote: >> Hi Konstantin, Xunlei, >> 2016-07-11 16:42 GMT+08:00 Xunlei Pang <xpang@redhat.com>: >>> On 2016/07/11 at 16:22, Xunlei Pang wrote: >>>> On 2016/07/11 at 15:25, Wanpeng Li wrote: >>>>> 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>: >>>>>> Hierarchy could be already throttled at this point. Throttled next >>>>>> buddy could trigger null pointer dereference in pick_next_task_fair(). >>>>> There is cfs_rq->next check in pick_next_entity(), so how can null >>>>> pointer dereference happen? >>>> I guess it's the following code leading to a NULL se returned: >>> s/NULL/empty-entity cfs_rq se/ >>> >>>> pick_next_entity(): >>>> if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1) >> ^^^^^^^^^^^^^ >> I think this will return false. > > With the wrong throttled_hierarchy(), I think this can happen. But after we have the > corrected throttled_hierarchy() patch, I can't see how it is possible. > > dequeue_task_fair(): > if (task_sleep && parent_entity(se)) > set_next_buddy(parent_entity(se)); > > How does dequeue_task_fair() with DEQUEUE_SLEEP set(true task_sleep) happen to a throttled hierarchy? > IOW, a task belongs to a throttled hierarchy is running? > > Maybe Konstantin knows the reason. This function (dequeue_task_fair) check throttling but at point it could skip several levels and announce as next buddy actually throttled entry. Probably this bug hadn't happened but this's really hard to prove that this is impossible. ->set_curr_task(), PI-boost or some tricky migration in balancer could break this easily. -- Konstantin
[toc] | [prev] | [next] | [standalone]
| From | bsegall@google.com |
|---|---|
| Date | 2016-07-12 19:30 +0200 |
| Message-ID | <rU9Fn-80P-23@gated-at.bofh.it> |
| In reply to | #1440523 |
Konstantin Khlebnikov <khlebnikov@yandex-team.ru> writes: > On 11.07.2016 15:12, Xunlei Pang wrote: >> On 2016/07/11 at 17:54, Wanpeng Li wrote: >>> Hi Konstantin, Xunlei, >>> 2016-07-11 16:42 GMT+08:00 Xunlei Pang <xpang@redhat.com>: >>>> On 2016/07/11 at 16:22, Xunlei Pang wrote: >>>>> On 2016/07/11 at 15:25, Wanpeng Li wrote: >>>>>> 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>: >>>>>>> Hierarchy could be already throttled at this point. Throttled next >>>>>>> buddy could trigger null pointer dereference in pick_next_task_fair(). >>>>>> There is cfs_rq->next check in pick_next_entity(), so how can null >>>>>> pointer dereference happen? >>>>> I guess it's the following code leading to a NULL se returned: >>>> s/NULL/empty-entity cfs_rq se/ >>>> >>>>> pick_next_entity(): >>>>> if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1) >>> ^^^^^^^^^^^^^ >>> I think this will return false. >> >> With the wrong throttled_hierarchy(), I think this can happen. But after we have the >> corrected throttled_hierarchy() patch, I can't see how it is possible. >> >> dequeue_task_fair(): >> if (task_sleep && parent_entity(se)) >> set_next_buddy(parent_entity(se)); >> >> How does dequeue_task_fair() with DEQUEUE_SLEEP set(true task_sleep) happen to a throttled hierarchy? >> IOW, a task belongs to a throttled hierarchy is running? >> >> Maybe Konstantin knows the reason. > > This function (dequeue_task_fair) check throttling but at point it could skip several > levels and announce as next buddy actually throttled entry. > Probably this bug hadn't happened but this's really hard to prove that this is impossible. > ->set_curr_task(), PI-boost or some tricky migration in balancer could break this easily. sched_setscheduler can call put_prev_task, which then can cause a throttle outside of __schedule(), then the task blocks normally and deactivate_task(DEQUEUE_SLEEP) happens and you lose. The obvious way to avoid these would be to somehow change put_prev so that it only does throttles in the schedule() path (which is what we /want/), which would probably involve adding a parameter to put_prev for just this.
[toc] | [prev] | [next] | [standalone]
| From | Wanpeng Li <kernellwp@gmail.com> |
|---|---|
| Date | 2016-07-13 04:00 +0200 |
| Message-ID | <rUhCV-4Fk-9@gated-at.bofh.it> |
| In reply to | #1441613 |
2016-07-13 1:25 GMT+08:00 <bsegall@google.com>: > Konstantin Khlebnikov <khlebnikov@yandex-team.ru> writes: > >> On 11.07.2016 15:12, Xunlei Pang wrote: >>> On 2016/07/11 at 17:54, Wanpeng Li wrote: >>>> Hi Konstantin, Xunlei, >>>> 2016-07-11 16:42 GMT+08:00 Xunlei Pang <xpang@redhat.com>: >>>>> On 2016/07/11 at 16:22, Xunlei Pang wrote: >>>>>> On 2016/07/11 at 15:25, Wanpeng Li wrote: >>>>>>> 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>: >>>>>>>> Hierarchy could be already throttled at this point. Throttled next >>>>>>>> buddy could trigger null pointer dereference in pick_next_task_fair(). >>>>>>> There is cfs_rq->next check in pick_next_entity(), so how can null >>>>>>> pointer dereference happen? >>>>>> I guess it's the following code leading to a NULL se returned: >>>>> s/NULL/empty-entity cfs_rq se/ >>>>> >>>>>> pick_next_entity(): >>>>>> if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1) >>>> ^^^^^^^^^^^^^ >>>> I think this will return false. >>> >>> With the wrong throttled_hierarchy(), I think this can happen. But after we have the >>> corrected throttled_hierarchy() patch, I can't see how it is possible. >>> >>> dequeue_task_fair(): >>> if (task_sleep && parent_entity(se)) >>> set_next_buddy(parent_entity(se)); >>> >>> How does dequeue_task_fair() with DEQUEUE_SLEEP set(true task_sleep) happen to a throttled hierarchy? >>> IOW, a task belongs to a throttled hierarchy is running? >>> >>> Maybe Konstantin knows the reason. >> >> This function (dequeue_task_fair) check throttling but at point it could skip several >> levels and announce as next buddy actually throttled entry. >> Probably this bug hadn't happened but this's really hard to prove that this is impossible. >> ->set_curr_task(), PI-boost or some tricky migration in balancer could break this easily. > > sched_setscheduler can call put_prev_task, which then can cause a > throttle outside of __schedule(), then the task blocks normally and > deactivate_task(DEQUEUE_SLEEP) happens and you lose. The cfs_rq_throttled() check in dequeue_task_fair() will capture the cfs_rq which is throttled in sched_setscheduler::put_prev_task path, so nothing lost, where I miss? Regards, Wanpeng Li
[toc] | [prev] | [next] | [standalone]
| From | Xunlei Pang <xpang@redhat.com> |
|---|---|
| Date | 2016-07-13 04:10 +0200 |
| Subject | Re: [PATCH] sched/fair: do not announce throttled next buddy in dequeue_task_fair |
| Message-ID | <rUhMB-4Y0-17@gated-at.bofh.it> |
| In reply to | #1441954 |
On 2016/07/13 at 09:50, Wanpeng Li wrote: > 2016-07-13 1:25 GMT+08:00 <bsegall@google.com>: >> Konstantin Khlebnikov <khlebnikov@yandex-team.ru> writes: >> >>> On 11.07.2016 15:12, Xunlei Pang wrote: >>>> On 2016/07/11 at 17:54, Wanpeng Li wrote: >>>>> Hi Konstantin, Xunlei, >>>>> 2016-07-11 16:42 GMT+08:00 Xunlei Pang <xpang@redhat.com>: >>>>>> On 2016/07/11 at 16:22, Xunlei Pang wrote: >>>>>>> On 2016/07/11 at 15:25, Wanpeng Li wrote: >>>>>>>> 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>: >>>>>>>>> Hierarchy could be already throttled at this point. Throttled next >>>>>>>>> buddy could trigger null pointer dereference in pick_next_task_fair(). >>>>>>>> There is cfs_rq->next check in pick_next_entity(), so how can null >>>>>>>> pointer dereference happen? >>>>>>> I guess it's the following code leading to a NULL se returned: >>>>>> s/NULL/empty-entity cfs_rq se/ >>>>>> >>>>>>> pick_next_entity(): >>>>>>> if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1) >>>>> ^^^^^^^^^^^^^ >>>>> I think this will return false. >>>> With the wrong throttled_hierarchy(), I think this can happen. But after we have the >>>> corrected throttled_hierarchy() patch, I can't see how it is possible. >>>> >>>> dequeue_task_fair(): >>>> if (task_sleep && parent_entity(se)) >>>> set_next_buddy(parent_entity(se)); >>>> >>>> How does dequeue_task_fair() with DEQUEUE_SLEEP set(true task_sleep) happen to a throttled hierarchy? >>>> IOW, a task belongs to a throttled hierarchy is running? >>>> >>>> Maybe Konstantin knows the reason. >>> This function (dequeue_task_fair) check throttling but at point it could skip several >>> levels and announce as next buddy actually throttled entry. >>> Probably this bug hadn't happened but this's really hard to prove that this is impossible. >>> ->set_curr_task(), PI-boost or some tricky migration in balancer could break this easily. >> sched_setscheduler can call put_prev_task, which then can cause a >> throttle outside of __schedule(), then the task blocks normally and >> deactivate_task(DEQUEUE_SLEEP) happens and you lose. > The cfs_rq_throttled() check in dequeue_task_fair() will capture the > cfs_rq which is throttled in sched_setscheduler::put_prev_task path, > so nothing lost, where I miss? cfs_rq_throttled() returns false for child cgroups in the throttled hierarchy, so throttled_hierarchy() should be relied on in such cases. Regards, Xunlei
[toc] | [prev] | [next] | [standalone]
| From | Wanpeng Li <kernellwp@gmail.com> |
|---|---|
| Date | 2016-07-13 04:20 +0200 |
| Message-ID | <rUhWh-57D-3@gated-at.bofh.it> |
| In reply to | #1441964 |
2016-07-13 9:58 GMT+08:00 Xunlei Pang <xpang@redhat.com>: > On 2016/07/13 at 09:50, Wanpeng Li wrote: >> 2016-07-13 1:25 GMT+08:00 <bsegall@google.com>: >>> Konstantin Khlebnikov <khlebnikov@yandex-team.ru> writes: >>> >>>> On 11.07.2016 15:12, Xunlei Pang wrote: >>>>> On 2016/07/11 at 17:54, Wanpeng Li wrote: >>>>>> Hi Konstantin, Xunlei, >>>>>> 2016-07-11 16:42 GMT+08:00 Xunlei Pang <xpang@redhat.com>: >>>>>>> On 2016/07/11 at 16:22, Xunlei Pang wrote: >>>>>>>> On 2016/07/11 at 15:25, Wanpeng Li wrote: >>>>>>>>> 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>: >>>>>>>>>> Hierarchy could be already throttled at this point. Throttled next >>>>>>>>>> buddy could trigger null pointer dereference in pick_next_task_fair(). >>>>>>>>> There is cfs_rq->next check in pick_next_entity(), so how can null >>>>>>>>> pointer dereference happen? >>>>>>>> I guess it's the following code leading to a NULL se returned: >>>>>>> s/NULL/empty-entity cfs_rq se/ >>>>>>> >>>>>>>> pick_next_entity(): >>>>>>>> if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1) >>>>>> ^^^^^^^^^^^^^ >>>>>> I think this will return false. >>>>> With the wrong throttled_hierarchy(), I think this can happen. But after we have the >>>>> corrected throttled_hierarchy() patch, I can't see how it is possible. >>>>> >>>>> dequeue_task_fair(): >>>>> if (task_sleep && parent_entity(se)) >>>>> set_next_buddy(parent_entity(se)); >>>>> >>>>> How does dequeue_task_fair() with DEQUEUE_SLEEP set(true task_sleep) happen to a throttled hierarchy? >>>>> IOW, a task belongs to a throttled hierarchy is running? >>>>> >>>>> Maybe Konstantin knows the reason. >>>> This function (dequeue_task_fair) check throttling but at point it could skip several >>>> levels and announce as next buddy actually throttled entry. >>>> Probably this bug hadn't happened but this's really hard to prove that this is impossible. >>>> ->set_curr_task(), PI-boost or some tricky migration in balancer could break this easily. >>> sched_setscheduler can call put_prev_task, which then can cause a >>> throttle outside of __schedule(), then the task blocks normally and >>> deactivate_task(DEQUEUE_SLEEP) happens and you lose. >> The cfs_rq_throttled() check in dequeue_task_fair() will capture the >> cfs_rq which is throttled in sched_setscheduler::put_prev_task path, >> so nothing lost, where I miss? > > cfs_rq_throttled() returns false for child cgroups in the throttled hierarchy, so > throttled_hierarchy() should be relied on in such cases. Yes, so what's lost in bsegall's reply? Regards, Wanpeng Li
[toc] | [prev] | [next] | [standalone]
| From | bsegall@google.com |
|---|---|
| Date | 2016-07-13 19:10 +0200 |
| Message-ID | <rUvPA-5Zr-33@gated-at.bofh.it> |
| In reply to | #1441954 |
Wanpeng Li <kernellwp@gmail.com> writes: > 2016-07-13 1:25 GMT+08:00 <bsegall@google.com>: >> Konstantin Khlebnikov <khlebnikov@yandex-team.ru> writes: >> >>> On 11.07.2016 15:12, Xunlei Pang wrote: >>>> On 2016/07/11 at 17:54, Wanpeng Li wrote: >>>>> Hi Konstantin, Xunlei, >>>>> 2016-07-11 16:42 GMT+08:00 Xunlei Pang <xpang@redhat.com>: >>>>>> On 2016/07/11 at 16:22, Xunlei Pang wrote: >>>>>>> On 2016/07/11 at 15:25, Wanpeng Li wrote: >>>>>>>> 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>: >>>>>>>>> Hierarchy could be already throttled at this point. Throttled next >>>>>>>>> buddy could trigger null pointer dereference in pick_next_task_fair(). >>>>>>>> There is cfs_rq->next check in pick_next_entity(), so how can null >>>>>>>> pointer dereference happen? >>>>>>> I guess it's the following code leading to a NULL se returned: >>>>>> s/NULL/empty-entity cfs_rq se/ >>>>>> >>>>>>> pick_next_entity(): >>>>>>> if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1) >>>>> ^^^^^^^^^^^^^ >>>>> I think this will return false. >>>> >>>> With the wrong throttled_hierarchy(), I think this can happen. But after we have the >>>> corrected throttled_hierarchy() patch, I can't see how it is possible. >>>> >>>> dequeue_task_fair(): >>>> if (task_sleep && parent_entity(se)) >>>> set_next_buddy(parent_entity(se)); >>>> >>>> How does dequeue_task_fair() with DEQUEUE_SLEEP set(true task_sleep) happen to a throttled hierarchy? >>>> IOW, a task belongs to a throttled hierarchy is running? >>>> >>>> Maybe Konstantin knows the reason. >>> >>> This function (dequeue_task_fair) check throttling but at point it could skip several >>> levels and announce as next buddy actually throttled entry. >>> Probably this bug hadn't happened but this's really hard to prove that this is impossible. >>> ->set_curr_task(), PI-boost or some tricky migration in balancer could break this easily. >> >> sched_setscheduler can call put_prev_task, which then can cause a >> throttle outside of __schedule(), then the task blocks normally and >> deactivate_task(DEQUEUE_SLEEP) happens and you lose. > > The cfs_rq_throttled() check in dequeue_task_fair() will capture the > cfs_rq which is throttled in sched_setscheduler::put_prev_task path, > so nothing lost, where I miss? > > Regards, > Wanpeng Li The cfs_rq_throttled() checks there are done bottom-up, so they will trigger too late. a/b/t, where t is descheduling and a is throttled can still cause a set_next_buddy(b);
[toc] | [prev] | [next] | [standalone]
| From | Wanpeng Li <kernellwp@gmail.com> |
|---|---|
| Date | 2016-07-14 14:20 +0200 |
| Message-ID | <rUNMu-19G-27@gated-at.bofh.it> |
| In reply to | #1442639 |
2016-07-14 1:06 GMT+08:00 <bsegall@google.com>: > Wanpeng Li <kernellwp@gmail.com> writes: > >> 2016-07-13 1:25 GMT+08:00 <bsegall@google.com>: >>> Konstantin Khlebnikov <khlebnikov@yandex-team.ru> writes: >>> >>>> On 11.07.2016 15:12, Xunlei Pang wrote: >>>>> On 2016/07/11 at 17:54, Wanpeng Li wrote: >>>>>> Hi Konstantin, Xunlei, >>>>>> 2016-07-11 16:42 GMT+08:00 Xunlei Pang <xpang@redhat.com>: >>>>>>> On 2016/07/11 at 16:22, Xunlei Pang wrote: >>>>>>>> On 2016/07/11 at 15:25, Wanpeng Li wrote: >>>>>>>>> 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>: >>>>>>>>>> Hierarchy could be already throttled at this point. Throttled next >>>>>>>>>> buddy could trigger null pointer dereference in pick_next_task_fair(). >>>>>>>>> There is cfs_rq->next check in pick_next_entity(), so how can null >>>>>>>>> pointer dereference happen? >>>>>>>> I guess it's the following code leading to a NULL se returned: >>>>>>> s/NULL/empty-entity cfs_rq se/ >>>>>>> >>>>>>>> pick_next_entity(): >>>>>>>> if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1) >>>>>> ^^^^^^^^^^^^^ >>>>>> I think this will return false. >>>>> >>>>> With the wrong throttled_hierarchy(), I think this can happen. But after we have the >>>>> corrected throttled_hierarchy() patch, I can't see how it is possible. >>>>> >>>>> dequeue_task_fair(): >>>>> if (task_sleep && parent_entity(se)) >>>>> set_next_buddy(parent_entity(se)); >>>>> >>>>> How does dequeue_task_fair() with DEQUEUE_SLEEP set(true task_sleep) happen to a throttled hierarchy? >>>>> IOW, a task belongs to a throttled hierarchy is running? >>>>> >>>>> Maybe Konstantin knows the reason. >>>> >>>> This function (dequeue_task_fair) check throttling but at point it could skip several >>>> levels and announce as next buddy actually throttled entry. >>>> Probably this bug hadn't happened but this's really hard to prove that this is impossible. >>>> ->set_curr_task(), PI-boost or some tricky migration in balancer could break this easily. >>> >>> sched_setscheduler can call put_prev_task, which then can cause a >>> throttle outside of __schedule(), then the task blocks normally and >>> deactivate_task(DEQUEUE_SLEEP) happens and you lose. >> >> The cfs_rq_throttled() check in dequeue_task_fair() will capture the >> cfs_rq which is throttled in sched_setscheduler::put_prev_task path, >> so nothing lost, where I miss? >> >> Regards, >> Wanpeng Li > > The cfs_rq_throttled() checks there are done bottom-up, so they will > trigger too late. a/b/t, where t is descheduling and a is throttled can > still cause a set_next_buddy(b); throttle cfs_rq is up-bottom, so when a is throttled, b and c are not yet, then task_sleep && se && !throttled_hierarchy(cfs_rq) still can't prevent a set_next_buddy(b). Regards, Wanpeng Li
[toc] | [prev] | [next] | [standalone]
| From | bsegall@google.com |
|---|---|
| Date | 2016-07-14 20:00 +0200 |
| Message-ID | <rUT5w-4jD-13@gated-at.bofh.it> |
| In reply to | #1443402 |
Wanpeng Li <kernellwp@gmail.com> writes: > 2016-07-14 1:06 GMT+08:00 <bsegall@google.com>: >> Wanpeng Li <kernellwp@gmail.com> writes: >> >>> 2016-07-13 1:25 GMT+08:00 <bsegall@google.com>: >>>> Konstantin Khlebnikov <khlebnikov@yandex-team.ru> writes: >>>> >>>>> On 11.07.2016 15:12, Xunlei Pang wrote: >>>>>> On 2016/07/11 at 17:54, Wanpeng Li wrote: >>>>>>> Hi Konstantin, Xunlei, >>>>>>> 2016-07-11 16:42 GMT+08:00 Xunlei Pang <xpang@redhat.com>: >>>>>>>> On 2016/07/11 at 16:22, Xunlei Pang wrote: >>>>>>>>> On 2016/07/11 at 15:25, Wanpeng Li wrote: >>>>>>>>>> 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>: >>>>>>>>>>> Hierarchy could be already throttled at this point. Throttled next >>>>>>>>>>> buddy could trigger null pointer dereference in pick_next_task_fair(). >>>>>>>>>> There is cfs_rq->next check in pick_next_entity(), so how can null >>>>>>>>>> pointer dereference happen? >>>>>>>>> I guess it's the following code leading to a NULL se returned: >>>>>>>> s/NULL/empty-entity cfs_rq se/ >>>>>>>> >>>>>>>>> pick_next_entity(): >>>>>>>>> if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1) >>>>>>> ^^^^^^^^^^^^^ >>>>>>> I think this will return false. >>>>>> >>>>>> With the wrong throttled_hierarchy(), I think this can happen. But after we have the >>>>>> corrected throttled_hierarchy() patch, I can't see how it is possible. >>>>>> >>>>>> dequeue_task_fair(): >>>>>> if (task_sleep && parent_entity(se)) >>>>>> set_next_buddy(parent_entity(se)); >>>>>> >>>>>> How does dequeue_task_fair() with DEQUEUE_SLEEP set(true task_sleep) happen to a throttled hierarchy? >>>>>> IOW, a task belongs to a throttled hierarchy is running? >>>>>> >>>>>> Maybe Konstantin knows the reason. >>>>> >>>>> This function (dequeue_task_fair) check throttling but at point it could skip several >>>>> levels and announce as next buddy actually throttled entry. >>>>> Probably this bug hadn't happened but this's really hard to prove that this is impossible. >>>>> ->set_curr_task(), PI-boost or some tricky migration in balancer could break this easily. >>>> >>>> sched_setscheduler can call put_prev_task, which then can cause a >>>> throttle outside of __schedule(), then the task blocks normally and >>>> deactivate_task(DEQUEUE_SLEEP) happens and you lose. >>> >>> The cfs_rq_throttled() check in dequeue_task_fair() will capture the >>> cfs_rq which is throttled in sched_setscheduler::put_prev_task path, >>> so nothing lost, where I miss? >>> >>> Regards, >>> Wanpeng Li >> >> The cfs_rq_throttled() checks there are done bottom-up, so they will >> trigger too late. a/b/t, where t is descheduling and a is throttled can >> still cause a set_next_buddy(b); > > throttle cfs_rq is up-bottom, so when a is throttled, b and c are not > yet, then task_sleep && se && !throttled_hierarchy(cfs_rq) still can't > prevent a set_next_buddy(b). > > Regards, > Wanpeng Li They don't race or anything, everything's under rq->lock. throttled_hierarchy will register properly, the issue is that a parent is the one cfs_rq_throttled(), not the current cfs_rq, and set_next_buddy will set cfs_rq->next to an se that is !on_rq. In the other order (set_next_buddy then throttle), throttle_cfs_rq will call dequeue which will clear the problematic buddy.
[toc] | [prev] | [next] | [standalone]
| From | Wanpeng Li <kernellwp@gmail.com> |
|---|---|
| Date | 2016-07-15 00:40 +0200 |
| Message-ID | <rUXsu-79u-13@gated-at.bofh.it> |
| In reply to | #1443649 |
2016-07-15 1:54 GMT+08:00 <bsegall@google.com>: > Wanpeng Li <kernellwp@gmail.com> writes: > >> 2016-07-14 1:06 GMT+08:00 <bsegall@google.com>: >>> Wanpeng Li <kernellwp@gmail.com> writes: >>> >>>> 2016-07-13 1:25 GMT+08:00 <bsegall@google.com>: >>>>> Konstantin Khlebnikov <khlebnikov@yandex-team.ru> writes: >>>>> >>>>>> On 11.07.2016 15:12, Xunlei Pang wrote: >>>>>>> On 2016/07/11 at 17:54, Wanpeng Li wrote: >>>>>>>> Hi Konstantin, Xunlei, >>>>>>>> 2016-07-11 16:42 GMT+08:00 Xunlei Pang <xpang@redhat.com>: >>>>>>>>> On 2016/07/11 at 16:22, Xunlei Pang wrote: >>>>>>>>>> On 2016/07/11 at 15:25, Wanpeng Li wrote: >>>>>>>>>>> 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>: >>>>>>>>>>>> Hierarchy could be already throttled at this point. Throttled next >>>>>>>>>>>> buddy could trigger null pointer dereference in pick_next_task_fair(). >>>>>>>>>>> There is cfs_rq->next check in pick_next_entity(), so how can null >>>>>>>>>>> pointer dereference happen? >>>>>>>>>> I guess it's the following code leading to a NULL se returned: >>>>>>>>> s/NULL/empty-entity cfs_rq se/ >>>>>>>>> >>>>>>>>>> pick_next_entity(): >>>>>>>>>> if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1) >>>>>>>> ^^^^^^^^^^^^^ >>>>>>>> I think this will return false. >>>>>>> >>>>>>> With the wrong throttled_hierarchy(), I think this can happen. But after we have the >>>>>>> corrected throttled_hierarchy() patch, I can't see how it is possible. >>>>>>> >>>>>>> dequeue_task_fair(): >>>>>>> if (task_sleep && parent_entity(se)) >>>>>>> set_next_buddy(parent_entity(se)); >>>>>>> >>>>>>> How does dequeue_task_fair() with DEQUEUE_SLEEP set(true task_sleep) happen to a throttled hierarchy? >>>>>>> IOW, a task belongs to a throttled hierarchy is running? >>>>>>> >>>>>>> Maybe Konstantin knows the reason. >>>>>> >>>>>> This function (dequeue_task_fair) check throttling but at point it could skip several >>>>>> levels and announce as next buddy actually throttled entry. >>>>>> Probably this bug hadn't happened but this's really hard to prove that this is impossible. >>>>>> ->set_curr_task(), PI-boost or some tricky migration in balancer could break this easily. >>>>> >>>>> sched_setscheduler can call put_prev_task, which then can cause a >>>>> throttle outside of __schedule(), then the task blocks normally and >>>>> deactivate_task(DEQUEUE_SLEEP) happens and you lose. >>>> >>>> The cfs_rq_throttled() check in dequeue_task_fair() will capture the >>>> cfs_rq which is throttled in sched_setscheduler::put_prev_task path, >>>> so nothing lost, where I miss? >>>> >>>> Regards, >>>> Wanpeng Li >>> >>> The cfs_rq_throttled() checks there are done bottom-up, so they will >>> trigger too late. a/b/t, where t is descheduling and a is throttled can >>> still cause a set_next_buddy(b); >> >> throttle cfs_rq is up-bottom, so when a is throttled, b and c are not >> yet, then task_sleep && se && !throttled_hierarchy(cfs_rq) still can't >> prevent a set_next_buddy(b). >> >> Regards, >> Wanpeng Li > > They don't race or anything, everything's under rq->lock. > throttled_hierarchy will register properly, the issue is that a parent > is the one cfs_rq_throttled(), not the current cfs_rq, and > set_next_buddy will set cfs_rq->next to an se that is !on_rq. Why b is !on_rq after throttle a? Regards, Wanpeng Li
[toc] | [prev] | [next] | [standalone]
| From | bsegall@google.com |
|---|---|
| Date | 2016-07-15 00:50 +0200 |
| Message-ID | <rUXC9-7cS-1@gated-at.bofh.it> |
| In reply to | #1443816 |
Wanpeng Li <kernellwp@gmail.com> writes: > 2016-07-15 1:54 GMT+08:00 <bsegall@google.com>: >> Wanpeng Li <kernellwp@gmail.com> writes: >> >>> 2016-07-14 1:06 GMT+08:00 <bsegall@google.com>: >>>> Wanpeng Li <kernellwp@gmail.com> writes: >>>> >>>>> 2016-07-13 1:25 GMT+08:00 <bsegall@google.com>: >>>>>> Konstantin Khlebnikov <khlebnikov@yandex-team.ru> writes: >>>>>> >>>>>>> On 11.07.2016 15:12, Xunlei Pang wrote: >>>>>>>> On 2016/07/11 at 17:54, Wanpeng Li wrote: >>>>>>>>> Hi Konstantin, Xunlei, >>>>>>>>> 2016-07-11 16:42 GMT+08:00 Xunlei Pang <xpang@redhat.com>: >>>>>>>>>> On 2016/07/11 at 16:22, Xunlei Pang wrote: >>>>>>>>>>> On 2016/07/11 at 15:25, Wanpeng Li wrote: >>>>>>>>>>>> 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>: >>>>>>>>>>>>> Hierarchy could be already throttled at this point. Throttled next >>>>>>>>>>>>> buddy could trigger null pointer dereference in pick_next_task_fair(). >>>>>>>>>>>> There is cfs_rq->next check in pick_next_entity(), so how can null >>>>>>>>>>>> pointer dereference happen? >>>>>>>>>>> I guess it's the following code leading to a NULL se returned: >>>>>>>>>> s/NULL/empty-entity cfs_rq se/ >>>>>>>>>> >>>>>>>>>>> pick_next_entity(): >>>>>>>>>>> if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1) >>>>>>>>> ^^^^^^^^^^^^^ >>>>>>>>> I think this will return false. >>>>>>>> >>>>>>>> With the wrong throttled_hierarchy(), I think this can happen. But after we have the >>>>>>>> corrected throttled_hierarchy() patch, I can't see how it is possible. >>>>>>>> >>>>>>>> dequeue_task_fair(): >>>>>>>> if (task_sleep && parent_entity(se)) >>>>>>>> set_next_buddy(parent_entity(se)); >>>>>>>> >>>>>>>> How does dequeue_task_fair() with DEQUEUE_SLEEP set(true task_sleep) happen to a throttled hierarchy? >>>>>>>> IOW, a task belongs to a throttled hierarchy is running? >>>>>>>> >>>>>>>> Maybe Konstantin knows the reason. >>>>>>> >>>>>>> This function (dequeue_task_fair) check throttling but at point it could skip several >>>>>>> levels and announce as next buddy actually throttled entry. >>>>>>> Probably this bug hadn't happened but this's really hard to prove that this is impossible. >>>>>>> ->set_curr_task(), PI-boost or some tricky migration in balancer could break this easily. >>>>>> >>>>>> sched_setscheduler can call put_prev_task, which then can cause a >>>>>> throttle outside of __schedule(), then the task blocks normally and >>>>>> deactivate_task(DEQUEUE_SLEEP) happens and you lose. >>>>> >>>>> The cfs_rq_throttled() check in dequeue_task_fair() will capture the >>>>> cfs_rq which is throttled in sched_setscheduler::put_prev_task path, >>>>> so nothing lost, where I miss? >>>>> >>>>> Regards, >>>>> Wanpeng Li >>>> >>>> The cfs_rq_throttled() checks there are done bottom-up, so they will >>>> trigger too late. a/b/t, where t is descheduling and a is throttled can >>>> still cause a set_next_buddy(b); >>> >>> throttle cfs_rq is up-bottom, so when a is throttled, b and c are not >>> yet, then task_sleep && se && !throttled_hierarchy(cfs_rq) still can't >>> prevent a set_next_buddy(b). >>> >>> Regards, >>> Wanpeng Li >> >> They don't race or anything, everything's under rq->lock. >> throttled_hierarchy will register properly, the issue is that a parent >> is the one cfs_rq_throttled(), not the current cfs_rq, and >> set_next_buddy will set cfs_rq->next to an se that is !on_rq. > > Why b is !on_rq after throttle a? > > Regards, > Wanpeng Li a is !on_rq (because of throttle), but set_next_buddy will set ->next up the entire tree.
[toc] | [prev] | [next] | [standalone]
| From | Wanpeng Li <kernellwp@gmail.com> |
|---|---|
| Date | 2016-07-15 01:10 +0200 |
| Message-ID | <rUXVw-7zg-11@gated-at.bofh.it> |
| In reply to | #1443818 |
2016-07-15 6:49 GMT+08:00 <bsegall@google.com>: > Wanpeng Li <kernellwp@gmail.com> writes: > >> 2016-07-15 1:54 GMT+08:00 <bsegall@google.com>: >>> Wanpeng Li <kernellwp@gmail.com> writes: >>> >>>> 2016-07-14 1:06 GMT+08:00 <bsegall@google.com>: >>>>> Wanpeng Li <kernellwp@gmail.com> writes: >>>>> >>>>>> 2016-07-13 1:25 GMT+08:00 <bsegall@google.com>: >>>>>>> Konstantin Khlebnikov <khlebnikov@yandex-team.ru> writes: >>>>>>> >>>>>>>> On 11.07.2016 15:12, Xunlei Pang wrote: >>>>>>>>> On 2016/07/11 at 17:54, Wanpeng Li wrote: >>>>>>>>>> Hi Konstantin, Xunlei, >>>>>>>>>> 2016-07-11 16:42 GMT+08:00 Xunlei Pang <xpang@redhat.com>: >>>>>>>>>>> On 2016/07/11 at 16:22, Xunlei Pang wrote: >>>>>>>>>>>> On 2016/07/11 at 15:25, Wanpeng Li wrote: >>>>>>>>>>>>> 2016-06-16 20:57 GMT+08:00 Konstantin Khlebnikov <khlebnikov@yandex-team.ru>: >>>>>>>>>>>>>> Hierarchy could be already throttled at this point. Throttled next >>>>>>>>>>>>>> buddy could trigger null pointer dereference in pick_next_task_fair(). >>>>>>>>>>>>> There is cfs_rq->next check in pick_next_entity(), so how can null >>>>>>>>>>>>> pointer dereference happen? >>>>>>>>>>>> I guess it's the following code leading to a NULL se returned: >>>>>>>>>>> s/NULL/empty-entity cfs_rq se/ >>>>>>>>>>> >>>>>>>>>>>> pick_next_entity(): >>>>>>>>>>>> if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1) >>>>>>>>>> ^^^^^^^^^^^^^ >>>>>>>>>> I think this will return false. >>>>>>>>> >>>>>>>>> With the wrong throttled_hierarchy(), I think this can happen. But after we have the >>>>>>>>> corrected throttled_hierarchy() patch, I can't see how it is possible. >>>>>>>>> >>>>>>>>> dequeue_task_fair(): >>>>>>>>> if (task_sleep && parent_entity(se)) >>>>>>>>> set_next_buddy(parent_entity(se)); >>>>>>>>> >>>>>>>>> How does dequeue_task_fair() with DEQUEUE_SLEEP set(true task_sleep) happen to a throttled hierarchy? >>>>>>>>> IOW, a task belongs to a throttled hierarchy is running? >>>>>>>>> >>>>>>>>> Maybe Konstantin knows the reason. >>>>>>>> >>>>>>>> This function (dequeue_task_fair) check throttling but at point it could skip several >>>>>>>> levels and announce as next buddy actually throttled entry. >>>>>>>> Probably this bug hadn't happened but this's really hard to prove that this is impossible. >>>>>>>> ->set_curr_task(), PI-boost or some tricky migration in balancer could break this easily. >>>>>>> >>>>>>> sched_setscheduler can call put_prev_task, which then can cause a >>>>>>> throttle outside of __schedule(), then the task blocks normally and >>>>>>> deactivate_task(DEQUEUE_SLEEP) happens and you lose. >>>>>> >>>>>> The cfs_rq_throttled() check in dequeue_task_fair() will capture the >>>>>> cfs_rq which is throttled in sched_setscheduler::put_prev_task path, >>>>>> so nothing lost, where I miss? >>>>>> >>>>>> Regards, >>>>>> Wanpeng Li >>>>> >>>>> The cfs_rq_throttled() checks there are done bottom-up, so they will >>>>> trigger too late. a/b/t, where t is descheduling and a is throttled can >>>>> still cause a set_next_buddy(b); >>>> >>>> throttle cfs_rq is up-bottom, so when a is throttled, b and c are not >>>> yet, then task_sleep && se && !throttled_hierarchy(cfs_rq) still can't >>>> prevent a set_next_buddy(b). >>>> >>>> Regards, >>>> Wanpeng Li >>> >>> They don't race or anything, everything's under rq->lock. >>> throttled_hierarchy will register properly, the issue is that a parent >>> is the one cfs_rq_throttled(), not the current cfs_rq, and >>> set_next_buddy will set cfs_rq->next to an se that is !on_rq. >> >> Why b is !on_rq after throttle a? >> >> Regards, >> Wanpeng Li > > a is !on_rq (because of throttle), but set_next_buddy will set ->next up > the entire tree. Got it, thanks for your explanation. :) Regards, Wanpeng Li
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web