|
|
|
|
|
|
|
|
|
|
xen-devel
Re: [Xen-devel] [PATCH] x86/hvm/pmtimer: improving scalability of virtua
At 21:39 +0000 on 17 Nov (1290029945), Song Xiang wrote:
> diff --git a/xen/arch/x86/hvm/pmtimer.c b/xen/arch/x86/hvm/pmtimer.c
> index 48fe26a..587944f 100644
> --- a/xen/arch/x86/hvm/pmtimer.c
> +++ b/xen/arch/x86/hvm/pmtimer.c
> @@ -90,7 +90,7 @@ static void pmt_update_time(PMTState *s)
>
> /* Update the timer */
> curr_gtime = hvm_get_guest_time(s->vcpu);
> - s->pm.tmr_val += ((curr_gtime - s->last_gtime) * s->scale) >> 32;
> + *(volatile uint32_t *)&s->pm.tmr_val = s->pm.tmr_val + (((curr_gtime -
> s->last_gtime) * s->scale) >> 32);
> s->pm.tmr_val &= TMR_VAL_MASK;
> s->last_gtime = curr_gtime;
That doesn't make it an atomic update! The variable is still written
to twice. :) You need to calculate the new tmr_val in a scratch
variable, and then write it back once at the end of the function.
(And no 'volatile' wll be necessary).
Cheers,
Tim.
> @@ -206,10 +206,19 @@ static int handle_pmt_io(
>
> if ( dir == IOREQ_READ )
> {
> - spin_lock(&s->lock);
> - pmt_update_time(s);
> - *val = s->pm.tmr_val;
> - spin_unlock(&s->lock);
> + /*
> + * if acquired the PMTState lock then update the time
> + * else other vcpu is updating it ,it should be up to date.
> + */
> + if (spin_trylock(&s->lock)) {
> + pmt_update_time(s);
> + *val = s->pm.tmr_val;
> + spin_unlock(&s->lock);
> + }
> + else {
> + spin_barrier(&s->lock);
> + *val = s->pm.tmr_val;
> + }
> return X86EMUL_OKAY;
> }
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
--
Tim Deegan <Tim.Deegan@xxxxxxxxxx>
Principal Software Engineer, Xen Platform Team
Citrix Systems UK Ltd. (Company #02937203, SL9 0BG)
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
|
|
|
|