[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] More simplification and cleanup of the ac_timer interface.



ChangeSet 1.1553, 2005/05/25 15:28:37+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx

        More simplification and cleanup of the ac_timer interface.
        Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>



 arch/ia64/vlsapic.c      |   42 ++++-----------------------
 arch/x86/vmx_intercept.c |   15 +++------
 common/ac_timer.c        |   22 +++++---------
 common/sched_bvt.c       |   20 ++++--------
 common/sched_sedf.c      |    9 +++--
 common/schedule.c        |   31 ++++++-------------
 include/asm-ia64/vtm.h   |    1 
 include/xen/ac_timer.h   |   73 +++++++++++++++++++----------------------------
 8 files changed, 75 insertions(+), 138 deletions(-)


diff -Nru a/xen/arch/ia64/vlsapic.c b/xen/arch/ia64/vlsapic.c
--- a/xen/arch/ia64/vlsapic.c   2005-05-25 11:01:31 -04:00
+++ b/xen/arch/ia64/vlsapic.c   2005-05-25 11:01:31 -04:00
@@ -88,10 +88,10 @@
 }
 
 /* callback function when vtm_timer expires */
-static void vtm_timer_fn(unsigned long data)
+static void vtm_timer_fn(void *data)
 {
     vtime_t *vtm;
-    VCPU    *vcpu = (VCPU*)data;
+    VCPU    *vcpu = data;
     u64            cur_itc,vitm;
 
     UINT64  vec;
@@ -105,7 +105,6 @@
  //fire_itc2 = cur_itc;
  //fire_itm2 = vitm;
     update_last_itc(vtm,cur_itc);  // pseudo read to update vITC
-    vtm->timer_hooked = 0;
 }
 
 void vtm_init(VCPU *vcpu)
@@ -118,12 +117,7 @@
     itc_freq = local_cpu_data->itc_freq;
     vtm->cfg_max_jump=itc_freq*MAX_JUMP_STEP/1000;
     vtm->cfg_min_grun=itc_freq*MIN_GUEST_RUNNING_TIME/1000;
-    /* set up the actimer */
-    init_ac_timer(&(vtm->vtm_timer));
-    vtm->timer_hooked = 0;
-    vtm->vtm_timer.cpu = 0;     /* Init value for SMP case */
-    vtm->vtm_timer.data = (unsigned long)vcpu;
-    vtm->vtm_timer.function = vtm_timer_fn;
+    init_ac_timer(&vtm->vtm_timer, vtm_timer_fn, vcpu, 0);
     vtm_reset(vcpu);
 }
 
@@ -166,10 +160,8 @@
     vtm=&(vcpu->arch.arch_vmx.vtm);
     local_irq_save(spsr);
     itv = VPD_CR(vcpu, itv);
-    if ( ITV_IRQ_MASK(itv) && vtm->timer_hooked ) {
-        rem_ac_timer(&(vtm->vtm_timer));
-        vtm->timer_hooked = 0;
-    }
+    if ( ITV_IRQ_MASK(itv) )
+        rem_ac_timer(&vtm->vtm_timer);
     vtm_interruption_update(vcpu, vtm);
     local_irq_restore(spsr);
 }
@@ -204,25 +196,16 @@
     
     if ( diff_last >= 0 ) {
         // interrupt already fired.
-        if ( vtm->timer_hooked ) {
-            rem_ac_timer(&(vtm->vtm_timer));
-            vtm->timer_hooked = 0;          
-        }
+        rem_ac_timer(&vtm->vtm_timer);
     }
     else if ( diff_now >= 0 ) {
         // ITV is fired.
         vmx_vcpu_pend_interrupt(vcpu, vitv&0xff);
     }
     /* Both last_itc & cur_itc < itm, wait for fire condition */
