Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1301340 > unrolled thread

Re: [PATCH v3 1/3] clocksource/vt8500: Increase the minimum delta

Started byDaniel Lezcano <daniel.lezcano@linaro.org>
First post2016-01-05 10:10 +0100
Last post2016-01-05 11:20 +0100
Articles 6 — 3 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.


Contents

  Re: [PATCH v3 1/3] clocksource/vt8500: Increase the minimum delta Daniel Lezcano <daniel.lezcano@linaro.org> - 2016-01-05 10:10 +0100
    Re: [PATCH v3 1/3] clocksource/vt8500: Increase the minimum delta Roman Volkov <v1ron@mail.ru> - 2016-01-05 10:50 +0100
      Re: [PATCH v3 1/3] clocksource/vt8500: Increase the minimum delta Russell King - ARM Linux <linux@arm.linux.org.uk> - 2016-01-05 11:10 +0100
        Re: [PATCH v3 1/3] clocksource/vt8500: Increase the minimum delta Daniel Lezcano <daniel.lezcano@linaro.org> - 2016-01-05 11:40 +0100
          Re: [PATCH v3 1/3] clocksource/vt8500: Increase the minimum delta Roman Volkov <v1ron@mail.ru> - 2016-01-05 12:20 +0100
      Re: [PATCH v3 1/3] clocksource/vt8500: Increase the minimum delta Daniel Lezcano <daniel.lezcano@linaro.org> - 2016-01-05 11:20 +0100

#1301340 — Re: [PATCH v3 1/3] clocksource/vt8500: Increase the minimum delta

FromDaniel Lezcano <daniel.lezcano@linaro.org>
Date2016-01-05 10:10 +0100
SubjectRe: [PATCH v3 1/3] clocksource/vt8500: Increase the minimum delta
Message-ID<qNvMS-8om-5@gated-at.bofh.it>
On 01/01/2016 02:24 PM, Roman Volkov wrote:
> From: Roman Volkov <rvolkov@v1ros.org>
>
> The vt8500 clocksource driver declares itself as capable to handle the
> minimum delay of 4 cycles by passing the value into
> clockevents_config_and_register(). The vt8500_timer_set_next_event()
> requires the passed cycles value to be at least 16. The impact is that
> userspace hangs in nanosleep() calls with small delay intervals.
>
> This problem is reproducible in Linux 4.2 starting from:
> c6eb3f70d448 ('hrtimer: Get rid of hrtimer softirq')
>
> Signed-off-by: Roman Volkov <rvolkov@v1ros.org>
> Acked-by: Alexey Charkov <alchark@gmail.com>

Hi Roman,

I looked at the email thread, and IIUC if set_next_event fails, the 
system freeze. Your patch fixes the issue for your driver but not the 
real issue because if set_next_event fails, at least a warning should 
appear in the log or better nanosleep should fail gracefully.

BTW why min delta is MIN_OSCR_DELTA * 2 in clockevents_config_and_register ?

> ---
>   drivers/clocksource/vt8500_timer.c | 6 ++++--
>   1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/clocksource/vt8500_timer.c b/drivers/clocksource/vt8500_timer.c
> index a92e94b..dfc3bb4 100644
> --- a/drivers/clocksource/vt8500_timer.c
> +++ b/drivers/clocksource/vt8500_timer.c
> @@ -50,6 +50,8 @@
>
>   #define msecs_to_loops(t) (loops_per_jiffy / 1000 * HZ * t)
>
> +#define MIN_OSCR_DELTA		16
> +
>   static void __iomem *regbase;
>
>   static cycle_t vt8500_timer_read(struct clocksource *cs)
> @@ -80,7 +82,7 @@ static int vt8500_timer_set_next_event(unsigned long cycles,
>   		cpu_relax();
>   	writel((unsigned long)alarm, regbase + TIMER_MATCH_VAL);
>
> -	if ((signed)(alarm - clocksource.read(&clocksource)) <= 16)
> +	if ((signed)(alarm - clocksource.read(&clocksource)) <= MIN_OSCR_DELTA)
>   		return -ETIME;
>
>   	writel(1, regbase + TIMER_IER_VAL);
> @@ -151,7 +153,7 @@ static void __init vt8500_timer_init(struct device_node *np)
>   		pr_err("%s: setup_irq failed for %s\n", __func__,
>   							clockevent.name);
>   	clockevents_config_and_register(&clockevent, VT8500_TIMER_HZ,
> -					4, 0xf0000000);
> +					MIN_OSCR_DELTA * 2, 0xf0000000);
>   }
>
>   CLOCKSOURCE_OF_DECLARE(vt8500, "via,vt8500-timer", vt8500_timer_init);
>


