bitkeeper revision 1.926 (40bd9cabtHdCYn95rortVN7FyCSxgg)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Wed, 2 Jun 2004 09:23:55 +0000 (09:23 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Wed, 2 Jun 2004 09:23:55 +0000 (09:23 +0000)
Clean up dom_mem_op hypercall.

.rootkeys
xen/common/dom_mem_ops.c
xen/include/hypervisor-ifs/arch-i386/hypervisor-if.h
xen/include/hypervisor-ifs/arch-x86_64/hypervisor-if.h
xen/include/hypervisor-ifs/dom_mem_ops.h [deleted file]
xen/include/hypervisor-ifs/hypervisor-if.h
xenolinux-2.4.26-sparse/arch/xen/drivers/balloon/balloon.c
xenolinux-2.4.26-sparse/arch/xen/drivers/netif/backend/main.c
xenolinux-2.4.26-sparse/arch/xen/drivers/netif/frontend/main.c
xenolinux-2.4.26-sparse/arch/xen/mm/hypervisor.c
xenolinux-2.4.26-sparse/include/asm-xen/hypervisor.h

index a799c9ffafd10961ec1e620bcad6a6f458593b55..65327c9853ad854f080706e06280ab540e01637d 100644 (file)
--- a/.rootkeys
+++ b/.rootkeys
 404f1bc7IwU-qnH8mJeVu0YsNGMrcw xen/include/hypervisor-ifs/arch-x86_64/hypervisor-if.h
 3ddb79c2YTaZwOqWin9-QNgHge5RVw xen/include/hypervisor-ifs/block.h
 3ddb79c2PMeWTK86y4C3F4MzHw4A1g xen/include/hypervisor-ifs/dom0_ops.h
-3e6377eaioRoNm0m_HSDEAd4Vqrq_w xen/include/hypervisor-ifs/dom_mem_ops.h
 403cd194j2pyLqXD8FJ-ukvZzkPenw xen/include/hypervisor-ifs/event_channel.h
 3ddb79c25UE59iu4JJcbRalx95mvcg xen/include/hypervisor-ifs/hypervisor-if.h
 3ead095dE_VF-QA88rl_5cWYRWtRVQ xen/include/hypervisor-ifs/kbd.h
index fcc4977beea975245bd2cf6f7fe820967520f3fb..97b2ffc0f15cc5340cf7dd64a44666ec37675647 100644 (file)
 #include <xen/types.h>
 #include <xen/lib.h>
 #include <xen/mm.h>
-#include <hypervisor-ifs/dom_mem_ops.h>
 #include <xen/perfc.h>
 #include <xen/sched.h>
 #include <xen/event.h>
 #include <asm/domain_page.h>
 
-static long alloc_dom_mem(struct task_struct *p, reservation_increase_t op)
+static long alloc_dom_mem(struct task_struct *p, 
+                          unsigned long      *pages, 
+                          unsigned long       nr_pages)
 {
     struct pfn_info *page;
     unsigned long    i;
 
     /* Leave some slack pages; e.g., for the network. */
-    if ( unlikely(free_pfns < (op.size + (SLACK_DOMAIN_MEM_KILOBYTES >> 
-                                          (PAGE_SHIFT-10)))) )
+    if ( unlikely(free_pfns < (nr_pages + (SLACK_DOMAIN_MEM_KILOBYTES >> 
+                                           (PAGE_SHIFT-10)))) )
     {
         DPRINTK("Not enough slack: %u %u\n",
                 free_pfns,
@@ -31,7 +32,7 @@ static long alloc_dom_mem(struct task_struct *p, reservation_increase_t op)
         return 0;
     }
 
-    for ( i = 0; i < op.size; i++ )
+    for ( i = 0; i < nr_pages; i++ )
     {
         /* NB. 'alloc_domain_page' does limit-checking on pages per domain. */
         if ( unlikely((page = alloc_domain_page(p)) == NULL) )
@@ -41,22 +42,24 @@ static long alloc_dom_mem(struct task_struct *p, reservation_increase_t op)
         }
 
         /* Inform the domain of the new page's machine address. */ 
-        if ( unlikely(put_user(page_to_pfn(page), &op.pages[i]) != 0) )
+        if ( unlikely(put_user(page_to_pfn(page), &pages[i]) != 0) )
             break;
     }
 
     return i;
 }
     
-static long free_dom_mem(struct task_struct *p, reservation_decrease_t op)
+static long free_dom_mem(struct task_struct *p, 
+                         unsigned long      *pages, 
+                         unsigned long       nr_pages)
 {
     struct pfn_info *page;
     unsigned long    i, mpfn;
     long             rc = 0;
 
-    for ( i = 0; i < op.size; i++ )
+    for ( i = 0; i < nr_pages; i++ )
     {
-        if ( unlikely(get_user(mpfn, &op.pages[i]) != 0) )
+        if ( unlikely(get_user(mpfn, &pages[i]) != 0) )
             break;
 
         if ( unlikely(mpfn >= max_page) )
@@ -84,31 +87,16 @@ static long free_dom_mem(struct task_struct *p, reservation_decrease_t op)
         put_page(page);
     }
 
-    return rc ? rc : op.size;
+    return rc ? rc : nr_pages;
 }
     
-long do_dom_mem_op(dom_mem_op_t *mem_op)
+long do_dom_mem_op(unsigned int op, void *pages, unsigned long nr_pages)
 {
-    dom_mem_op_t dmop;
-    unsigned long ret;
+    if ( op == MEMOP_increase_reservation )
+        return alloc_dom_mem(current, pages, nr_pages);
 
-    if ( copy_from_user(&dmop, mem_op, sizeof(dom_mem_op_t)) )
-        return -EFAULT;
+    if ( op == MEMOP_decrease_reservation )
+        return free_dom_mem(current, pages, nr_pages);
 
-    switch ( dmop.op )
-    {
-    case MEMOP_RESERVATION_INCREASE:
-        ret = alloc_dom_mem(current, dmop.u.increase);
-        break;
-
-    case MEMOP_RESERVATION_DECREASE:
-        ret = free_dom_mem(current, dmop.u.decrease);
-        break;
-
-    default:
-        ret = -ENOSYS;
-        break;
-    }
-
-    return ret;    
+    return -ENOSYS;
 }
index b1860260e511d5c2e1fde4c5c3072d92c7e08c3a..e660a0438dba32fb1e581d34cc0869ee27c982ee 100644 (file)
@@ -66,7 +66,7 @@ typedef struct trap_info_st
 {
     unsigned char  vector;  /* exception vector                              */
     unsigned char  flags;   /* 0-3: privilege level; 4: clear event enable?  */
-    unsigned short cs;     /* code selector                                 */
+    unsigned short cs;      /* code selector                                 */
     unsigned long  address; /* code address                                  */
 } trap_info_t;
 
index 932efab07d93cf36b70dc881b39a0525135a1312..12cc5f6b1c781917c0063effb2ec57cccf90143e 100644 (file)
@@ -31,9 +31,9 @@
  * installing their own GDT.
  */
 
-#define FLAT_RING3_CS32 0x0823 /* GDT index 260 */
-#define FLAT_RING3_CS64 0x082b /* GDT index 261 */
-#define FLAT_RING3_DS 0x0833   /* GDT index 262 */
+#define FLAT_RING3_CS32 0x0823  /* GDT index 260 */
+#define FLAT_RING3_CS64 0x082b  /* GDT index 261 */
+#define FLAT_RING3_DS   0x0833  /* GDT index 262 */
 
 #define FLAT_GUESTOS_DS   FLAT_RING3_DS
 #define FLAT_GUESTOS_CS   FLAT_RING3_CS64
@@ -46,7 +46,7 @@
 /* And the trap vector is... */
 #define TRAP_INSTR "syscall"
 
-
+/* The machine->physical mapping table starts at this address, read-only. */
 #ifndef machine_to_phys_mapping
 #define machine_to_phys_mapping ((unsigned long *)0xffff810000000000ULL)
 #endif
@@ -64,7 +64,7 @@ typedef struct trap_info_st
 {
     unsigned char  vector;  /* exception vector                              */
     unsigned char  flags;   /* 0-3: privilege level; 4: clear event enable?  */
-    unsigned short cs;     /* code selector                                 */
+    unsigned short cs;      /* code selector                                 */
     unsigned long  address; /* code address                                  */
 } trap_info_t;
 
diff --git a/xen/include/hypervisor-ifs/dom_mem_ops.h b/xen/include/hypervisor-ifs/dom_mem_ops.h
deleted file mode 100644 (file)
index e93a0c4..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/******************************************************************************
- * dom_mem_ops.h
- *
- * Guest OS operations dealing with physical memory reservations.
- *
- * Copyright (c) 2003, B Dragovic & K A Fraser.
- */
-
-#define MEMOP_RESERVATION_INCREASE 0
-#define MEMOP_RESERVATION_DECREASE 1
-
-typedef struct reservation_increase {
-    unsigned long   size;
-    unsigned long   * pages;
-} reservation_increase_t;
-
-typedef struct reservation_decrease {
-    unsigned long   size;
-    unsigned long   * pages;
-} reservation_decrease_t;
-
-typedef struct dom_mem_op
-{
-    unsigned int op;
-    union
-    {
-        reservation_increase_t increase;
-        reservation_decrease_t decrease;
-    } u;
-} dom_mem_op_t;
index efe34e2184120f8a7d968492158c18f514ade400..57b9dff13fb297f381029516363070dd928bbfaa 100644 (file)
@@ -56,7 +56,6 @@
  * 
  * Virtual interrupts that a guest OS may receive from the hypervisor.
  */
-
 #define VIRQ_BLKDEV     0  /* A block device response has been queued. */
 #define VIRQ_TIMER      1  /* A timeout has been updated. */
 #define VIRQ_DIE        2  /* OS is about to be killed. Clean up please! */
 
 
 /*
- * SCHEDOP_* - Scheduler hypercall operations.
+ * Commands to HYPERVISOR_sched_op().
  */
 #define SCHEDOP_yield           0   /* Give up the CPU voluntarily.      */
 #define SCHEDOP_block           1   /* Block until an event is received. */
 #define CONSOLEIO_write         0
 #define CONSOLEIO_read          1
 
+/*
+ * Commands to HYPERVISOR_dom_mem_op().
+ */
+#define MEMOP_increase_reservation 0
+#define MEMOP_decrease_reservation 1
+
 #ifndef __ASSEMBLY__
 
 typedef u64 domid_t;
index aee0e4cf990f57de91c35fa1ea9fc03f064cc0e9..56237380f3a232741a13e80240a1b32748d46155 100644 (file)
@@ -24,8 +24,6 @@
 #include <asm/uaccess.h>
 #include <asm/tlb.h>
 
-#include <asm/hypervisor-ifs/dom_mem_ops.h>
-
 /* USER DEFINES -- THESE SHOULD BE COPIED TO USER-SPACE TOOLS */
 #define USER_INFLATE_BALLOON  1   /* return mem to hypervisor */
 #define USER_DEFLATE_BALLOON  2   /* claim mem from hypervisor */
@@ -59,7 +57,6 @@ static inline pte_t *get_ptep(unsigned long addr)
 /* main function for relinquishing bit of memory */
 static unsigned long inflate_balloon(unsigned long num_pages)
 {
-    dom_mem_op_t dom_mem_op;
     unsigned long *parray;
     unsigned long *currp;
     unsigned long curraddr;
@@ -67,19 +64,18 @@ static unsigned long inflate_balloon(unsigned long num_pages)
     unsigned long vaddr;
     unsigned long i, j;
 
-    parray = (unsigned long *)kmalloc(num_pages *
-                                      sizeof(unsigned long), GFP_KERNEL);
+    parray = (unsigned long *)kmalloc(num_pages * sizeof(unsigned long),
+                                      GFP_KERNEL);
     currp = parray;
 
     for ( i = 0; i < num_pages; i++ )
     {
-        /* try to obtain a free page, has to be done with GFP_ATOMIC
-         * as we do not want to sleep indefinately.
-         */
+        /* Try to obtain a free page (has to be done with GFP_ATOMIC). */
         vaddr = __get_free_page(GFP_ATOMIC);
 
-        /* if allocation fails, free all reserved pages */
-        if(!vaddr){
+        /* If allocation fails then free all reserved pages. */
+        if ( vaddr == 0 )
+        {
             printk("Unable to inflate balloon by %ld, only %ld pages free.",
                    num_pages, i);
             currp = parray;
@@ -105,10 +101,9 @@ static unsigned long inflate_balloon(unsigned long num_pages)
 
     XEN_flush_page_update_queue();
 
-    dom_mem_op.op = MEMOP_RESERVATION_DECREASE;
-    dom_mem_op.u.decrease.size  = num_pages;
-    dom_mem_op.u.decrease.pages = parray;
-    if ( (ret = HYPERVISOR_dom_mem_op(&dom_mem_op)) != num_pages )
+    ret = HYPERVISOR_dom_mem_op(MEMOP_decrease_reservation, 
+                                parray, num_pages);
+    if ( unlikely(ret != num_pages) )
     {
         printk("Unable to inflate balloon, error %lx\n", ret);
         goto cleanup;
@@ -177,12 +172,9 @@ static unsigned long process_new_pages(unsigned long * parray,
 
 unsigned long deflate_balloon(unsigned long num_pages)
 {
-    dom_mem_op_t dom_mem_op;
     unsigned long ret;
     unsigned long * parray;
 
-    printk(KERN_ALERT "bd240 debug: deflate balloon called for %lx pages\n", num_pages);
-
     if ( num_pages > credit )
     {
         printk("Can not allocate more pages than previously released.\n");
@@ -192,15 +184,16 @@ unsigned long deflate_balloon(unsigned long num_pages)
     parray = (unsigned long *)kmalloc(num_pages * sizeof(unsigned long), 
                                       GFP_KERNEL);
 
-    dom_mem_op.op = MEMOP_RESERVATION_INCREASE;
-    dom_mem_op.u.increase.size = num_pages;
-    dom_mem_op.u.increase.pages = parray;
-    if((ret = HYPERVISOR_dom_mem_op(&dom_mem_op)) != num_pages){
+    ret = HYPERVISOR_dom_mem_op(MEMOP_increase_reservation, 
+                                parray, num_pages);
+    if ( unlikely(ret != num_pages) )
+    {
         printk("Unable to deflate balloon, error %lx\n", ret);
         goto cleanup;
     }
 
-    if((ret = process_new_pages(parray, num_pages)) < num_pages){
+    if ( (ret = process_new_pages(parray, num_pages)) < num_pages )
+    {
         printk("Unable to deflate balloon by specified %lx pages, only %lx.\n",
                num_pages, ret);
         goto cleanup;
@@ -255,8 +248,7 @@ static int __init init_module(void)
 
     credit = 0;
 
-    balloon_pde = create_xen_proc_entry("balloon", 0600);
-    if ( balloon_pde == NULL )
+    if ( (balloon_pde = create_xen_proc_entry("balloon", 0600)) == NULL )
     {
         printk(KERN_ALERT "Unable to create balloon driver proc entry!");
         return -1;
index a60877614fcaf35005c1201276d096b648aad29a..33e1fde9120b3d453a3e482179bbff1f33d683d9 100644 (file)
@@ -11,7 +11,6 @@
  */
 
 #include "common.h"
-#include <asm/hypervisor-ifs/dom_mem_ops.h>
 
 static void netif_page_release(struct page *page);
 static void make_tx_response(netif_t *netif, 
@@ -80,12 +79,9 @@ static spinlock_t mfn_lock = SPIN_LOCK_UNLOCKED;
 
 static void __refresh_mfn_list(void)
 {
-    int ret;
-    dom_mem_op_t op;
-    op.op = MEMOP_RESERVATION_INCREASE;
-    op.u.increase.size  = MAX_MFN_ALLOC;
-    op.u.increase.pages = mfn_list;
-    if ( (ret = HYPERVISOR_dom_mem_op(&op)) != MAX_MFN_ALLOC )
+    int ret = HYPERVISOR_dom_mem_op(MEMOP_increase_reservation,
+                                    mfn_list, MAX_MFN_ALLOC);
+    if ( unlikely(ret != MAX_MFN_ALLOC) )
     {
         printk(KERN_ALERT "Unable to increase memory reservation (%d)\n", ret);
         BUG();
@@ -107,21 +103,11 @@ static unsigned long get_new_mfn(void)
 static void dealloc_mfn(unsigned long mfn)
 {
     unsigned long flags;
-    dom_mem_op_t  op;
-
     spin_lock_irqsave(&mfn_lock, flags);
     if ( alloc_index != MAX_MFN_ALLOC )
-    {
-        /* Usually we can put the MFN back on the quicklist. */
         mfn_list[alloc_index++] = mfn;
-    }
     else
-    {
-        op.op = MEMOP_RESERVATION_INCREASE;
-        op.u.decrease.size  = 1;
-        op.u.decrease.pages = &mfn;
-        (void)HYPERVISOR_dom_mem_op(&op);
-    }
+        (void)HYPERVISOR_dom_mem_op(MEMOP_decrease_reservation, &mfn, 1);
     spin_unlock_irqrestore(&mfn_lock, flags);
 }
 
index 0d27bdaeb246e730dbebb2ce0a9ebcdab4053808..0b4638c357b4c62560c0f733a859625eafad3642 100644 (file)
@@ -27,7 +27,6 @@
 
 #include <asm/evtchn.h>
 #include <asm/ctrl_if.h>
-#include <asm/hypervisor-ifs/dom_mem_ops.h>
 
 #include "../netif.h"
 
@@ -181,7 +180,6 @@ static void network_alloc_rx_buffers(struct net_device *dev)
     struct net_private *np = dev->priv;
     struct sk_buff *skb;
     NETIF_RING_IDX i = np->rx->req_prod;
-    dom_mem_op_t op;
     int nr_pfns = 0;
 
     /* Make sure the batch is large enough to be worthwhile (1/2 ring). */
@@ -225,11 +223,10 @@ static void network_alloc_rx_buffers(struct net_device *dev)
     rx_mcl[nr_pfns-1].args[2] = UVMF_FLUSH_TLB;
 
     /* Give away a batch of pages. */
-    op.op = MEMOP_RESERVATION_DECREASE;
-    op.u.decrease.size  = nr_pfns;
-    op.u.decrease.pages = rx_pfn_array;
     rx_mcl[nr_pfns].op = __HYPERVISOR_dom_mem_op;
-    rx_mcl[nr_pfns].args[0] = (unsigned long)&op;
+    rx_mcl[nr_pfns].args[0] = MEMOP_decrease_reservation;
+    rx_mcl[nr_pfns].args[1] = (unsigned long)rx_pfn_array;
+    rx_mcl[nr_pfns].args[2] = (unsigned long)nr_pfns;
 
     /* Zap PTEs and give away pages in one big multicall. */
     (void)HYPERVISOR_multicall(rx_mcl, nr_pfns+1);
index 1b73feee3564531eb6dc7dde7e773de139da774b..6a31649392c8e93dc77fda2a30aa84f42bd0ef24 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/mm.h>
 #include <linux/vmalloc.h>
 #include <asm/hypervisor.h>
-#include <asm/hypervisor-ifs/dom_mem_ops.h>
 #include <asm/page.h>
 #include <asm/pgtable.h>
 #include <asm/multicall.h>
@@ -269,7 +268,6 @@ unsigned long allocate_empty_lowmem_region(unsigned long pages)
     unsigned long  i;
     int            ret;
     unsigned int   order = get_order(pages*PAGE_SIZE);
-    dom_mem_op_t   dom_mem_op;
 
     vstart = __get_free_pages(GFP_KERNEL, order);
     if ( vstart == 0 )
@@ -291,10 +289,9 @@ unsigned long allocate_empty_lowmem_region(unsigned long pages)
 
     flush_page_update_queue();
 
-    dom_mem_op.op = MEMOP_RESERVATION_DECREASE;
-    dom_mem_op.u.decrease.size  = 1<<order;
-    dom_mem_op.u.decrease.pages = pfn_array;
-    if ( (ret = HYPERVISOR_dom_mem_op(&dom_mem_op)) != (1<<order) )
+    ret = HYPERVISOR_dom_mem_op(MEMOP_decrease_reservation, 
+                                pfn_array, 1<<order);
+    if ( unlikely(ret != (1<<order)) )
     {
         printk(KERN_WARNING "Unable to reduce memory reservation (%d)\n", ret);
         BUG();
@@ -314,16 +311,14 @@ void deallocate_lowmem_region(unsigned long vstart, unsigned long pages)
     unsigned long  i;
     int            ret;
     unsigned int   order = get_order(pages*PAGE_SIZE);
-    dom_mem_op_t   dom_mem_op;
 
     pfn_array = vmalloc((1<<order) * sizeof(*pfn_array));
     if ( pfn_array == NULL )
         BUG();
 
-    dom_mem_op.op = MEMOP_RESERVATION_INCREASE;
-    dom_mem_op.u.increase.size  = 1<<order;
-    dom_mem_op.u.increase.pages = pfn_array;
-    if ( (ret = HYPERVISOR_dom_mem_op(&dom_mem_op)) != (1<<order) )
+    ret = HYPERVISOR_dom_mem_op(MEMOP_increase_reservation,
+                                pfn_array, 1<<order);
+    if ( unlikely(ret != (1<<order)) )
     {
         printk(KERN_WARNING "Unable to increase memory reservation (%d)\n",
                ret);
index a2f9653b6f84f83d2e8765f58028a4bb01fdfb68..54e1522c7263e227cc93d754941b9cc25a9c2202 100644 (file)
@@ -368,13 +368,15 @@ static inline int HYPERVISOR_set_fast_trap(int idx)
     return ret;
 }
 
-static inline int HYPERVISOR_dom_mem_op(void *dom_mem_op)
+static inline int HYPERVISOR_dom_mem_op(unsigned int   op,
+                                        unsigned long *pages,
+                                        unsigned long  nr_pages)
 {
     int ret;
     __asm__ __volatile__ (
         TRAP_INSTR
         : "=a" (ret) : "0" (__HYPERVISOR_dom_mem_op),
-        "b" (dom_mem_op) : "memory" );
+        "b" (op), "c" (pages), "d" (nr_pages) : "memory" );
 
     return ret;
 }