-    else if ( vtm->timer_hooked ) {
-        expires = NOW() + tick_to_ns(0-diff_now) + TIMER_SLOP;
-        set_ac_timer(&vtm->vtm_timer, expires);
-    }
     else {
         expires = NOW() + tick_to_ns(0-diff_now) + TIMER_SLOP;
-        vtm->vtm_timer.cpu = vcpu->processor;
         set_ac_timer(&vtm->vtm_timer, expires);
-        vtm->timer_hooked = 1;
     }
     local_irq_restore(spsr);
 }
@@ -233,16 +216,7 @@
  */
 void vtm_domain_out(VCPU *vcpu)
 {
-    vtime_t     *vtm;
-    uint64_t    spsr;
-    
-    vtm=&(vcpu->arch.arch_vmx.vtm);
-    local_irq_save(spsr);
-    if ( vtm->timer_hooked ) {
-        rem_ac_timer(&(vtm->vtm_timer));
-        vtm->timer_hooked = 0;
-    }
-    local_irq_restore(spsr);
+    rem_ac_timer(&vcpu->arch.arch_vmx.vtm.vtm_timer);
 }
 
 /*
@@ -256,8 +230,6 @@
     vtm=&(vcpu->arch.arch_vmx.vtm);
     vtm_interruption_update(vcpu, vtm);
 }
-
-
 
 /*
  * Next for vLSapic
diff -Nru a/xen/arch/x86/vmx_intercept.c b/xen/arch/x86/vmx_intercept.c
--- a/xen/arch/x86/vmx_intercept.c      2005-05-25 11:01:31 -04:00
+++ b/xen/arch/x86/vmx_intercept.c      2005-05-25 11:01:31 -04:00
@@ -189,13 +189,13 @@
 }
 
 /* hooks function for the PIT initialization response iopacket */
-static void pit_timer_fn(unsigned long data)
+static void pit_timer_fn(void *data)
 {
-    struct vmx_virpit_t *vpit = (struct vmx_virpit_t*)data;
+    struct vmx_virpit_t *vpit = data;
 
-    /*set the pending intr bit in shared page, send evtchn notification to 
myself*/
+    /* Set the pending intr bit, and send evtchn notification to myself. */
     if (test_and_set_bit(vpit->vector, vpit->intr_bitmap))
-        vpit->pending_intr_nr++; /* if originaly set, then count the pending 
intr */
+        vpit->pending_intr_nr++; /* already set, then count the pending intr */
 
     set_ac_timer(&vpit->pit_timer, NOW() + MILLISECS(vpit->period));
 }
@@ -249,11 +249,8 @@
         vpit->intr_bitmap = intr;
 
         /* set up the actimer */
-        init_ac_timer(&(vpit->pit_timer));
-        vpit->pit_timer.cpu = 0; /*FIXME: change for SMP */
-        vpit->pit_timer.data = (unsigned long)vpit;
-        vpit->pit_timer.function = pit_timer_fn;
-        pit_timer_fn((unsigned long)vpit); /* timer seed */
+        init_ac_timer(&vpit->pit_timer, pit_timer_fn, vpit, 0);
+        pit_timer_fn(vpit); /* timer seed */
 
         /*restore the state*/
         p->state = STATE_IORESP_READY;
diff -Nru a/xen/common/ac_timer.c b/xen/common/ac_timer.c
--- a/xen/common/ac_timer.c     2005-05-25 11:01:31 -04:00
+++ b/xen/common/ac_timer.c     2005-05-25 11:01:31 -04:00
@@ -1,14 +1,8 @@
-/****************************************************************************
- * (C) 2002-2003 - Rolf Neugebauer - Intel Research Cambridge
- * (C) 2002-2003 University of Cambridge
- ****************************************************************************
- *
- *        File: ac_timer.c
- *      Author: Rolf Neugebauer (neugebar@xxxxxxxxxxxxx)
- *              Keir Fraser (kaf24@xxxxxxxxxxxx)
- *              
- * Environment: Xen Hypervisor
- * Description: Accurate timer for the Hypervisor
+/******************************************************************************
+ * ac_timer.c
+ * 
+ * Copyright (c) 2002-2003 Rolf Neugebauer
+ * Copyright (c) 2002-2005 K A Fraser
  */
 
 #include <xen/config.h>