-- 
  <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [next] | [standalone]


#1301380

FromRoman Volkov <v1ron@mail.ru>
Date2016-01-05 10:50 +0100
Message-ID<qNwpA-eM-23@gated-at.bofh.it>
In reply to#1301340
В Tue, 5 Jan 2016 10:01:07 +0100
Daniel Lezcano <daniel.lezcano@linaro.org> пишет:

> On 01/01/2016 02:24 PM, Roman Volkov wrote:
> > From: Roman Volkov <rvolkov@v1ros.org>
> >
> > The vt8500 clocksource driver declares itself as capable to handle
> > the minimum delay of 4 cycles by passing the value into
> > clockevents_config_and_register(). The vt8500_timer_set_next_event()
> > requires the passed cycles value to be at least 16. The impact is
> > that userspace hangs in nanosleep() calls with small delay
> > intervals.
> >
> > This problem is reproducible in Linux 4.2 starting from:
> > c6eb3f70d448 ('hrtimer: Get rid of hrtimer softirq')
> >
> > Signed-off-by: Roman Volkov <rvolkov@v1ros.org>
> > Acked-by: Alexey Charkov <alchark@gmail.com>  
> 
> Hi Roman,
> 
> I looked at the email thread, and IIUC if set_next_event fails, the 
> system freeze. Your patch fixes the issue for your driver but not the 
> real issue because if set_next_event fails, at least a warning should 
> appear in the log or better nanosleep should fail gracefully.

Hi Daniel,

I agree, but if nanosleep will return immediately, this can lead to
undefined behavior in the software. Maybe the system can go busyloop
to somehow recover from this state and print a message to the log? At
the driver level it seems to be enough to fail the function without
printing logs.
 
> BTW why min delta is MIN_OSCR_DELTA * 2 in
> clockevents_config_and_register ?

All this just to be consistent with PXA. Maybe PXA works with lesser
values, e.g., 8. For vt8500, accessing the registers is more complex,
and this should consume more time. IIUC, if the driver does not support
too small delays, the system will handle it with busyloop?

Why multiply by two? Good question. Maybe there is a reserve for
stability. The value passed by the system to the set_next_event() should
be not lesser than this value, and theoretically, we should not
multiply MIN_OSCR_DELTA by two. As I can see, in many drivers there is
no such minimal values at all.

Added Robert

Regards,
Roman
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1301393

FromRussell King - ARM Linux <linux@arm.linux.org.uk>
Date2016-01-05 11:10 +0100
Message-ID<qNwIX-Cq-23@gated-at.bofh.it>
In reply to#1301380
On Tue, Jan 05, 2016 at 12:42:42PM +0300, Roman Volkov wrote:
> Why multiply by two? Good question. Maybe there is a reserve for
> stability. The value passed by the system to the set_next_event() should
> be not lesser than this value, and theoretically, we should not
> multiply MIN_OSCR_DELTA by two. As I can see, in many drivers there is
> no such minimal values at all.

It's a speciality of the StrongARM/PXA hardware.  It takes a certain
number of OSCR cycles for the value written to hit the compare registers.
So, if a very small delta is written (eg, the compare register is written
with a value of OSCR + 1), the OSCR will have incremented past this value
before it hits the underlying hardware.  The result is, that you end up
waiting a very long time for the OSCR to wrap before the event fires.

