|  |  | 
  
    |  |  | 
 
  |   |  | 
  
    |  |  | 
  
    |  |  | 
  
    |   xen-devel
Re: [Xen-devel] [PATCH] x86/hvm/pmtimer: improving scalability of	virtua 
| 
It can be as follows:
@@ -90,8 +90,8 @@ 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;
-    s->pm.tmr_val &= TMR_VAL_MASK;
+    *(volatile uint32_t *)&s->pm.tmr_val = (s->pm.tmr_val +
+        (((curr_gtime - s->last_gtime) * s->scale) >> 32)) &  
TMR_VAL_MASK;
     s->last_gtime = curr_gtime;
     /* If the counter's MSB has changed, set the status bit */
but it seems gcc (gcc 4.4.4) has omitted the statement s->pm.tmr_val  
&= TMR_VAL_MASK;
in the object file
在 2010-11-17,下午2:47, Tim Deegan 写道:
 
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
 | 
 |  | 
  
    |  |  |