Message ID | CAPKp9ubg3V0979dGTGi+kjXGiBczCG2+QBGgfrZBKjMgSuhy-A@mail.gmail.com |
---|---|
State | New |
Headers | show |
On 13/01/16 21:58, Rafael J. Wysocki wrote: > Hi, > > On Wed, Jan 13, 2016 at 6:27 PM, Sudeep Holla <sudeep.holla@arm.com> wrote: >> Hi Rik, >> >> This change break idle on ARM64(may be on other ARM?) platform. >> Sorry for reporting late, but missed to check cpuidle in -next. > > OK, so first of all, how exactly is idle broken on those systems? > Sorry for the hasty bug report. > Do they crash or does something different happen? If something > different happens, then what's that? > No they just don't enter any idle states(as if CPUIdle was disabled) [...] >> >> diff --git i/drivers/cpuidle/governors/menu.c w/drivers/cpuidle/governors/menu.c >> index 7b0971d97cc3..7c7f4059705a 100644 >> --- i/drivers/cpuidle/governors/menu.c >> +++ w/drivers/cpuidle/governors/menu.c >> @@ -330,7 +330,8 @@ static int menu_select(struct cpuidle_driver *drv, >> struct cpuidle_device *dev) >> * We want to default to C1 (hlt), not to busy polling >> * unless the timer is happening really really soon. >> */ >> - if (interactivity_req > 20 && >> + if (((interactivity_req && interactivity_req > 20) || > > Well, if interactivity_req > 20, then it also is different from 0, so > the first check should not be necessary here. > True, I just wanted to avoid using interactivity_req when 0, it was just a quick hack. >> + data->next_timer_us > 20) && > > I guess that this simply restores the previous behavior on the > platforms in question. > Yes. > Now, the reason why it may matter is because > CPUIDLE_DRIVER_STATE_START is 0 and so data->last_state_idx may end up > as -1 on them. So I think this piece of code only ever makes sense if > CPUIDLE_DRIVER_STATE_START is 1. > That's correct. -- Regards, Sudeep -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 13/01/16 22:07, Rafael J. Wysocki wrote: > On Wednesday, January 13, 2016 10:58:13 PM Rafael J. Wysocki wrote: [..] > > So I'm wondering if the appended patch helps by any chance? > Yes it does fix. As you mentioned earlier, CPUIDLE_DRIVER_STATE_START is 0 on ARM platforms and hence data->last_state_idx ended up as -1. You can add by Tested-by when you push this change. Thanks for the quick fix. -- Regards, Sudeep -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git i/drivers/cpuidle/governors/menu.c w/drivers/cpuidle/governors/menu.c index 7b0971d97cc3..7c7f4059705a 100644 --- i/drivers/cpuidle/governors/menu.c +++ w/drivers/cpuidle/governors/menu.c @@ -330,7 +330,8 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev) * We want to default to C1 (hlt), not to busy polling * unless the timer is happening really really soon. */ - if (interactivity_req > 20 && + if (((interactivity_req && interactivity_req > 20) || + data->next_timer_us > 20) && !drv->states[CPUIDLE_DRIVER_STATE_START].disabled && dev->states_usage[CPUIDLE_DRIVER_STATE_START].disable == 0)