qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] arm_mptimer: Fix timer shutdown
@ 2015-07-01 21:15 Dmitry Osipenko
  2015-07-02  9:27 ` Peter Maydell
  0 siblings, 1 reply; 11+ messages in thread
From: Dmitry Osipenko @ 2015-07-01 21:15 UTC (permalink / raw)
  To: Paolo Bonzini, Peter Maydell; +Cc: Dmitry Osipenko, qemu-devel

Timer, running in periodic mode, can't be stopped or coming one-shot tick
won't be canceled because timer control code just doesn't handle timer
disabling. Fix it by checking enable bit and deleting timer if bit isn't set.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
 hw/timer/arm_mptimer.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/hw/timer/arm_mptimer.c b/hw/timer/arm_mptimer.c
index 8b93b3c..917a10f 100644
--- a/hw/timer/arm_mptimer.c
+++ b/hw/timer/arm_mptimer.c
@@ -127,6 +127,9 @@ static void timerblock_write(void *opaque, hwaddr addr,
                 tb->count = tb->load;
             }
             timerblock_reload(tb, 1);
+        } else if (!(value & 1)) {
+            /* Shutdown timer.  */
+            timer_del(tb->timer);
         }
         break;
     case 12: /* Interrupt status.  */
-- 
2.4.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH] arm_mptimer: Fix timer shutdown
  2015-07-01 21:15 [Qemu-devel] [PATCH] arm_mptimer: Fix timer shutdown Dmitry Osipenko
@ 2015-07-02  9:27 ` Peter Maydell
  2015-07-02 12:10   ` Dmitry Osipenko
  0 siblings, 1 reply; 11+ messages in thread
From: Peter Maydell @ 2015-07-02  9:27 UTC (permalink / raw)
  To: Dmitry Osipenko; +Cc: Paolo Bonzini, Peter Crosthwaite, QEMU Developers

On 1 July 2015 at 22:15, Dmitry Osipenko <digetx@gmail.com> wrote:
> Timer, running in periodic mode, can't be stopped or coming one-shot tick
> won't be canceled because timer control code just doesn't handle timer
> disabling. Fix it by checking enable bit and deleting timer if bit isn't set.
>
> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
> ---
>  hw/timer/arm_mptimer.c | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/hw/timer/arm_mptimer.c b/hw/timer/arm_mptimer.c
> index 8b93b3c..917a10f 100644
> --- a/hw/timer/arm_mptimer.c
> +++ b/hw/timer/arm_mptimer.c
> @@ -127,6 +127,9 @@ static void timerblock_write(void *opaque, hwaddr addr,
>                  tb->count = tb->load;
>              }
>              timerblock_reload(tb, 1);
> +        } else if (!(value & 1)) {
> +            /* Shutdown timer.  */
> +            timer_del(tb->timer);
>          }
>          break;
>      case 12: /* Interrupt status.  */

Thanks; this does look like a bug. This change will mean we
call timer_del() even if the timer was already disabled,
though, so I think it would be slightly better to rearrange
the existing logic something like this:

  if ((old & 1) != (value & 1)) {
     if (value & 1) {
         if (tb->count == 0 && (tb->control & 2)) {
             tb->count = tb->load;
         }
         timerblock_reload(tb, 1);
     } else {
         timer_del(tb->timer);
     }
  }

thanks
-- PMM

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH] arm_mptimer: Fix timer shutdown
  2015-07-02  9:27 ` Peter Maydell
@ 2015-07-02 12:10   ` Dmitry Osipenko
  2015-07-02 17:20     ` [Qemu-devel] [PATCH v2] " Dmitry Osipenko
  0 siblings, 1 reply; 11+ messages in thread
From: Dmitry Osipenko @ 2015-07-02 12:10 UTC (permalink / raw)
  To: Peter Maydell; +Cc: Paolo Bonzini, Peter Crosthwaite, QEMU Developers

Hello Peter, thanks a lot for comment.

02.07.2015 12:27, Peter Maydell пишет:
> Thanks; this does look like a bug. This change will mean we
> call timer_del() even if the timer was already disabled,
> though, so I think it would be slightly better to rearrange
> the existing logic something like this:
>
>    if ((old & 1) != (value & 1)) {
>       if (value & 1) {
>           if (tb->count == 0 && (tb->control & 2)) {
>               tb->count = tb->load;
>           }
>           timerblock_reload(tb, 1);
>       } else {
>           timer_del(tb->timer);
>       }
>    }
>
> thanks
> -- PMM
>

