* [PATCH v1] cpuidle: tegra: Correctly handle result of arm_cpuidle_simple_enter() @ 2020-06-29 22:26 Dmitry Osipenko 2020-06-30 9:02 ` Jon Hunter 0 siblings, 1 reply; 5+ messages in thread From: Dmitry Osipenko @ 2020-06-29 22:26 UTC (permalink / raw) To: Thierry Reding, Jonathan Hunter, Rafael J. Wysocki, Daniel Lezcano Cc: linux-pm, linux-tegra The arm_cpuidle_simple_enter() returns the entered idle-index and not a error code. It happened that TEGRA_C1=index=err=0, and hence this typo was difficult to notice in the code since everything happened to work properly. This patch fixes the minor typo, it doesn't fix any problem. Signed-off-by: Dmitry Osipenko <digetx@gmail.com> --- drivers/cpuidle/cpuidle-tegra.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/cpuidle/cpuidle-tegra.c b/drivers/cpuidle/cpuidle-tegra.c index 150045849d78..9e9a9cccd755 100644 --- a/drivers/cpuidle/cpuidle-tegra.c +++ b/drivers/cpuidle/cpuidle-tegra.c @@ -236,14 +236,14 @@ static int tegra_cpuidle_enter(struct cpuidle_device *dev, int index) { unsigned int cpu = cpu_logical_map(dev->cpu); - int err; + int err = 0; index = tegra_cpuidle_adjust_state_index(index, cpu); if (dev->states_usage[index].disable) return -1; if (index == TEGRA_C1) - err = arm_cpuidle_simple_enter(dev, drv, index); + index = arm_cpuidle_simple_enter(dev, drv, index); else err = tegra_cpuidle_state_enter(dev, index, cpu); -- 2.26.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v1] cpuidle: tegra: Correctly handle result of arm_cpuidle_simple_enter() 2020-06-29 22:26 [PATCH v1] cpuidle: tegra: Correctly handle result of arm_cpuidle_simple_enter() Dmitry Osipenko @ 2020-06-30 9:02 ` Jon Hunter 2020-06-30 18:54 ` Dmitry Osipenko 0 siblings, 1 reply; 5+ messages in thread From: Jon Hunter @ 2020-06-30 9:02 UTC (permalink / raw) To: Dmitry Osipenko, Thierry Reding, Rafael J. Wysocki, Daniel Lezcano Cc: linux-pm, linux-tegra On 29/06/2020 23:26, Dmitry Osipenko wrote: > The arm_cpuidle_simple_enter() returns the entered idle-index and not a > error code. It happened that TEGRA_C1=index=err=0, and hence this typo > was difficult to notice in the code since everything happened to work > properly. This patch fixes the minor typo, it doesn't fix any problem. I guess that is dependent on if CPUIDLE is enabled ... #ifdef CONFIG_CPU_IDLE extern int arm_cpuidle_simple_enter(struct cpuidle_device *dev, struct cpuidle_driver *drv, int index); #else static inline int arm_cpuidle_simple_enter(struct cpuidle_device *dev, struct cpuidle_driver *drv, int index) { return -ENODEV; } #endif Looks like it could return an error. > Signed-off-by: Dmitry Osipenko <digetx@gmail.com> > --- > drivers/cpuidle/cpuidle-tegra.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/cpuidle/cpuidle-tegra.c b/drivers/cpuidle/cpuidle-tegra.c > index 150045849d78..9e9a9cccd755 100644 > --- a/drivers/cpuidle/cpuidle-tegra.c > +++ b/drivers/cpuidle/cpuidle-tegra.c > @@ -236,14 +236,14 @@ static int tegra_cpuidle_enter(struct cpuidle_device *dev, > int index) > { > unsigned int cpu = cpu_logical_map(dev->cpu); > - int err; > + int err = 0; > > index = tegra_cpuidle_adjust_state_index(index, cpu); > if (dev->states_usage[index].disable) > return -1; > > if (index == TEGRA_C1) > - err = arm_cpuidle_simple_enter(dev, drv, index); > + index = arm_cpuidle_simple_enter(dev, drv, index); > else > err = tegra_cpuidle_state_enter(dev, index, cpu); > > However, I do think that there is something not right in the error handling here. Would also be nice to get rid of these -1. Jon -- nvpublic ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v1] cpuidle: tegra: Correctly handle result of arm_cpuidle_simple_enter() 2020-06-30 9:02 ` Jon Hunter @ 2020-06-30 18:54 ` Dmitry Osipenko 2020-07-01 13:56 ` Jon Hunter 0 siblings, 1 reply; 5+ messages in thread From: Dmitry Osipenko @ 2020-06-30 18:54 UTC (permalink / raw) To: Jon Hunter, Thierry Reding, Rafael J. Wysocki, Daniel Lezcano Cc: linux-pm, linux-tegra 30.06.2020 12:02, Jon Hunter пишет: > > On 29/06/2020 23:26, Dmitry Osipenko wrote: >> The arm_cpuidle_simple_enter() returns the entered idle-index and not a >> error code. It happened that TEGRA_C1=index=err=0, and hence this typo >> was difficult to notice in the code since everything happened to work >> properly. This patch fixes the minor typo, it doesn't fix any problem. > > I guess that is dependent on if CPUIDLE is enabled ... > > #ifdef CONFIG_CPU_IDLE > extern int arm_cpuidle_simple_enter(struct cpuidle_device *dev, > struct cpuidle_driver *drv, int index); > #else > static inline int arm_cpuidle_simple_enter(struct cpuidle_device *dev, > struct cpuidle_driver *drv, int index) { return -ENODEV; } > #endif > > Looks like it could return an error. Hello Jon! The cpuidle's enter() callback returns an index of the entered state on success, on negative value on failure. The negative number *could be* a proper error code, but in the same time it also doesn't matter what's the exact negative value is for the cpuidle's core code. Please see more below! >> Signed-off-by: Dmitry Osipenko <digetx@gmail.com> >> --- >> drivers/cpuidle/cpuidle-tegra.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/cpuidle/cpuidle-tegra.c b/drivers/cpuidle/cpuidle-tegra.c >> index 150045849d78..9e9a9cccd755 100644 >> --- a/drivers/cpuidle/cpuidle-tegra.c >> +++ b/drivers/cpuidle/cpuidle-tegra.c >> @@ -236,14 +236,14 @@ static int tegra_cpuidle_enter(struct cpuidle_device *dev, >> int index) >> { >> unsigned int cpu = cpu_logical_map(dev->cpu); >> - int err; >> + int err = 0; >> >> index = tegra_cpuidle_adjust_state_index(index, cpu); >> if (dev->states_usage[index].disable) >> return -1; >> >> if (index == TEGRA_C1) >> - err = arm_cpuidle_simple_enter(dev, drv, index); >> + index = arm_cpuidle_simple_enter(dev, drv, index); >> else >> err = tegra_cpuidle_state_enter(dev, index, cpu); >> >> > > However, I do think that there is something not right in the error handling > here. Would also be nice to get rid of these -1. IIRC, the -1 was borrowed from some other cpuidle driver, for example cpuidle-psci[1] and coupled.c[2] are returning -1 on a failure. [1] https://elixir.bootlin.com/linux/v5.8-rc3/source/drivers/cpuidle/cpuidle-psci.c#L63 [2] https://elixir.bootlin.com/linux/v5.8-rc3/source/drivers/cpuidle/coupled.c#L473 Looking at the the cpuidle's call chain, all of the code checks only whether the returned value of the enter() is negative or not and in the end that value is ignored [3][4]. [3] https://elixir.bootlin.com/linux/v5.8-rc3/source/kernel/sched/idle.c#L216 [4] https://elixir.bootlin.com/linux/v5.8-rc3/source/drivers/cpuidle/cpuidle.c#L360 Indeed, it would be better to return something more meaningful, but what should we return for a disabled state if not -1? ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v1] cpuidle: tegra: Correctly handle result of arm_cpuidle_simple_enter() 2020-06-30 18:54 ` Dmitry Osipenko @ 2020-07-01 13:56 ` Jon Hunter 2020-07-01 22:49 ` Dmitry Osipenko 0 siblings, 1 reply; 5+ messages in thread From: Jon Hunter @ 2020-07-01 13:56 UTC (permalink / raw) To: Dmitry Osipenko, Thierry Reding, Rafael J. Wysocki, Daniel Lezcano Cc: linux-pm, linux-tegra On 30/06/2020 19:54, Dmitry Osipenko wrote: > 30.06.2020 12:02, Jon Hunter пишет: >> >> On 29/06/2020 23:26, Dmitry Osipenko wrote: >>> The arm_cpuidle_simple_enter() returns the entered idle-index and not a >>> error code. It happened that TEGRA_C1=index=err=0, and hence this typo >>> was difficult to notice in the code since everything happened to work >>> properly. This patch fixes the minor typo, it doesn't fix any problem. >> >> I guess that is dependent on if CPUIDLE is enabled ... >> >> #ifdef CONFIG_CPU_IDLE >> extern int arm_cpuidle_simple_enter(struct cpuidle_device *dev, >> struct cpuidle_driver *drv, int index); >> #else >> static inline int arm_cpuidle_simple_enter(struct cpuidle_device *dev, >> struct cpuidle_driver *drv, int index) { return -ENODEV; } >> #endif >> >> Looks like it could return an error. > > Hello Jon! > > The cpuidle's enter() callback returns an index of the entered state on > success, on negative value on failure. Yes, however, when I read the first sentence of the changelog it seemed to suggested it would never return and error code. Perhaps you meant in the context of the Tegra CPUIdle driver because CPU_IDLE is always enabled? > The negative number *could be* a proper error code, but in the same time > it also doesn't matter what's the exact negative value is for the > cpuidle's core code. Please see more below! > >>> Signed-off-by: Dmitry Osipenko <digetx@gmail.com> >>> --- >>> drivers/cpuidle/cpuidle-tegra.c | 4 ++-- >>> 1 file changed, 2 insertions(+), 2 deletions(-) >>> >>> diff --git a/drivers/cpuidle/cpuidle-tegra.c b/drivers/cpuidle/cpuidle-tegra.c >>> index 150045849d78..9e9a9cccd755 100644 >>> --- a/drivers/cpuidle/cpuidle-tegra.c >>> +++ b/drivers/cpuidle/cpuidle-tegra.c >>> @@ -236,14 +236,14 @@ static int tegra_cpuidle_enter(struct cpuidle_device *dev, >>> int index) >>> { >>> unsigned int cpu = cpu_logical_map(dev->cpu); >>> - int err; >>> + int err = 0; >>> >>> index = tegra_cpuidle_adjust_state_index(index, cpu); >>> if (dev->states_usage[index].disable) >>> return -1; >>> >>> if (index == TEGRA_C1) >>> - err = arm_cpuidle_simple_enter(dev, drv, index); >>> + index = arm_cpuidle_simple_enter(dev, drv, index); >>> else >>> err = tegra_cpuidle_state_enter(dev, index, cpu); >>> >>> >> >> However, I do think that there is something not right in the error handling >> here. Would also be nice to get rid of these -1. > > IIRC, the -1 was borrowed from some other cpuidle driver, for example > cpuidle-psci[1] and coupled.c[2] are returning -1 on a failure. Indeed. Maybe we just let sleeping dogs lie in this case. Jon -- nvpublic ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v1] cpuidle: tegra: Correctly handle result of arm_cpuidle_simple_enter() 2020-07-01 13:56 ` Jon Hunter @ 2020-07-01 22:49 ` Dmitry Osipenko 0 siblings, 0 replies; 5+ messages in thread From: Dmitry Osipenko @ 2020-07-01 22:49 UTC (permalink / raw) To: Jon Hunter, Thierry Reding, Rafael J. Wysocki, Daniel Lezcano Cc: linux-pm, linux-tegra 01.07.2020 16:56, Jon Hunter пишет: > > On 30/06/2020 19:54, Dmitry Osipenko wrote: >> 30.06.2020 12:02, Jon Hunter пишет: >>> >>> On 29/06/2020 23:26, Dmitry Osipenko wrote: >>>> The arm_cpuidle_simple_enter() returns the entered idle-index and not a >>>> error code. It happened that TEGRA_C1=index=err=0, and hence this typo >>>> was difficult to notice in the code since everything happened to work >>>> properly. This patch fixes the minor typo, it doesn't fix any problem. >>> >>> I guess that is dependent on if CPUIDLE is enabled ... >>> >>> #ifdef CONFIG_CPU_IDLE >>> extern int arm_cpuidle_simple_enter(struct cpuidle_device *dev, >>> struct cpuidle_driver *drv, int index); >>> #else >>> static inline int arm_cpuidle_simple_enter(struct cpuidle_device *dev, >>> struct cpuidle_driver *drv, int index) { return -ENODEV; } >>> #endif >>> >>> Looks like it could return an error. >> >> Hello Jon! >> >> The cpuidle's enter() callback returns an index of the entered state on >> success, on negative value on failure. > > Yes, however, when I read the first sentence of the changelog it seemed > to suggested it would never return and error code. Perhaps you meant in > the context of the Tegra CPUIdle driver because CPU_IDLE is always enabled? Yes, the commit message could be improved in regards to the error condition clarification. I'll update it in v2, thank you for the suggestion! >> The negative number *could be* a proper error code, but in the same time >> it also doesn't matter what's the exact negative value is for the >> cpuidle's core code. Please see more below! >> >>>> Signed-off-by: Dmitry Osipenko <digetx@gmail.com> >>>> --- >>>> drivers/cpuidle/cpuidle-tegra.c | 4 ++-- >>>> 1 file changed, 2 insertions(+), 2 deletions(-) >>>> >>>> diff --git a/drivers/cpuidle/cpuidle-tegra.c b/drivers/cpuidle/cpuidle-tegra.c >>>> index 150045849d78..9e9a9cccd755 100644 >>>> --- a/drivers/cpuidle/cpuidle-tegra.c >>>> +++ b/drivers/cpuidle/cpuidle-tegra.c >>>> @@ -236,14 +236,14 @@ static int tegra_cpuidle_enter(struct cpuidle_device *dev, >>>> int index) >>>> { >>>> unsigned int cpu = cpu_logical_map(dev->cpu); >>>> - int err; >>>> + int err = 0; >>>> >>>> index = tegra_cpuidle_adjust_state_index(index, cpu); >>>> if (dev->states_usage[index].disable) >>>> return -1; >>>> >>>> if (index == TEGRA_C1) >>>> - err = arm_cpuidle_simple_enter(dev, drv, index); >>>> + index = arm_cpuidle_simple_enter(dev, drv, index); >>>> else >>>> err = tegra_cpuidle_state_enter(dev, index, cpu); >>>> >>>> >>> >>> However, I do think that there is something not right in the error handling >>> here. Would also be nice to get rid of these -1. >> >> IIRC, the -1 was borrowed from some other cpuidle driver, for example >> cpuidle-psci[1] and coupled.c[2] are returning -1 on a failure. > > Indeed. Maybe we just let sleeping dogs lie in this case. +1 We could always return to this later on, once there will be a real need. ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-07-01 22:49 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-06-29 22:26 [PATCH v1] cpuidle: tegra: Correctly handle result of arm_cpuidle_simple_enter() Dmitry Osipenko 2020-06-30 9:02 ` Jon Hunter 2020-06-30 18:54 ` Dmitry Osipenko 2020-07-01 13:56 ` Jon Hunter 2020-07-01 22:49 ` Dmitry Osipenko
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).