@@ -202,7 +196,7 @@
     int              cpu = smp_processor_id();
     struct ac_timer *t, **heap;
     s_time_t         now;
-    void             (*fn)(unsigned long);
+    void             (*fn)(void *);
 
     ac_timers[cpu].softirqs++;
 
@@ -219,7 +213,7 @@
 
             if ( (fn = t->function) != NULL )
             {
-                unsigned long data = t->data;
+                void *data = t->data;
                 spin_unlock_irq(&ac_timers[cpu].lock);
                 (*fn)(data);
                 spin_lock_irq(&ac_timers[cpu].lock);
@@ -252,7 +246,7 @@
         for ( j = 1; j <= GET_HEAP_SIZE(ac_timers[i].heap); j++ )
         {
             t = ac_timers[i].heap[j];
-            printk ("  %d : %p ex=0x%08X%08X %lu\n",
+            printk ("  %d : %p ex=0x%08X%08X %p\n",
                     j, t, (u32)(t->expires>>32), (u32)t->expires, t->data);
         }
         spin_unlock_irqrestore(&ac_timers[i].lock, flags);
diff -Nru a/xen/common/sched_bvt.c b/xen/common/sched_bvt.c
--- a/xen/common/sched_bvt.c    2005-05-25 11:01:31 -04:00
+++ b/xen/common/sched_bvt.c    2005-05-25 11:01:31 -04:00
@@ -94,9 +94,9 @@
 
 
 /* Warp/unwarp timer functions */
-static void warp_timer_fn(unsigned long pointer)
+static void warp_timer_fn(void *data)
 {
-    struct bvt_dom_info *inf = (struct bvt_dom_info *)pointer;
+    struct bvt_dom_info *inf = data;
     unsigned int cpu = inf->domain->exec_domain[0]->processor;
     
     spin_lock_irq(&schedule_data[cpu].schedule_lock);
@@ -115,9 +115,9 @@
     spin_unlock_irq(&schedule_data[cpu].schedule_lock);
 }
 
-static void unwarp_timer_fn(unsigned long pointer)
+static void unwarp_timer_fn(void *data)
 {
-    struct bvt_dom_info *inf = (struct bvt_dom_info *)pointer;
+    struct bvt_dom_info *inf = data;
     unsigned int cpu = inf->domain->exec_domain[0]->processor;
 
     spin_lock_irq(&schedule_data[cpu].schedule_lock);
@@ -212,15 +212,9 @@
         inf->warp_value  = 0;
         inf->warpl       = MILLISECS(2000);
         inf->warpu       = MILLISECS(1000);
-        /* initialise the timers */
-        init_ac_timer(&inf->warp_timer);
-        inf->warp_timer.cpu = d->processor;
-        inf->warp_timer.data = (unsigned long)inf;
-        inf->warp_timer.function = &warp_timer_fn;
-        init_ac_timer(&inf->unwarp_timer);
-        inf->unwarp_timer.cpu = d->processor;
-        inf->unwarp_timer.data = (unsigned long)inf;
-        inf->unwarp_timer.function = &unwarp_timer_fn;
+        /* Initialise the warp timers. */
+        init_ac_timer(&inf->warp_timer, warp_timer_fn, inf, d->processor);
+        init_ac_timer(&inf->unwarp_timer, unwarp_timer_fn, inf, d->processor);
     }
 
     einf->exec_domain = d;
diff -Nru a/xen/common/sched_sedf.c b/xen/common/sched_sedf.c
--- a/xen/common/sched_sedf.c   2005-05-25 11:01:31 -04:00
+++ b/xen/common/sched_sedf.c   2005-05-25 11:01:31 -04:00
@@ -116,6 +116,7 @@
     struct list_head runnableq;
     struct list_head waitq;
     struct list_head extraq[2];
+    s_time_t         current_slice_expires;
 };
 
 #define EDOM_INFO(d)  ((struct sedf_edom_info *)((d)->sched_priv))
@@ -350,11 +351,12 @@
           d->vcpu_id);
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.