Calling timer_del() twice is safe, but I agree that it would be better to avoid 
it. I'll send V2.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH v2] arm_mptimer: Fix timer shutdown
  2015-07-02 12:10   ` Dmitry Osipenko
@ 2015-07-02 17:20     ` Dmitry Osipenko
  2015-07-02 17:34       ` Peter Maydell
  0 siblings, 1 reply; 11+ messages in thread
From: Dmitry Osipenko @ 2015-07-02 17:20 UTC (permalink / raw)
  To: Peter Maydell; +Cc: Paolo Bonzini, Peter Crosthwaite, QEMU Developers

Timer, running in periodic mode, can't be stopped or coming one-shot tick
won't be canceled because timer control code just doesn't handle timer
disabling. Fix it by deleting timer if enable bit isn't set.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---

v2: Avoid calling timer_del() if the timer was already disabled as per
    Peter Maydell suggestion.

 hw/timer/arm_mptimer.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/hw/timer/arm_mptimer.c b/hw/timer/arm_mptimer.c
index 8b93b3c..51c18de 100644
--- a/hw/timer/arm_mptimer.c
+++ b/hw/timer/arm_mptimer.c
@@ -122,11 +122,17 @@ static void timerblock_write(void *opaque, hwaddr addr,
     case 8: /* Control.  */
         old = tb->control;
         tb->control = value;
-        if (((old & 1) == 0) && (value & 1)) {
+        if (((old & 1) == 0) && ((value & 1) == 0)) {
+            break;
+        }
+        if (value & 1) {
             if (tb->count == 0 && (tb->control & 2)) {
                 tb->count = tb->load;
             }
             timerblock_reload(tb, 1);
+        } else {
+            /* Shutdown timer.  */
+            timer_del(tb->timer);
         }
         break;
     case 12: /* Interrupt status.  */
-- 
2.4.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH v2] arm_mptimer: Fix timer shutdown
  2015-07-02 17:20     ` [Qemu-devel] [PATCH v2] " Dmitry Osipenko
@ 2015-07-02 17:34       ` Peter Maydell
  2015-07-02 17:43         ` Dmitry Osipenko
  2015-07-02 17:52         ` Dmitry Osipenko
  0 siblings, 2 replies; 11+ messages in thread
From: Peter Maydell @ 2015-07-02 17:34 UTC (permalink / raw)
  To: Dmitry Osipenko; +Cc: Paolo Bonzini, Peter Crosthwaite, QEMU Developers

On 2 July 2015 at 18:20, Dmitry Osipenko <digetx@gmail.com> wrote:
> Timer, running in periodic mode, can't be stopped or coming one-shot tick
> won't be canceled because timer control code just doesn't handle timer
> disabling. Fix it by deleting timer if enable bit isn't set.
>
> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
> ---
>
> v2: Avoid calling timer_del() if the timer was already disabled as per
>     Peter Maydell suggestion.
>
>  hw/timer/arm_mptimer.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/hw/timer/arm_mptimer.c b/hw/timer/arm_mptimer.c
> index 8b93b3c..51c18de 100644
> --- a/hw/timer/arm_mptimer.c
> +++ b/hw/timer/arm_mptimer.c
> @@ -122,11 +122,17 @@ static void timerblock_write(void *opaque, hwaddr addr,
>      case 8: /* Control.  */
>          old = tb->control;
>          tb->control = value;
> -        if (((old & 1) == 0) && (value & 1)) {
> +        if (((old & 1) == 0) && ((value & 1) == 0)) {
> +            break;
> +        }
> +        if (value & 1) {
>              if (tb->count == 0 && (tb->control & 2)) {
>                  tb->count = tb->load;
>              }
>              timerblock_reload(tb, 1);
> +        } else {
> +            /* Shutdown timer.  */
> +            timer_del(tb->timer);


This will now cause us to do the "reload the timer"
logic if you write a 1 to the control bit when it was
already 1, which we didn't do before.

The logic I suggested in my previous review
comment gets this right...

-- PMM

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH v2] arm_mptimer: Fix timer shutdown
  2015-07-02 17:34       ` Peter Maydell
@ 2015-07-02 17:43         ` Dmitry Osipenko
  2015-07-02 17:52         ` Dmitry Osipenko
  1 sibling, 0 replies; 11+ messages in thread
From: Dmitry Osipenko @ 2015-07-02 17:43 UTC (permalink / raw)
  To: Peter Maydell; +Cc: Paolo Bonzini, Peter Crosthwaite, QEMU Developers

