Re: [PATCH] kvm: fix i8254 counter 0 wraparound

2012-12-18 Thread Gleb Natapov
On Sat, Dec 15, 2012 at 06:34:37AM -0500, Nickolai Zeldovich wrote:
> The kvm i8254 emulation for counter 0 (but not for counters 1 and 2)
> has at least two bugs in mode 0:
> 
> 1. The OUT bit, computed by pit_get_out(), is never set high.
> 
> 2. The counter value, computed by pit_get_count(), wraps back around to
>the initial counter value, rather than wrapping back to 0x
>(which is the behavior described in the comment in __kpit_elapsed,
>the behavior implemented by qemu, and the behavior observed on AMD
>hardware).
> 
> The bug stems from __kpit_elapsed computing the elapsed time mod the
> initial counter value (stored as nanoseconds in ps->period).  This is both
> unnecessary (none of the callers of kpit_elapsed expect the value to be
> at most the initial counter value) and incorrect (it causes pit_get_count
> to appear to wrap around to the initial counter value rather than 0x).
> Removing this mod from __kpit_elapsed fixes both of the above bugs.
> 
> Signed-off-by: Nickolai Zeldovich 
Applied, thanks!

> ---
>  arch/x86/kvm/i8254.c |1 -
>  1 file changed, 1 deletion(-)
> 
> diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
> index 11300d2..c1d30b2 100644
> --- a/arch/x86/kvm/i8254.c
> +++ b/arch/x86/kvm/i8254.c
> @@ -122,7 +122,6 @@ static s64 __kpit_elapsed(struct kvm *kvm)
>*/
>   remaining = hrtimer_get_remaining(>timer);
>   elapsed = ps->period - ktime_to_ns(remaining);
> - elapsed = mod_64(elapsed, ps->period);
>  
>   return elapsed;
>  }
> -- 
> 1.7.10.4

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


Re: [PATCH] kvm: fix i8254 counter 0 wraparound

2012-12-18 Thread Gleb Natapov
On Sat, Dec 15, 2012 at 06:34:37AM -0500, Nickolai Zeldovich wrote:
 The kvm i8254 emulation for counter 0 (but not for counters 1 and 2)
 has at least two bugs in mode 0:
 
 1. The OUT bit, computed by pit_get_out(), is never set high.
 
 2. The counter value, computed by pit_get_count(), wraps back around to
the initial counter value, rather than wrapping back to 0x
(which is the behavior described in the comment in __kpit_elapsed,
the behavior implemented by qemu, and the behavior observed on AMD
hardware).
 
 The bug stems from __kpit_elapsed computing the elapsed time mod the
 initial counter value (stored as nanoseconds in ps-period).  This is both
 unnecessary (none of the callers of kpit_elapsed expect the value to be
 at most the initial counter value) and incorrect (it causes pit_get_count
 to appear to wrap around to the initial counter value rather than 0x).
 Removing this mod from __kpit_elapsed fixes both of the above bugs.
 
 Signed-off-by: Nickolai Zeldovich nicko...@csail.mit.edu
Applied, thanks!

 ---
  arch/x86/kvm/i8254.c |1 -
  1 file changed, 1 deletion(-)
 
 diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
 index 11300d2..c1d30b2 100644
 --- a/arch/x86/kvm/i8254.c
 +++ b/arch/x86/kvm/i8254.c
 @@ -122,7 +122,6 @@ static s64 __kpit_elapsed(struct kvm *kvm)
*/
   remaining = hrtimer_get_remaining(ps-timer);
   elapsed = ps-period - ktime_to_ns(remaining);
 - elapsed = mod_64(elapsed, ps-period);
  
   return elapsed;
  }
 -- 
 1.7.10.4

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


Re: [PATCH] kvm: fix i8254 counter 0 wraparound

2012-12-17 Thread Marcelo Tosatti
On Sat, Dec 15, 2012 at 06:34:37AM -0500, Nickolai Zeldovich wrote:
> The kvm i8254 emulation for counter 0 (but not for counters 1 and 2)
> has at least two bugs in mode 0:
> 
> 1. The OUT bit, computed by pit_get_out(), is never set high.
> 
> 2. The counter value, computed by pit_get_count(), wraps back around to
>the initial counter value, rather than wrapping back to 0x
>(which is the behavior described in the comment in __kpit_elapsed,
>the behavior implemented by qemu, and the behavior observed on AMD
>hardware).
> 
> The bug stems from __kpit_elapsed computing the elapsed time mod the
> initial counter value (stored as nanoseconds in ps->period).  This is both
> unnecessary (none of the callers of kpit_elapsed expect the value to be
> at most the initial counter value) and incorrect (it causes pit_get_count
> to appear to wrap around to the initial counter value rather than 0x).
> Removing this mod from __kpit_elapsed fixes both of the above bugs.
> 
> Signed-off-by: Nickolai Zeldovich 
> ---
>  arch/x86/kvm/i8254.c |1 -
>  1 file changed, 1 deletion(-)
> 
> diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
> index 11300d2..c1d30b2 100644
> --- a/arch/x86/kvm/i8254.c
> +++ b/arch/x86/kvm/i8254.c
> @@ -122,7 +122,6 @@ static s64 __kpit_elapsed(struct kvm *kvm)
>*/
>   remaining = hrtimer_get_remaining(>timer);
>   elapsed = ps->period - ktime_to_ns(remaining);
> - elapsed = mod_64(elapsed, ps->period);
>  
>   return elapsed;
>  }

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


Re: [PATCH] kvm: fix i8254 counter 0 wraparound

