mem_event: Clean up and remove over-sized paused_vcpus[] array.
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 15 Sep 2010 14:45:42 +0000 (15:45 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 15 Sep 2010 14:45:42 +0000 (15:45 +0100)
This cuts the size of the domain structure by around 30kB! It is now a
little over a page in size.

Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/arch/x86/mm/mem_event.c
xen/include/asm-x86/mem_event.h
xen/include/xen/sched.h

index 5f5e24a1343930a956ec6c16bdbcf5d52cf6a93c..5bf211d0a8443846fac02fc3ae6979e7ee6c2443 100644 (file)
 #include <asm/mem_event.h>
 #include <asm/mem_paging.h>
 
-
+/* for public/io/ring.h macros */
 #define xen_mb()   mb()
 #define xen_rmb()  rmb()
 #define xen_wmb()  wmb()
 
+#define mem_event_ring_lock_init(_d)  spin_lock_init(&(_d)->mem_event.ring_lock)
+#define mem_event_ring_lock(_d)       spin_lock(&(_d)->mem_event.ring_lock)
+#define mem_event_ring_unlock(_d)     spin_unlock(&(_d)->mem_event.ring_lock)
 
 #define MEM_EVENT_RING_THRESHOLD 4
 
-
-int mem_event_enable(struct domain *d, mfn_t ring_mfn, mfn_t shared_mfn)
+static int mem_event_enable(struct domain *d, mfn_t ring_mfn, mfn_t shared_mfn)
 {
     int rc;
 
@@ -65,9 +67,6 @@ int mem_event_enable(struct domain *d, mfn_t ring_mfn, mfn_t shared_mfn)
 
     mem_event_ring_lock_init(d);
 
-    d->mem_event.paused = 0;
-    d->mem_event.enabled = 1;
-
     return 0;
 
  err_shared:
@@ -80,11 +79,8 @@ int mem_event_enable(struct domain *d, mfn_t ring_mfn, mfn_t shared_mfn)
     return 1;
 }
 
-int mem_event_disable(struct domain *d)
+static int mem_event_disable(struct domain *d)
 {
-    d->mem_event.enabled = 0;
-    d->mem_event.paused = 0;
-
     unmap_domain_page(d->mem_event.ring_page);
     d->mem_event.ring_page = NULL;
 
@@ -142,26 +138,14 @@ void mem_event_unpause_vcpus(struct domain *d)
 {
     struct vcpu *v;
 
-    for_each_vcpu(d, v)
-    {
-        if ( d->mem_event.paused_vcpus[v->vcpu_id] )
-        {
-            vcpu_unpause(v);
-            d->mem_event.paused_vcpus[v->vcpu_id] = 0;
-        }
-    }
-}
-
-int mem_event_pause_vcpu(struct domain *d, struct vcpu *v)
-{
-    vcpu_pause_nosync(v);
-    d->mem_event.paused_vcpus[v->vcpu_id] = 1;
-
-    return 0;
+    for_each_vcpu ( d, v )
+        if ( test_and_clear_bit(_VPF_mem_event, &v->pause_flags) )
+            vcpu_wake(v);
 }
 
 int mem_event_check_ring(struct domain *d)
 {
+    struct vcpu *curr = current;
     int free_requests;
     int ring_full;
 
@@ -170,8 +154,11 @@ int mem_event_check_ring(struct domain *d)
     free_requests = RING_FREE_REQUESTS(&d->mem_event.front_ring);
     ring_full = free_requests < MEM_EVENT_RING_THRESHOLD;
 
-    if ( (current->domain->domain_id == d->domain_id) && ring_full )
-        mem_event_pause_vcpu(d, current);
+    if ( (curr->domain->domain_id == d->domain_id) && ring_full )
+    {
+        set_bit(_VPF_mem_event, &curr->pause_flags);
+        vcpu_sleep_nosync(curr);
+    }
 
     mem_event_ring_unlock(d);
 
@@ -198,8 +185,9 @@ int mem_event_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec,
 
     if ( unlikely(d->vcpu == NULL) || unlikely(d->vcpu[0] == NULL) )
     {
-        MEM_EVENT_ERROR("Memory paging op on a domain (%u) with no vcpus\n",
-                         d->domain_id);
+        gdprintk(XENLOG_INFO,
+                 "Memory paging op on a domain (%u) with no vcpus\n",
+                 d->domain_id);
         return -EINVAL;
     }
 
index fd1d5c3ecbae7bdd16875a551767e06ff891e625..1a1abaa9fbc4f18f655a35230c79325640950b39 100644 (file)
 #ifndef __MEM_EVENT_H__
 #define __MEM_EVENT_H__
 
-
-/* Printouts */
-#define MEM_EVENT_PRINTK(_f, _a...)                                      \
-    debugtrace_printk("mem_event: %s(): " _f, __func__, ##_a)
-#define MEM_EVENT_ERROR(_f, _a...)                                       \
-    printk("mem_event error: %s(): " _f, __func__, ##_a)
-#define MEM_EVENT_DEBUG(flag, _f, _a...)                                 \
-    do {                                                                  \
-        if (MEM_EVENT_DEBUG_ ## flag)                                    \
-            debugtrace_printk("mem_event debug: %s(): " _f, __func__, ##_a); \
-    } while (0)
-
-
-#define mem_event_enabled(_d) (_d)->mem_event.enabled
-
-
-/* Ring lock */
-#define mem_event_ring_lock_init(_d)  spin_lock_init(&(_d)->mem_event.ring_lock)
-#define mem_event_ring_lock(_d)       spin_lock(&(_d)->mem_event.ring_lock)
-#define mem_event_ring_unlock(_d)     spin_unlock(&(_d)->mem_event.ring_lock)
-
-
-int mem_event_enable(struct domain *d, mfn_t ring_mfn, mfn_t shared_mfn);
-int mem_event_disable(struct domain *d);
-
 int mem_event_check_ring(struct domain *d);
 void mem_event_put_request(struct domain *d, mem_event_request_t *req);
 void mem_event_get_response(struct domain *d, mem_event_response_t *rsp);
index 7c2705c27b4556a085ebd352f8bf4d63db39b887..ca791eb1f65d8aada9e769bcff359f404defa74b 100644 (file)
@@ -188,15 +188,6 @@ struct mem_event_domain
     void *ring_page;
     /* front-end ring */
     mem_event_front_ring_t front_ring;
-    /* if domain has been paused due to ring contention */
-    bool_t paused;
-    int paused_vcpus[MAX_VIRT_CPUS];
-    /* the memory event mode */
-    unsigned long mode;
-    /* domain to receive memory events */
-    struct domain *domain;
-    /* enabled? */
-    bool_t enabled;
     /* event channel port (vcpu0 only) */
     int xen_port;
 };
@@ -581,6 +572,9 @@ extern struct domain *domain_list;
  /* VCPU affinity has changed: migrating to a new CPU. */
 #define _VPF_migrating       3
 #define VPF_migrating        (1UL<<_VPF_migrating)
+ /* VCPU is blocked on memory-event ring. */
+#define _VPF_mem_event       4
+#define VPF_mem_event        (1UL<<_VPF_mem_event)
 
 static inline int vcpu_runnable(struct vcpu *v)
 {