02.07.2015 20:34, Peter Maydell пишет:
> On 2 July 2015 at 18:20, Dmitry Osipenko <digetx@gmail.com> wrote:
>> Timer, running in periodic mode, can't be stopped or coming one-shot tick
>> won't be canceled because timer control code just doesn't handle timer
>> disabling. Fix it by deleting timer if enable bit isn't set.
>>
>> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
>> ---
>>
>> v2: Avoid calling timer_del() if the timer was already disabled as per
>>      Peter Maydell suggestion.
>>
>>   hw/timer/arm_mptimer.c | 8 +++++++-
>>   1 file changed, 7 insertions(+), 1 deletion(-)
>>
>> diff --git a/hw/timer/arm_mptimer.c b/hw/timer/arm_mptimer.c
>> index 8b93b3c..51c18de 100644
>> --- a/hw/timer/arm_mptimer.c
>> +++ b/hw/timer/arm_mptimer.c
>> @@ -122,11 +122,17 @@ static void timerblock_write(void *opaque, hwaddr addr,
>>       case 8: /* Control.  */
>>           old = tb->control;
>>           tb->control = value;
>> -        if (((old & 1) == 0) && (value & 1)) {
>> +        if (((old & 1) == 0) && ((value & 1) == 0)) {
>> +            break;
>> +        }
>> +        if (value & 1) {
>>               if (tb->count == 0 && (tb->control & 2)) {
>>                   tb->count = tb->load;
>>               }
>>               timerblock_reload(tb, 1);
>> +        } else {
>> +            /* Shutdown timer.  */
>> +            timer_del(tb->timer);
>
>
> This will now cause us to do the "reload the timer"
> logic if you write a 1 to the control bit when it was
> already 1, which we didn't do before.
>
> The logic I suggested in my previous review
> comment gets this right...
>
> -- PMM
>

Yep, you right. I overlooked it, let me try again.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH v2] arm_mptimer: Fix timer shutdown
  2015-07-02 17:34       ` Peter Maydell
  2015-07-02 17:43         ` Dmitry Osipenko
@ 2015-07-02 17:52         ` Dmitry Osipenko
  2015-07-02 18:09           ` Peter Maydell
  1 sibling, 1 reply; 11+ messages in thread
From: Dmitry Osipenko @ 2015-07-02 17:52 UTC (permalink / raw)
  To: Peter Maydell; +Cc: Paolo Bonzini, Peter Crosthwaite, QEMU Developers

02.07.2015 20:34, Peter Maydell пишет:
>
> This will now cause us to do the "reload the timer"
> logic if you write a 1 to the control bit when it was
> already 1, which we didn't do before.
>
> The logic I suggested in my previous review
> comment gets this right...
>
> -- PMM
>

The problem with code you suggested is that won't start periodic count after 
one-shot tick was completed.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH v2] arm_mptimer: Fix timer shutdown
  2015-07-02 17:52         ` Dmitry Osipenko
@ 2015-07-02 18:09           ` Peter Maydell
  2015-07-02 18:43             ` Dmitry Osipenko
  0 siblings, 1 reply; 11+ messages in thread
From: Peter Maydell @ 2015-07-02 18:09 UTC (permalink / raw)
  To: Dmitry Osipenko; +Cc: Paolo Bonzini, Peter Crosthwaite, QEMU Developers

On 2 July 2015 at 18:52, Dmitry Osipenko <digetx@gmail.com> wrote:
> 02.07.2015 20:34, Peter Maydell пишет:
>>
>>
>> This will now cause us to do the "reload the timer"
>> logic if you write a 1 to the control bit when it was
>> already 1, which we didn't do before.
>>
>> The logic I suggested in my previous review
>> comment gets this right...
>>
>> -- PMM
>>
>
> The problem with code you suggested is that won't start periodic count after
> one-shot tick was completed.

Can you give more detail? This code is only for when
the guest writes to the control register, so it doesn't
get run when a one-shot tick completes.

In any case, the code currently in master does:
  old value   new value    action
      0           0          nothing
      0           1          reload timer
      1           0          nothing
      1           1          nothing

Your first patch did:

  old value   new value    action
      0           0          delete timer
      0           1          reload timer
      1           0          delete timer
      1           1          nothing

Your second patch does:

  old value   new value    action
      0           0          nothing
      0           1          reload timer
      1           0          delete timer
      1           1          reload timer

My suggestion was:

  old value   new value    action
      0           0          nothing
      0           1          reload timer
      1           0          delete timer
      1           1          nothing

If you think that's wrong, then surely your first
patch also has the same problem?

thanks
-- PMM

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH v2] arm_mptimer: Fix timer shutdown
  2015-07-02 18:09           ` Peter Maydell
@ 2015-07-02 18:43             ` Dmitry Osipenko
  2015-07-02 18:50               ` Dmitry Osipenko
  2015-07-03 11:41               ` Dmitry Osipenko
  0 siblings, 2 replies; 11+ messages in thread
From: Dmitry Osipenko @ 2015-07-02 18:43 UTC (permalink / raw)
  To: Peter Maydell; +Cc: Paolo Bonzini, Peter Crosthwaite, QEMU Developers

02.07.2015 21:09, Peter Maydell пишет:
> On 2 July 2015 at 18:52, Dmitry Osipenko <digetx@gmail.com> wrote:
>> 02.07.2015 20:34, Peter Maydell пишет:
>>>
>>>
>>> This will now cause us to do the "reload the timer"
>>> logic if you write a 1 to the control bit when it was
>>> already 1, which we didn't do before.
>>>
>>> The logic I suggested in my previous review
>>> comment gets this right...
>>>
>>> -- PMM
>>>
>>
>> The problem with code you suggested is that won't start periodic count after
>> one-shot tick was completed.
>
> Can you give more detail? This code is only for when
> the guest writes to the control register, so it doesn't
> get run when a one-shot tick completes.
>
> In any case, the code currently in master does:
>    old value   new value    action
>        0           0          nothing
>        0           1          reload timer
>        1           0          nothing
>        1           1          nothing
>
> Your first patch did:
>
>    old value   new value    action
>        0           0          delete timer
>        0           1          reload timer
>        1           0          delete timer
>        1           1          nothing
>
> Your second patch does:
>
>    old value   new value    action
>        0           0          nothing
>        0           1          reload timer
>        1           0          delete timer
>        1           1          reload timer
>
> My suggestion was:
>
>    old value   new value    action
>        0           0          nothing
>        0           1          reload timer
>        1           0          delete timer
>        1           1          nothing
>
> If you think that's wrong, then surely your first
> patch also has the same problem?
>
> thanks
> -- PMM
>

Yes, my first patch has same problem. Noticed that issue couple hours ago, it's 
separate bug as I see now... Will make patch for it too.

To clarify new issue:
	1) load TIMER_LOAD with some value
	2) write (TIMER_CONTROL_ENABLE | TIMER_CONTROL_ONESHOT | 
TIMER_CONTROL_IT_ENABLE) to TIMER_CONTROL
	3) wait for one-shot complete
	4) re-load TIMER_LOAD
	5) write (TIMER_CONTROL_ENABLE | TIMER_CONTROL_PERIODIC | 
TIMER_CONTROL_IT_ENABLE) to TIMER_CONTROL <---- it won't start, bug


Oh, and just noticed that timer code doesn't handle IT(interrupt enable) bit. 
Will fix it too.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH v2] arm_mptimer: Fix timer shutdown
  2015-07-02 18:43             ` Dmitry Osipenko
@ 2015-07-02 18:50               ` Dmitry Osipenko
  2015-07-03 11:41               ` Dmitry Osipenko
  1 sibling, 0 replies; 11+ messages in thread
From: Dmitry Osipenko @ 2015-07-02 18:50 UTC (permalink / raw)
  To: Peter Maydell; +Cc: Paolo Bonzini, Peter Crosthwaite, QEMU Developers

02.07.2015 21:43, Dmitry Osipenko пишет:
> 02.07.2015 21:09, Peter Maydell пишет:
> TIMER_CONTROL_IT_ENABLE) to TIMER_CONTROL <---- it won't start, bug
>

