Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1376248 > unrolled thread
| Started by | Steve Muckle <steve.muckle@linaro.org> |
|---|---|
| First post | 2016-04-11 21:30 +0200 |
| Last post | 2016-04-13 18:10 +0200 |
| Articles | 13 — 2 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 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() Steve Muckle <steve.muckle@linaro.org> - 2016-04-11 21:30 +0200
Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() "Rafael J. Wysocki" <rafael@kernel.org> - 2016-04-11 23:30 +0200
Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() "Rafael J. Wysocki" <rafael@kernel.org> - 2016-04-12 16:40 +0200
Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() Steve Muckle <steve.muckle@linaro.org> - 2016-04-12 21:40 +0200
Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() "Rafael J. Wysocki" <rafael@kernel.org> - 2016-04-13 16:50 +0200
Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() Steve Muckle <steve.muckle@linaro.org> - 2016-04-13 20:00 +0200
Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() "Rafael J. Wysocki" <rafael@kernel.org> - 2016-04-13 21:40 +0200
Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() Steve Muckle <steve.muckle@linaro.org> - 2016-04-13 02:10 +0200
Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() "Rafael J. Wysocki" <rafael@kernel.org> - 2016-04-13 06:50 +0200
Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() "Rafael J. Wysocki" <rafael@kernel.org> - 2016-04-13 18:10 +0200
Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() Steve Muckle <steve.muckle@linaro.org> - 2016-04-13 20:10 +0200
Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() "Rafael J. Wysocki" <rafael@kernel.org> - 2016-04-13 22:00 +0200
Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() "Rafael J. Wysocki" <rafael@kernel.org> - 2016-04-13 18:10 +0200
| From | Steve Muckle <steve.muckle@linaro.org> |
|---|---|
| Date | 2016-04-11 21:30 +0200 |
| Subject | Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() |
| Message-ID | <rmPH4-2Bx-13@gated-at.bofh.it> |
Hi Rafael, On 04/01/2016 02:20 AM, Peter Zijlstra wrote: >> > My thinking was in CFS we get rid of the (cpu == smp_processor_id()) >> > condition for calling the cpufreq hook. >> > >> > The sched governor can then calculate utilization and frequency required >> > for cpu. If (cpu == smp_processor_id()), the update is processed >> > normally. If (cpu != smp_processor_id()) and the new frequency is higher >> > than cpu's Fcur, the sched gov IPIs cpu to continue running the update >> > operation. Otherwise, the update is dropped. >> > >> > Does that sound plausible? > > Can be done I suppose.. Currently we drop schedutil updates for a target CPU which do not occur on that CPU. Is this solely due to platforms which must run the cpufreq driver on the target CPU? Are there also shared cpufreq policies where the driver needs to run on any CPU in the affected policy/freq domain? thanks, Steve
[toc] | [next] | [standalone]
| From | "Rafael J. Wysocki" <rafael@kernel.org> |
|---|---|
| Date | 2016-04-11 23:30 +0200 |
| Subject | Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() |
| Message-ID | <rmRzc-3YH-5@gated-at.bofh.it> |
| In reply to | #1376248 |
On Mon, Apr 11, 2016 at 9:28 PM, Steve Muckle <steve.muckle@linaro.org> wrote: > Hi Rafael, > > On 04/01/2016 02:20 AM, Peter Zijlstra wrote: >>> > My thinking was in CFS we get rid of the (cpu == smp_processor_id()) >>> > condition for calling the cpufreq hook. >>> > >>> > The sched governor can then calculate utilization and frequency required >>> > for cpu. If (cpu == smp_processor_id()), the update is processed >>> > normally. If (cpu != smp_processor_id()) and the new frequency is higher >>> > than cpu's Fcur, the sched gov IPIs cpu to continue running the update >>> > operation. Otherwise, the update is dropped. >>> > >>> > Does that sound plausible? >> >> Can be done I suppose.. > > Currently we drop schedutil updates for a target CPU which do not occur > on that CPU. > > Is this solely due to platforms which must run the cpufreq driver on the > target CPU? The current code assumes that the CPU running the update will always be the one that gets updated. Anything else would require extra synchronization. > Are there also shared cpufreq policies where the driver needs to run on > any CPU in the affected policy/freq domain? Yes, there are, AFAICS, but drivers are expected to cope with that (if I understand the question correctly). Thanks, Rafael
[toc] | [prev] | [next] | [standalone]
| From | "Rafael J. Wysocki" <rafael@kernel.org> |
|---|---|
| Date | 2016-04-12 16:40 +0200 |
| Subject | Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() |
| Message-ID | <rn7DY-p6-37@gated-at.bofh.it> |
| In reply to | #1376293 |
On Mon, Apr 11, 2016 at 11:20 PM, Rafael J. Wysocki <rafael@kernel.org> wrote: > On Mon, Apr 11, 2016 at 9:28 PM, Steve Muckle <steve.muckle@linaro.org> wrote: >> Hi Rafael, >> >> On 04/01/2016 02:20 AM, Peter Zijlstra wrote: >>>> > My thinking was in CFS we get rid of the (cpu == smp_processor_id()) >>>> > condition for calling the cpufreq hook. >>>> > >>>> > The sched governor can then calculate utilization and frequency required >>>> > for cpu. If (cpu == smp_processor_id()), the update is processed >>>> > normally. If (cpu != smp_processor_id()) and the new frequency is higher >>>> > than cpu's Fcur, the sched gov IPIs cpu to continue running the update >>>> > operation. Otherwise, the update is dropped. >>>> > >>>> > Does that sound plausible? >>> >>> Can be done I suppose.. >> >> Currently we drop schedutil updates for a target CPU which do not occur >> on that CPU. >> >> Is this solely due to platforms which must run the cpufreq driver on the >> target CPU? > > The current code assumes that the CPU running the update will always > be the one that gets updated. Anything else would require extra > synchronization. This is rather fundamental. For example, if you look at cpufreq_update_util(), it does this: data = rcu_dereference_sched(*this_cpu_ptr(&cpufreq_update_util_data)); meaning that it will run the current CPU's utilization update callback. Of course, that won't work cross-CPU, because in principle different CPUs may use different governors and therefore different util update callbacks. If you want to do remote updates, I guess that will require an irq_work to run the update on the target CPU, but then you'll probably want to neglect the rate limit on it as well, so it looks like a "need_update" flag in struct update_util_data will be useful for that. I think I can prototype something along these lines, but can you please tell me more about the case you have in mind? Thanks, Rafael
[toc] | [prev] | [next] | [standalone]
| From | Steve Muckle <steve.muckle@linaro.org> |
|---|---|
| Date | 2016-04-12 21:40 +0200 |
| Message-ID | <rnckh-4di-1@gated-at.bofh.it> |
| In reply to | #1376863 |
On Tue, Apr 12, 2016 at 04:29:06PM +0200, Rafael J. Wysocki wrote: > On Mon, Apr 11, 2016 at 11:20 PM, Rafael J. Wysocki <rafael@kernel.org> wrote: > > On Mon, Apr 11, 2016 at 9:28 PM, Steve Muckle <steve.muckle@linaro.org> wrote: > >> Hi Rafael, > >> > >> On 04/01/2016 02:20 AM, Peter Zijlstra wrote: > >>>> > My thinking was in CFS we get rid of the (cpu == smp_processor_id()) > >>>> > condition for calling the cpufreq hook. > >>>> > > >>>> > The sched governor can then calculate utilization and frequency required > >>>> > for cpu. If (cpu == smp_processor_id()), the update is processed > >>>> > normally. If (cpu != smp_processor_id()) and the new frequency is higher > >>>> > than cpu's Fcur, the sched gov IPIs cpu to continue running the update > >>>> > operation. Otherwise, the update is dropped. > >>>> > > >>>> > Does that sound plausible? > >>> > >>> Can be done I suppose.. > >> > >> Currently we drop schedutil updates for a target CPU which do not occur > >> on that CPU. > >> > >> Is this solely due to platforms which must run the cpufreq driver on the > >> target CPU? > > > > The current code assumes that the CPU running the update will always > > be the one that gets updated. Anything else would require extra > > synchronization. > > This is rather fundamental. > > For example, if you look at cpufreq_update_util(), it does this: > > data = rcu_dereference_sched(*this_cpu_ptr(&cpufreq_update_util_data)); > > meaning that it will run the current CPU's utilization update > callback. Of course, that won't work cross-CPU, because in principle > different CPUs may use different governors and therefore different > util update callbacks. > > If you want to do remote updates, I guess that will require an > irq_work to run the update on the target CPU, but then you'll probably > want to neglect the rate limit on it as well, so it looks like a > "need_update" flag in struct update_util_data will be useful for that. > > I think I can prototype something along these lines, but can you > please tell me more about the case you have in mind? I'm concerned generally with the latency to react to changes in required capacity due to remote wakeups, which are quite common on SMP platforms with shared cache. Unless the hook is called it could take up to a tick to react AFAICS if the target CPU is running some other task that does not get preempted by the wakeup. That's a potentially long time for say UI-critical applications and seems like a lost opportunity for us to leverage closer scheduler-cpufreq communication to get better performance. thanks, Steve
[toc] | [prev] | [next] | [standalone]
| From | "Rafael J. Wysocki" <rafael@kernel.org> |
|---|---|
| Date | 2016-04-13 16:50 +0200 |
| Subject | Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() |
| Message-ID | <rnuhc-2Hz-17@gated-at.bofh.it> |
| In reply to | #1377127 |
On Tue, Apr 12, 2016 at 9:38 PM, Steve Muckle <steve.muckle@linaro.org> wrote: > On Tue, Apr 12, 2016 at 04:29:06PM +0200, Rafael J. Wysocki wrote: >> On Mon, Apr 11, 2016 at 11:20 PM, Rafael J. Wysocki <rafael@kernel.org> wrote: >> > On Mon, Apr 11, 2016 at 9:28 PM, Steve Muckle <steve.muckle@linaro.org> wrote: >> >> Hi Rafael, >> >> >> >> On 04/01/2016 02:20 AM, Peter Zijlstra wrote: >> >>>> > My thinking was in CFS we get rid of the (cpu == smp_processor_id()) >> >>>> > condition for calling the cpufreq hook. >> >>>> > >> >>>> > The sched governor can then calculate utilization and frequency required >> >>>> > for cpu. If (cpu == smp_processor_id()), the update is processed >> >>>> > normally. If (cpu != smp_processor_id()) and the new frequency is higher >> >>>> > than cpu's Fcur, the sched gov IPIs cpu to continue running the update >> >>>> > operation. Otherwise, the update is dropped. >> >>>> > >> >>>> > Does that sound plausible? >> >>> >> >>> Can be done I suppose.. >> >> >> >> Currently we drop schedutil updates for a target CPU which do not occur >> >> on that CPU. >> >> >> >> Is this solely due to platforms which must run the cpufreq driver on the >> >> target CPU? >> > >> > The current code assumes that the CPU running the update will always >> > be the one that gets updated. Anything else would require extra >> > synchronization. >> >> This is rather fundamental. >> >> For example, if you look at cpufreq_update_util(), it does this: >> >> data = rcu_dereference_sched(*this_cpu_ptr(&cpufreq_update_util_data)); >> >> meaning that it will run the current CPU's utilization update >> callback. Of course, that won't work cross-CPU, because in principle >> different CPUs may use different governors and therefore different >> util update callbacks. >> >> If you want to do remote updates, I guess that will require an >> irq_work to run the update on the target CPU, but then you'll probably >> want to neglect the rate limit on it as well, so it looks like a >> "need_update" flag in struct update_util_data will be useful for that. >> >> I think I can prototype something along these lines, but can you >> please tell me more about the case you have in mind? > > I'm concerned generally with the latency to react to changes in > required capacity due to remote wakeups, which are quite common on SMP > platforms with shared cache. Unless the hook is called it could take > up to a tick to react AFAICS if the target CPU is running some other > task that does not get preempted by the wakeup. So the scenario seems to be that CPU A is running task X and CPU B wakes up task Y on it remotely, but that task has to wait for CPU A to get to it, so you want to increase the frequency of CPU A at the wakeup time so as to reduce the time the woken up task has to wait. In that case task X would not be giving the CPU away (ie. no invocations of schedule()) for the whole tick, so it would be CPU/memory bound. In that case I would expect CPU A to be running at full capacity already unless this is the first tick period in which task X behaves this way which looks like a corner case to me. Moreover, sending an IPI to CPU A in that case looks like the right thing to do to me anyway. Thanks, Rafael
[toc] | [prev] | [next] | [standalone]
| From | Steve Muckle <steve.muckle@linaro.org> |
|---|---|
| Date | 2016-04-13 20:00 +0200 |
| Message-ID | <rnxf4-4Yd-5@gated-at.bofh.it> |
| In reply to | #1378004 |
On 04/13/2016 07:45 AM, Rafael J. Wysocki wrote: >> I'm concerned generally with the latency to react to changes in >> > required capacity due to remote wakeups, which are quite common on SMP >> > platforms with shared cache. Unless the hook is called it could take >> > up to a tick to react AFAICS if the target CPU is running some other >> > task that does not get preempted by the wakeup. > > So the scenario seems to be that CPU A is running task X and CPU B > wakes up task Y on it remotely, but that task has to wait for CPU A to > get to it, so you want to increase the frequency of CPU A at the > wakeup time so as to reduce the time the woken up task has to wait. > > In that case task X would not be giving the CPU away (ie. no > invocations of schedule()) for the whole tick, so it would be > CPU/memory bound. In that case I would expect CPU A to be running at > full capacity already unless this is the first tick period in which > task X behaves this way which looks like a corner case to me. This situation is fairly common in bursty workloads (such as UI driven ones). > Moreover, sending an IPI to CPU A in that case looks like the right > thing to do to me anyway. Sorry I didn't follow - sending an IPI to do what exactly? Perform the wakeup operation on the target CPU? thanks, Steve
[toc] | [prev] | [next] | [standalone]
| From | "Rafael J. Wysocki" <rafael@kernel.org> |
|---|---|
| Date | 2016-04-13 21:40 +0200 |
| Subject | Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() |
| Message-ID | <rnyNQ-6k4-9@gated-at.bofh.it> |
| In reply to | #1378140 |
On Wed, Apr 13, 2016 at 7:53 PM, Steve Muckle <steve.muckle@linaro.org> wrote: > On 04/13/2016 07:45 AM, Rafael J. Wysocki wrote: >>> I'm concerned generally with the latency to react to changes in >>> > required capacity due to remote wakeups, which are quite common on SMP >>> > platforms with shared cache. Unless the hook is called it could take >>> > up to a tick to react AFAICS if the target CPU is running some other >>> > task that does not get preempted by the wakeup. >> >> So the scenario seems to be that CPU A is running task X and CPU B >> wakes up task Y on it remotely, but that task has to wait for CPU A to >> get to it, so you want to increase the frequency of CPU A at the >> wakeup time so as to reduce the time the woken up task has to wait. >> >> In that case task X would not be giving the CPU away (ie. no >> invocations of schedule()) for the whole tick, so it would be >> CPU/memory bound. In that case I would expect CPU A to be running at >> full capacity already unless this is the first tick period in which >> task X behaves this way which looks like a corner case to me. > > This situation is fairly common in bursty workloads (such as UI driven > ones). > >> Moreover, sending an IPI to CPU A in that case looks like the right >> thing to do to me anyway. > > Sorry I didn't follow - sending an IPI to do what exactly? Perform the > wakeup operation on the target CPU? Basically, to run a frequency update. You can combine that with the wakeup itself, though, I suppose.
[toc] | [prev] | [next] | [standalone]
| From | Steve Muckle <steve.muckle@linaro.org> |
|---|---|
| Date | 2016-04-13 02:10 +0200 |
| Message-ID | <rngxA-8aq-5@gated-at.bofh.it> |
| In reply to | #1376863 |
[Multipart message — attachments visible in raw view] — view raw
On Tue, Apr 12, 2016 at 04:29:06PM +0200, Rafael J. Wysocki wrote: > This is rather fundamental. > > For example, if you look at cpufreq_update_util(), it does this: > > data = rcu_dereference_sched(*this_cpu_ptr(&cpufreq_update_util_data)); > > meaning that it will run the current CPU's utilization update > callback. Of course, that won't work cross-CPU, because in principle > different CPUs may use different governors and therefore different > util update callbacks. Will something like the attached (unfinished patches) work? It seems to for me, but I haven't tested it much beyond confirming the hook is working on remote wakeups. I'm relying on the previous comment that it's up to cpufreq drivers to run stuff on the target policy's CPUs if the driver needs that. There's still some more work, fixing up some more smp_processor_id() usage in schedutil, but it should be easy (trace, slow path irq_work target). > If you want to do remote updates, I guess that will require an > irq_work to run the update on the target CPU, but then you'll probably > want to neglect the rate limit on it as well, so it looks like a > "need_update" flag in struct update_util_data will be useful for that. Why is it required to run the update on the target CPU? thanks, Steve
[toc] | [prev] | [next] | [standalone]
| From | "Rafael J. Wysocki" <rafael@kernel.org> |
|---|---|
| Date | 2016-04-13 06:50 +0200 |
| Subject | Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() |
| Message-ID | <rnkUx-3Ak-3@gated-at.bofh.it> |
| In reply to | #1377431 |
On Wed, Apr 13, 2016 at 2:08 AM, Steve Muckle <steve.muckle@linaro.org> wrote: > On Tue, Apr 12, 2016 at 04:29:06PM +0200, Rafael J. Wysocki wrote: >> This is rather fundamental. >> >> For example, if you look at cpufreq_update_util(), it does this: >> >> data = rcu_dereference_sched(*this_cpu_ptr(&cpufreq_update_util_data)); >> >> meaning that it will run the current CPU's utilization update >> callback. Of course, that won't work cross-CPU, because in principle >> different CPUs may use different governors and therefore different >> util update callbacks. > > Will something like the attached (unfinished patches) work? It seems > to for me, but I haven't tested it much beyond confirming the hook is > working on remote wakeups. No, they are not sufficient. First of all, you need to take all of the governors into account and they all make assumptions about updates being run on the CPU being updated. That should be easy to take into account for ondemand/conservative, but intel_pstate is a different story. > I'm relying on the previous comment that it's up to cpufreq drivers to > run stuff on the target policy's CPUs if the driver needs that. That's not the case for the fast frequency switching though, which has to happen on the CPU running the code. > There's still some more work, fixing up some more smp_processor_id() > usage in schedutil, but it should be easy (trace, slow path irq_work > target). > >> If you want to do remote updates, I guess that will require an >> irq_work to run the update on the target CPU, but then you'll probably >> want to neglect the rate limit on it as well, so it looks like a >> "need_update" flag in struct update_util_data will be useful for that. > > Why is it required to run the update on the target CPU? The fast switching and intel_pstate are the main reason. They both have to write to registers of the target CPU and the code to do that needs to run on that CPU. Thanks, Rafael
[toc] | [prev] | [next] | [standalone]
| From | "Rafael J. Wysocki" <rafael@kernel.org> |
|---|---|
| Date | 2016-04-13 18:10 +0200 |
| Subject | Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() |
| Message-ID | <rnvwC-3Pk-9@gated-at.bofh.it> |
| In reply to | #1377505 |
On Wed, Apr 13, 2016 at 6:05 PM, Rafael J. Wysocki <rafael@kernel.org> wrote: > On Wed, Apr 13, 2016 at 6:48 AM, Rafael J. Wysocki <rafael@kernel.org> wrote: >> On Wed, Apr 13, 2016 at 2:08 AM, Steve Muckle <steve.muckle@linaro.org> wrote: >>> On Tue, Apr 12, 2016 at 04:29:06PM +0200, Rafael J. Wysocki wrote: >>>> This is rather fundamental. >>>> >>>> For example, if you look at cpufreq_update_util(), it does this: >>>> >>>> data = rcu_dereference_sched(*this_cpu_ptr(&cpufreq_update_util_data)); >>>> >>>> meaning that it will run the current CPU's utilization update >>>> callback. Of course, that won't work cross-CPU, because in principle >>>> different CPUs may use different governors and therefore different >>>> util update callbacks. >>> >>> Will something like the attached (unfinished patches) work? It seems >>> to for me, but I haven't tested it much beyond confirming the hook is >>> working on remote wakeups. >> >> No, they are not sufficient. >> >> First of all, you need to take all of the governors into account and >> they all make assumptions about updates being run on the CPU being >> updated. >> >> That should be easy to take into account for ondemand/conservative, >> but intel_pstate is a different story. >> >>> I'm relying on the previous comment that it's up to cpufreq drivers to >>> run stuff on the target policy's CPUs if the driver needs that. >> >> That's not the case for the fast frequency switching though, which has >> to happen on the CPU running the code. >> >>> There's still some more work, fixing up some more smp_processor_id() >>> usage in schedutil, but it should be easy (trace, slow path irq_work >>> target). >>> >>>> If you want to do remote updates, I guess that will require an >>>> irq_work to run the update on the target CPU, but then you'll probably >>>> want to neglect the rate limit on it as well, so it looks like a >>>> "need_update" flag in struct update_util_data will be useful for that. >>> >>> Why is it required to run the update on the target CPU? >> >> The fast switching and intel_pstate are the main reason. >> >> They both have to write to registers of the target CPU and the code to >> do that needs to run on that CPU. > > And these two seem to be the only interesting cases for you, because > if you need to work for the worker thread to schedule to eventually s/work/wait/ (sorry) > change the CPU frequency for you, that will defeat the whole purpose > here.
[toc] | [prev] | [next] | [standalone]
| From | Steve Muckle <steve.muckle@linaro.org> |
|---|---|
| Date | 2016-04-13 20:10 +0200 |
| Message-ID | <rnxoK-5mv-13@gated-at.bofh.it> |
| In reply to | #1378076 |
On 04/13/2016 09:07 AM, Rafael J. Wysocki wrote: >>>>> If you want to do remote updates, I guess that will require an >>>>> irq_work to run the update on the target CPU, but then you'll probably >>>>> want to neglect the rate limit on it as well, so it looks like a >>>>> "need_update" flag in struct update_util_data will be useful for that. Have you added rate limiting at the hook level that I missed? I thought it was just inside schedutil. >>>> >>>> Why is it required to run the update on the target CPU? >>> >>> The fast switching and intel_pstate are the main reason. >>> >>> They both have to write to registers of the target CPU and the code to >>> do that needs to run on that CPU. Ok thanks, I'll take another look at this. I was thinking it might be nice to be able to push the decision on whether to send the IPI in to the governor/hook client. For example in the schedutil case, you don't need to IPI if sugov_should_update_freq() = false (outside the slight chance it might be true when it runs on the target). Beyond that perhaps for policy reasons it's desired to not send the IPI if next_freq <= cur_freq, etc. >> And these two seem to be the only interesting cases for you, because >> if you need to work for the worker thread to schedule to eventually > > s/work/wait/ (sorry) > >> change the CPU frequency for you, that will defeat the whole purpose >> here. I was hoping to submit at some point a patch to change the context for slow path frequency changes to RT or DL context, so this would benefit that case as well. thanks, steve
[toc] | [prev] | [next] | [standalone]
| From | "Rafael J. Wysocki" <rafael@kernel.org> |
|---|---|
| Date | 2016-04-13 22:00 +0200 |
| Subject | Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() |
| Message-ID | <rnz7d-6su-43@gated-at.bofh.it> |
| In reply to | #1378151 |
On Wed, Apr 13, 2016 at 8:06 PM, Steve Muckle <steve.muckle@linaro.org> wrote: > On 04/13/2016 09:07 AM, Rafael J. Wysocki wrote: >>>>>> If you want to do remote updates, I guess that will require an >>>>>> irq_work to run the update on the target CPU, but then you'll probably >>>>>> want to neglect the rate limit on it as well, so it looks like a >>>>>> "need_update" flag in struct update_util_data will be useful for that. > > Have you added rate limiting at the hook level that I missed? I thought > it was just inside schedutil. It is in schedutil (and other governors), but if you do a cross-CPU update, you probably want that rate limit to be ignored in that case. Now, if the local and target CPUs happen to use different governors (eg. the local CPU uses ondemand and the target one uses schedutil) or they just don't belong to the same policy, you need to set the "need update" flag for the target CPU, so the local one needs access to it. It is better for that flag to be located in the per-CPU data of the target CPU for that. >>>>> >>>>> Why is it required to run the update on the target CPU? >>>> >>>> The fast switching and intel_pstate are the main reason. >>>> >>>> They both have to write to registers of the target CPU and the code to >>>> do that needs to run on that CPU. > > Ok thanks, I'll take another look at this. > > I was thinking it might be nice to be able to push the decision on > whether to send the IPI in to the governor/hook client. For example in > the schedutil case, you don't need to IPI if sugov_should_update_freq() > = false (outside the slight chance it might be true when it runs on the > target). Beyond that perhaps for policy reasons it's desired to not send > the IPI if next_freq <= cur_freq, etc. Yes, that is an option, but then your governor code gets more complicated. Since every governor would need that complexity, you'd end up having it in multiple places. To me, it seems more efficient to just have it in one place (the code that triggers a cross-CPU update). And as I said, the rate limit would need to be overridden in the cross-CPU update case anyway, because it may just prevent you from getting what you want otherwise. >>> And these two seem to be the only interesting cases for you, because >>> if you need to work for the worker thread to schedule to eventually >> >> s/work/wait/ (sorry) >> >>> change the CPU frequency for you, that will defeat the whole purpose >>> here. > > I was hoping to submit at some point a patch to change the context for > slow path frequency changes to RT or DL context, so this would benefit > that case as well. But it still would require the worker thread to schedule, although it might just occur a bit earlier if that's DL/RT. Thanks, Rafael
[toc] | [prev] | [next] | [standalone]
| From | "Rafael J. Wysocki" <rafael@kernel.org> |
|---|---|
| Date | 2016-04-13 18:10 +0200 |
| Subject | Re: [PATCH 1/2] sched/fair: move cpufreq hook to update_cfs_rq_load_avg() |
| Message-ID | <rnvwC-3Pk-11@gated-at.bofh.it> |
| In reply to | #1377505 |
On Wed, Apr 13, 2016 at 6:48 AM, Rafael J. Wysocki <rafael@kernel.org> wrote: > On Wed, Apr 13, 2016 at 2:08 AM, Steve Muckle <steve.muckle@linaro.org> wrote: >> On Tue, Apr 12, 2016 at 04:29:06PM +0200, Rafael J. Wysocki wrote: >>> This is rather fundamental. >>> >>> For example, if you look at cpufreq_update_util(), it does this: >>> >>> data = rcu_dereference_sched(*this_cpu_ptr(&cpufreq_update_util_data)); >>> >>> meaning that it will run the current CPU's utilization update >>> callback. Of course, that won't work cross-CPU, because in principle >>> different CPUs may use different governors and therefore different >>> util update callbacks. >> >> Will something like the attached (unfinished patches) work? It seems >> to for me, but I haven't tested it much beyond confirming the hook is >> working on remote wakeups. > > No, they are not sufficient. > > First of all, you need to take all of the governors into account and > they all make assumptions about updates being run on the CPU being > updated. > > That should be easy to take into account for ondemand/conservative, > but intel_pstate is a different story. > >> I'm relying on the previous comment that it's up to cpufreq drivers to >> run stuff on the target policy's CPUs if the driver needs that. > > That's not the case for the fast frequency switching though, which has > to happen on the CPU running the code. > >> There's still some more work, fixing up some more smp_processor_id() >> usage in schedutil, but it should be easy (trace, slow path irq_work >> target). >> >>> If you want to do remote updates, I guess that will require an >>> irq_work to run the update on the target CPU, but then you'll probably >>> want to neglect the rate limit on it as well, so it looks like a >>> "need_update" flag in struct update_util_data will be useful for that. >> >> Why is it required to run the update on the target CPU? > > The fast switching and intel_pstate are the main reason. > > They both have to write to registers of the target CPU and the code to > do that needs to run on that CPU. And these two seem to be the only interesting cases for you, because if you need to work for the worker thread to schedule to eventually change the CPU frequency for you, that will defeat the whole purpose here. Thanks, Rafael
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web