2012-12-17 Thread Gleb Natapov
On Sat, Dec 15, 2012 at 06:34:37AM -0500, Nickolai Zeldovich wrote:
> The kvm i8254 emulation for counter 0 (but not for counters 1 and 2)
> has at least two bugs in mode 0:
> 
> 1. The OUT bit, computed by pit_get_out(), is never set high.
> 
> 2. The counter value, computed by pit_get_count(), wraps back around to
>the initial counter value, rather than wrapping back to 0x
>(which is the behavior described in the comment in __kpit_elapsed,
>the behavior implemented by qemu, and the behavior observed on AMD
>hardware).
> 
> The bug stems from __kpit_elapsed computing the elapsed time mod the
> initial counter value (stored as nanoseconds in ps->period).  This is both
> unnecessary (none of the callers of kpit_elapsed expect the value to be
> at most the initial counter value) and incorrect (it causes pit_get_count
> to appear to wrap around to the initial counter value rather than 0x).
> Removing this mod from __kpit_elapsed fixes both of the above bugs.
> 
> Signed-off-by: Nickolai Zeldovich 
Looks good to me. Marcelo, you were last touching the code. Can you look
at it too?

> ---
>  arch/x86/kvm/i8254.c |1 -
>  1 file changed, 1 deletion(-)
> 
> diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
> index 11300d2..c1d30b2 100644
> --- a/arch/x86/kvm/i8254.c
> +++ b/arch/x86/kvm/i8254.c
> @@ -122,7 +122,6 @@ static s64 __kpit_elapsed(struct kvm *kvm)
>*/
>   remaining = hrtimer_get_remaining(>timer);
>   elapsed = ps->period - ktime_to_ns(remaining);
> - elapsed = mod_64(elapsed, ps->period);
>  
>   return elapsed;
>  }
> -- 
> 1.7.10.4

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


Re: [PATCH] kvm: fix i8254 counter 0 wraparound

2012-12-17 Thread Gleb Natapov
On Sat, Dec 15, 2012 at 06:34:37AM -0500, Nickolai Zeldovich wrote:
 The kvm i8254 emulation for counter 0 (but not for counters 1 and 2)
 has at least two bugs in mode 0:
 
 1. The OUT bit, computed by pit_get_out(), is never set high.
 
 2. The counter value, computed by pit_get_count(), wraps back around to
the initial counter value, rather than wrapping back to 0x
(which is the behavior described in the comment in __kpit_elapsed,
the behavior implemented by qemu, and the behavior observed on AMD
hardware).
 
 The bug stems from __kpit_elapsed computing the elapsed time mod the
 initial counter value (stored as nanoseconds in ps-period).  This is both
 unnecessary (none of the callers of kpit_elapsed expect the value to be
 at most the initial counter value) and incorrect (it causes pit_get_count
 to appear to wrap around to the initial counter value rather than 0x).
 Removing this mod from __kpit_elapsed fixes both of the above bugs.
 
 Signed-off-by: Nickolai Zeldovich nicko...@csail.mit.edu
Looks good to me. Marcelo, you were last touching the code. Can you look
at it too?

 ---
  arch/x86/kvm/i8254.c |1 -
  1 file changed, 1 deletion(-)
 
 diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
 index 11300d2..c1d30b2 100644
 --- a/arch/x86/kvm/i8254.c
 +++ b/arch/x86/kvm/i8254.c
 @@ -122,7 +122,6 @@ static s64 __kpit_elapsed(struct kvm *kvm)
*/
   remaining = hrtimer_get_remaining(ps-timer);
   elapsed = ps-period - ktime_to_ns(remaining);
 - elapsed = mod_64(elapsed, ps-period);
  
   return elapsed;
  }
 -- 
 1.7.10.4

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


Re: [PATCH] kvm: fix i8254 counter 0 wraparound

2012-12-17 Thread Marcelo Tosatti
On Sat, Dec 15, 2012 at 06:34:37AM -0500, Nickolai Zeldovich wrote:
 The kvm i8254 emulation for counter 0 (but not for counters 1 and 2)
 has at least two bugs in mode 0:
 
 1. The OUT bit, computed by pit_get_out(), is never set high.
 
 2. The counter value, computed by pit_get_count(), wraps back around to
the initial counter value, rather than wrapping back to 0x
(which is the behavior described in the comment in __kpit_elapsed,
the behavior implemented by qemu, and the behavior observed on AMD
hardware).
 
 The bug stems from __kpit_elapsed computing the elapsed time mod the
 initial counter value (stored as nanoseconds in ps-period).  This is both
 unnecessary (none of the callers of kpit_elapsed expect the value to be
 at most the initial counter value) and incorrect (it causes pit_get_count
 to appear to wrap around to the initial counter value rather than 0x).
 Removing this mod from __kpit_elapsed fixes both of the above bugs.
 
 Signed-off-by: Nickolai Zeldovich nicko...@csail.mit.edu
 ---
  arch/x86/kvm/i8254.c |1 -
  1 file changed, 1 deletion(-)
 
 diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
 index 11300d2..c1d30b2 100644
 --- a/arch/x86/kvm/i8254.c
 +++ b/arch/x86/kvm/i8254.c
 @@ -122,7 +122,6 @@ static s64 __kpit_elapsed(struct kvm *kvm)
*/
   remaining = hrtimer_get_remaining(ps-timer);
   elapsed = ps-period - ktime_to_ns(remaining);
 - elapsed = mod_64(elapsed, ps-period);
  
   return elapsed;
  }

Reviewed-by: Marcelo Tosatti mtosa...@redhat.com
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/