s/it won't start/it won't start periodic/

-- 
Dmitry

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH v2] arm_mptimer: Fix timer shutdown
  2015-07-02 18:43             ` Dmitry Osipenko
  2015-07-02 18:50               ` Dmitry Osipenko
@ 2015-07-03 11:41               ` Dmitry Osipenko
  1 sibling, 0 replies; 11+ messages in thread
From: Dmitry Osipenko @ 2015-07-03 11:41 UTC (permalink / raw)
  To: Peter Maydell; +Cc: Paolo Bonzini, Peter Crosthwaite, QEMU Developers

02.07.2015 21:43, Dmitry Osipenko пишет:
>      4) re-load TIMER_LOAD
>

And 4-th step can be omitted.

Anyway, I already sent patches fixing this and IT issues.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2015-07-03 11:42 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-07-01 21:15 [Qemu-devel] [PATCH] arm_mptimer: Fix timer shutdown Dmitry Osipenko
2015-07-02  9:27 ` Peter Maydell
2015-07-02 12:10   ` Dmitry Osipenko
2015-07-02 17:20     ` [Qemu-devel] [PATCH v2] " Dmitry Osipenko
2015-07-02 17:34       ` Peter Maydell
2015-07-02 17:43         ` Dmitry Osipenko
2015-07-02 17:52         ` Dmitry Osipenko
2015-07-02 18:09           ` Peter Maydell
2015-07-02 18:43             ` Dmitry Osipenko
2015-07-02 18:50               ` Dmitry Osipenko
2015-07-03 11:41               ` 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).