Message ID | 20200917060031.6566-1-zhuguangqing83@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Daniel Lezcano |
Headers | show |
Series | thermal/drivers/cpuidle_cooling: Change the set_cur_state function | expand |
On 17/09/2020 08:00, zhuguangqing83@gmail.com wrote: > From: zhuguangqing <zhuguangqing@xiaomi.com> > > In the function cpuidle_cooling_set_cur_state(), if current_state is > not equal to state and both current_state and state are greater than > 0(scene 4 as follows), then maybe it should stop->start or restart > idle_inject. Sorry, I don't get it. It is an update of the state, why do we need to restart the idle injection ? The state change will be automatically take into account by the idle injection code at the new injection cycle. > The scenes changed is as follows, > > scene current_state state action > 1 0 >0 start > 2 0 0 do nothing > 3 >0 0 stop > 4 >0 && !=state >0 stop->start or restart > 5 >0 && ==state >0 do nothing > > Signed-off-by: zhuguangqing <zhuguangqing@xiaomi.com> > --- > drivers/thermal/cpuidle_cooling.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/drivers/thermal/cpuidle_cooling.c b/drivers/thermal/cpuidle_cooling.c > index 78e3e8238116..868919ad3dda 100644 > --- a/drivers/thermal/cpuidle_cooling.c > +++ b/drivers/thermal/cpuidle_cooling.c > @@ -113,7 +113,7 @@ static int cpuidle_cooling_get_cur_state(struct thermal_cooling_device *cdev, > /** > * cpuidle_cooling_set_cur_state - Set the current cooling state > * @cdev: the thermal cooling device > - * @state: the target state > + * @state: the target state, max value is 100 > * > * The function checks first if we are initiating the mitigation which > * in turn wakes up all the idle injection tasks belonging to the idle > @@ -130,6 +130,9 @@ static int cpuidle_cooling_set_cur_state(struct thermal_cooling_device *cdev, > unsigned long current_state = idle_cdev->state; > unsigned int runtime_us, idle_duration_us; > > + if (state > 100 || current_state == state) > + return 0; > + > idle_cdev->state = state; > > idle_inject_get_duration(ii_dev, &runtime_us, &idle_duration_us); > @@ -140,8 +143,11 @@ static int cpuidle_cooling_set_cur_state(struct thermal_cooling_device *cdev, > > if (current_state == 0 && state > 0) { > idle_inject_start(ii_dev); > - } else if (current_state > 0 && !state) { > + } else if (current_state > 0 && !state) { > idle_inject_stop(ii_dev); > + } else { > + idle_inject_stop(ii_dev); > + idle_inject_start(ii_dev); > } > > return 0; >
diff --git a/drivers/thermal/cpuidle_cooling.c b/drivers/thermal/cpuidle_cooling.c index 78e3e8238116..868919ad3dda 100644 --- a/drivers/thermal/cpuidle_cooling.c +++ b/drivers/thermal/cpuidle_cooling.c @@ -113,7 +113,7 @@ static int cpuidle_cooling_get_cur_state(struct thermal_cooling_device *cdev, /** * cpuidle_cooling_set_cur_state - Set the current cooling state * @cdev: the thermal cooling device - * @state: the target state + * @state: the target state, max value is 100 * * The function checks first if we are initiating the mitigation which * in turn wakes up all the idle injection tasks belonging to the idle @@ -130,6 +130,9 @@ static int cpuidle_cooling_set_cur_state(struct thermal_cooling_device *cdev, unsigned long current_state = idle_cdev->state; unsigned int runtime_us, idle_duration_us; + if (state > 100 || current_state == state) + return 0; + idle_cdev->state = state; idle_inject_get_duration(ii_dev, &runtime_us, &idle_duration_us); @@ -140,8 +143,11 @@ static int cpuidle_cooling_set_cur_state(struct thermal_cooling_device *cdev, if (current_state == 0 && state > 0) { idle_inject_start(ii_dev); - } else if (current_state > 0 && !state) { + } else if (current_state > 0 && !state) { idle_inject_stop(ii_dev); + } else { + idle_inject_stop(ii_dev); + idle_inject_start(ii_dev); } return 0;