So, we introduce a check in set_next_event() to detect this and return
-ETIME if the calculated delta is too small, which causes the generic
clockevents code to retry after adding the min_delta specified in
clockevents_config_and_register() to the current time value.

min_delta must be sufficient that we don't re-trip the -ETIME check - if
we do, we will return -ETIME, forward the next event time, try to set it,
return -ETIME again, and basically lock the system up.  So, min_delta
must be larger than the check inside set_next_event().  A factor of two
was chosen to ensure that this situation would never occur.

The PXA code worked on PXA systems for years, and I'd suggest no one
changes this mechanism without access to a wide range of PXA systems,
otherwise they're risking breakage.

-- 
RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1301412

FromDaniel Lezcano <daniel.lezcano@linaro.org>
Date2016-01-05 11:40 +0100
Message-ID<qNxbY-O8-23@gated-at.bofh.it>
In reply to#1301393
On 01/05/2016 11:00 AM, Russell King - ARM Linux wrote:
> On Tue, Jan 05, 2016 at 12:42:42PM +0300, Roman Volkov wrote:
>> Why multiply by two? Good question. Maybe there is a reserve for
>> stability. The value passed by the system to the set_next_event() should
>> be not lesser than this value, and theoretically, we should not
>> multiply MIN_OSCR_DELTA by two. As I can see, in many drivers there is
>> no such minimal values at all.
>
> It's a speciality of the StrongARM/PXA hardware.  It takes a certain
> number of OSCR cycles for the value written to hit the compare registers.
> So, if a very small delta is written (eg, the compare register is written
> with a value of OSCR + 1), the OSCR will have incremented past this value
> before it hits the underlying hardware.  The result is, that you end up
> waiting a very long time for the OSCR to wrap before the event fires.
>
> So, we introduce a check in set_next_event() to detect this and return
> -ETIME if the calculated delta is too small, which causes the generic
> clockevents code to retry after adding the min_delta specified in
> clockevents_config_and_register() to the current time value.
>
> min_delta must be sufficient that we don't re-trip the -ETIME check - if
> we do, we will return -ETIME, forward the next event time, try to set it,
> return -ETIME again, and basically lock the system up.  So, min_delta
> must be larger than the check inside set_next_event().  A factor of two
> was chosen to ensure that this situation would never occur.

Russell,

thank you for taking the time to write this detailed explanation. I 
believe that clarifies everything (the issue with the lockup and the 
value of the min delta).

Roman,

If we are in the situation Russell is describing above, failing 
gracefully as mentioned before does not make sense.

Do you have a idea why this is happening with 4.2 and not before ?

> The PXA code worked on PXA systems for years, and I'd suggest no one
> changes this mechanism without access to a wide range of PXA systems,
> otherwise they're risking breakage.

Copy that :)


-- 
  <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1301448

FromRoman Volkov <v1ron@mail.ru>
Date2016-01-05 12:20 +0100
Message-ID<qNxOF-1jL-1@gated-at.bofh.it>
In reply to#1301412
В Tue, 5 Jan 2016 11:31:37 +0100
Daniel Lezcano <daniel.lezcano@linaro.org> пишет:

> On 01/05/2016 11:00 AM, Russell King - ARM Linux wrote:
> > On Tue, Jan 05, 2016 at 12:42:42PM +0300, Roman Volkov wrote:  
> >> Why multiply by two? Good question. Maybe there is a reserve for
> >> stability. The value passed by the system to the set_next_event()
> >> should be not lesser than this value, and theoretically, we should
> >> not multiply MIN_OSCR_DELTA by two. As I can see, in many drivers
> >> there is no such minimal values at all.  
> >
> > It's a speciality of the StrongARM/PXA hardware.  It takes a certain
> > number of OSCR cycles for the value written to hit the compare
> > registers. So, if a very small delta is written (eg, the compare
> > register is written with a value of OSCR + 1), the OSCR will have
> > incremented past this value before it hits the underlying
> > hardware.  The result is, that you end up waiting a very long time
> > for the OSCR to wrap before the event fires.
> >
> > So, we introduce a check in set_next_event() to detect this and
> > return -ETIME if the calculated delta is too small, which causes
> > the generic clockevents code to retry after adding the min_delta
> > specified in clockevents_config_and_register() to the current time
> > value.
> >
> > min_delta must be sufficient that we don't re-trip the -ETIME check
> > - if we do, we will return -ETIME, forward the next event time, try
> > to set it, return -ETIME again, and basically lock the system up.
> > So, min_delta must be larger than the check inside
> > set_next_event().  A factor of two was chosen to ensure that this
> > situation would never occur.  
> 
> Russell,
> 
> thank you for taking the time to write this detailed explanation. I 
> believe that clarifies everything (the issue with the lockup and the 
> value of the min delta).

Yes, thanks for the explanation how this exactly works! Some points
were not obvious.

> Roman,
> 
> If we are in the situation Russell is describing above, failing 
> gracefully as mentioned before does not make sense.
> 
> Do you have a idea why this is happening with 4.2 and not before ?

No, which change from c6eb3f70 caused this problem is unclear for me.
Maybe the new IRQ handling revealed this defect. What is obvious now,
the value passed to clockevents_config_and_register() was incorrect.

Regards,
Roman
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1301402

FromDaniel Lezcano <daniel.lezcano@linaro.org>
Date2016-01-05 11:20 +0100
Message-ID<qNwSC-GU-21@gated-at.bofh.it>
In reply to#1301380
On 01/05/2016 10:42 AM, Roman Volkov wrote:
> В Tue, 5 Jan 2016 10:01:07 +0100
> Daniel Lezcano <daniel.lezcano@linaro.org> пишет:
>
>> On 01/01/2016 02:24 PM, Roman Volkov wrote:
>>> From: Roman Volkov <rvolkov@v1ros.org>
>>>
>>> The vt8500 clocksource driver declares itself as capable to handle
>>> the minimum delay of 4 cycles by passing the value into
>>> clockevents_config_and_register(). The vt8500_timer_set_next_event()
>>> requires the passed cycles value to be at least 16. The impact is
>>> that userspace hangs in nanosleep() calls with small delay
>>> intervals.
>>>
>>> This problem is reproducible in Linux 4.2 starting from:
>>> c6eb3f70d448 ('hrtimer: Get rid of hrtimer softirq')
>>>
>>> Signed-off-by: Roman Volkov <rvolkov@v1ros.org>
>>> Acked-by: Alexey Charkov <alchark@gmail.com>
>>
>> Hi Roman,
>>
>> I looked at the email thread, and IIUC if set_next_event fails, the
>> system freeze. Your patch fixes the issue for your driver but not the
>> real issue because if set_next_event fails, at least a warning should
>> appear in the log or better nanosleep should fail gracefully.
>
> Hi Daniel,
>
> I agree, but if nanosleep will return immediately, this can lead to
> undefined behavior in the software.

The nanosleep syscall is supposed to return an error code. If the 
software does not pay attention to the syscall's return code, then the 
bug is in the software, it is not up to the kernel to work around it.

> Maybe the system can go busyloop
> to somehow recover from this state and print a message to the log? At
> the driver level it seems to be enough to fail the function without
> printing logs.
>
>> BTW why min delta is MIN_OSCR_DELTA * 2 in
>> clockevents_config_and_register ?
>
> All this just to be consistent with PXA. Maybe PXA works with lesser
> values, e.g., 8. For vt8500, accessing the registers is more complex,
> and this should consume more time. IIUC, if the driver does not support
> too small delays, the system will handle it with busyloop?

[ Added John Stultz and Thomas Gleixner ] to answer those questions above.

> Why multiply by two? Good question. Maybe there is a reserve for
> stability. The value passed by the system to the set_next_event() should
> be not lesser than this value, and theoretically, we should not
> multiply MIN_OSCR_DELTA by two. As I can see, in many drivers there is
> no such minimal values at all.
>
> Added Robert
>
> Regards,
> Roman
>


-- 
  <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web