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

[Xen-changelog] Merge with xen-ia64-unstable.hg.



# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 9b108cf447e5801d2f07fa12754b4b68387bc0b9
# Parent  5a790011259e7ab8e50c53acc79dc006e7305298
# Parent  a4de51a2629f10bb12b2cea7dc4d2d5747e6ca78
Merge with xen-ia64-unstable.hg.

diff -r 5a790011259e -r 9b108cf447e5 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c   Wed Dec 21 
17:56:19 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c   Wed Dec 21 
18:52:00 2005
@@ -27,6 +27,12 @@
  * IN THE SOFTWARE.
  */
 
+#include <asm-xen/evtchn.h>
+#include <asm-xen/gnttab.h>
+#include <asm-xen/xenbus.h>
+
+/* xenbus_probe.c */
+extern char *kasprintf(const char *fmt, ...);
 
 #if 0
 #define DPRINTK(fmt, args...) \
@@ -36,11 +42,6 @@
 #endif
 
 
-#include <asm-xen/evtchn.h>
-#include <asm-xen/gnttab.h>
-#include <asm-xen/xenbus.h>
-
-
 int xenbus_watch_path(struct xenbus_device *dev, const char *path,
                      struct xenbus_watch *watch, 
                      void (*callback)(struct xenbus_watch *,
@@ -70,16 +71,11 @@
                                        const char **, unsigned int))
 {
        int err;
-       char *state =
-               kmalloc(strlen(path) + 1 + strlen(path2) + 1, GFP_KERNEL);
+       char *state = kasprintf("%s/%s", path, path2);
        if (!state) {
                xenbus_dev_fatal(dev, -ENOMEM, "allocating path for watch");
                return -ENOMEM;
        }
-       strcpy(state, path);
-       strcat(state, "/");
-       strcat(state, path2);
-
        err = xenbus_watch_path(dev, state, watch, callback);
 
        if (err) {
@@ -126,16 +122,7 @@
  */
 static char *error_path(struct xenbus_device *dev)
 {
-       char *path_buffer = kmalloc(strlen("error/") + strlen(dev->nodename) +
-                                   1, GFP_KERNEL);
-       if (path_buffer == NULL) {
-               return NULL;
-       }
-
-       strcpy(path_buffer, "error/");
-       strcpy(path_buffer + strlen("error/"), dev->nodename);
-
-       return path_buffer;
+       return kasprintf("error/%s", dev->nodename);
 }
 
 
diff -r 5a790011259e -r 9b108cf447e5 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Wed Dec 21 
17:56:19 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Wed Dec 21 
18:52:00 2005
@@ -505,7 +505,7 @@
 }
 
 /* Simplified asprintf. */
-static char *kasprintf(const char *fmt, ...)
+char *kasprintf(const char *fmt, ...)
 {
        va_list ap;
        unsigned int len;
diff -r 5a790011259e -r 9b108cf447e5 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c       Wed Dec 21 
17:56:19 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c       Wed Dec 21 
18:52:00 2005
@@ -41,6 +41,9 @@
 #include <asm-xen/xenbus.h>
 #include "xenbus_comms.h"
 
+/* xenbus_probe.c */
+extern char *kasprintf(const char *fmt, ...);
+
 #define streq(a, b) (strcmp((a), (b)) == 0)
 
 struct xs_stored_msg {
@@ -276,18 +279,11 @@
 {
        char *buffer;
 
-       buffer = kmalloc(strlen(dir) + strlen("/") + strlen(name) + 1,
-                        GFP_KERNEL);
-       if (buffer == NULL)
-               return ERR_PTR(-ENOMEM);
-
-       strcpy(buffer, dir);
-       if (!streq(name, "")) {
-               strcat(buffer, "/");
-               strcat(buffer, name);
-       }
-
-       return buffer;
+       if (strlen(name) == 0)
+               buffer = kasprintf("%s", dir);
+       else
+               buffer = kasprintf("%s/%s", dir, name);
+       return (!buffer) ? ERR_PTR(-ENOMEM) : buffer;
 }
 
 static char **split(char *strings, unsigned int len, unsigned int *num)
diff -r 5a790011259e -r 9b108cf447e5 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Wed Dec 21 17:56:19 2005
+++ b/xen/arch/x86/domain.c     Wed Dec 21 18:52:00 2005
@@ -957,8 +957,6 @@
 
     ptwr_destroy(d);
 
-    gnttab_release_mappings(d);
-
     /* Drop the in-use references to page-table bases. */
     for_each_vcpu ( d, v )
     {
diff -r 5a790011259e -r 9b108cf447e5 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Wed Dec 21 17:56:19 2005
+++ b/xen/arch/x86/mm.c Wed Dec 21 18:52:00 2005
@@ -1930,105 +1930,6 @@
             }
             break;
         }
-
-        case MMUEXT_REASSIGN_PAGE:
-            if ( unlikely(!IS_PRIV(d)) )
-            {
-                MEM_LOG("Dom %u has no reassignment priv", d->domain_id);
-                okay = 0;
-                break;
-            }
-            
-            e = percpu_info[cpu].foreign;
-            if ( unlikely(e == NULL) )
-            {
-                MEM_LOG("No FOREIGNDOM to reassign mfn %lx to", mfn);
-                okay = 0;
-                break;
-            }
-            
-            /*
-             * Grab both page_list locks, in order. This prevents the page from
-             * disappearing elsewhere while we modify the owner, and we'll need
-             * both locks if we're successful so that we can change lists.
-             */
-            if ( d < e )
-            {
-                spin_lock(&d->page_alloc_lock);
-                spin_lock(&e->page_alloc_lock);
-            }
-            else
-            {
-                spin_lock(&e->page_alloc_lock);
-                spin_lock(&d->page_alloc_lock);
-            }
-            
-            /*
-             * Check that 'e' will accept the page and has reservation
-             * headroom. Also, a domain mustn't have PGC_allocated pages when
-             * it is dying. 
-             */
-            ASSERT(e->tot_pages <= e->max_pages);
-            if ( unlikely(test_bit(_DOMF_dying, &e->domain_flags)) ||
-                 unlikely(e->tot_pages == e->max_pages) ||
-                 unlikely(IS_XEN_HEAP_FRAME(page)) )
-            {
-                MEM_LOG("Transferee has no reservation headroom (%d,%d), or "
-                        "page is in Xen heap (%lx), or dom is dying (%ld).",
-                        e->tot_pages, e->max_pages, mfn, e->domain_flags);
-                okay = 0;
-                goto reassign_fail;
-            }
-
-            /*
-             * The tricky bit: atomically change owner while there is just one
-             * benign reference to the page (PGC_allocated). If that reference
-             * disappears then the deallocation routine will safely spin.
-             */
-            _d  = pickle_domptr(d);
-            _nd = page->u.inuse._domain;
-            y   = page->count_info;
-            do {
-                x = y;
-                if ( unlikely((x & (PGC_count_mask|PGC_allocated)) != 
-                              (1|PGC_allocated)) ||
-                     unlikely(_nd != _d) )
-                {
-                    MEM_LOG("Bad page values %lx: ed=%p(%u), sd=%p,"
-                            " caf=%08x, taf=%" PRtype_info,
-                            page_to_pfn(page), d, d->domain_id,
-                            unpickle_domptr(_nd), x, page->u.inuse.type_info);
-                    okay = 0;
-                    goto reassign_fail;
-                }
-                __asm__ __volatile__(
-                    LOCK_PREFIX "cmpxchg8b %3"
-                    : "=d" (_nd), "=a" (y), "=c" (e),
-                    "=m" (*(volatile u64 *)(&page->count_info))
-                    : "0" (_d), "1" (x), "c" (e), "b" (x) );
-            } 
-            while ( unlikely(_nd != _d) || unlikely(y != x) );
-            
-            /*
-             * Unlink from 'd'. We transferred at least one reference to 'e',
-             * so noone else is spinning to try to delete this page from 'd'.
-             */
-            d->tot_pages--;
-            list_del(&page->list);
-            
-            /*
-             * Add the page to 'e'. Someone may already have removed the last
-             * reference and want to remove the page from 'e'. However, we have
-             * the lock so they'll spin waiting for us.
-             */
-            if ( unlikely(e->tot_pages++ == 0) )
-                get_knownalive_domain(e);
-            list_add_tail(&page->list, &e->page_list);
-            
-        reassign_fail:        
-            spin_unlock(&d->page_alloc_lock);
-            spin_unlock(&e->page_alloc_lock);
-            break;
             
         default:
             MEM_LOG("Invalid extended pt command 0x%x", op.cmd);
diff -r 5a790011259e -r 9b108cf447e5 xen/arch/x86/setup.c
--- a/xen/arch/x86/setup.c      Wed Dec 21 17:56:19 2005
+++ b/xen/arch/x86/setup.c      Wed Dec 21 18:52:00 2005
@@ -488,8 +488,6 @@
 
     start_of_day();
 
-    grant_table_init();
-
     shadow_mode_init();
 
     /* initialize access control security module */
diff -r 5a790011259e -r 9b108cf447e5 xen/common/domain.c
--- a/xen/common/domain.c       Wed Dec 21 17:56:19 2005
+++ b/xen/common/domain.c       Wed Dec 21 18:52:00 2005
@@ -118,6 +118,7 @@
         for_each_vcpu(d, v)
             sched_rem_domain(v);
         domain_relinquish_resources(d);
+        gnttab_release_mappings(d);
         put_domain(d);
 
         send_guest_virq(dom0->vcpu[0], VIRQ_DOM_EXC);
diff -r 5a790011259e -r 9b108cf447e5 xen/common/grant_table.c
--- a/xen/common/grant_table.c  Wed Dec 21 17:56:19 2005
+++ b/xen/common/grant_table.c  Wed Dec 21 18:52:00 2005
@@ -177,17 +177,19 @@
 
     spin_lock(&rd->grant_table->lock);
 
-    if ( act->pin == 0 )
-    {
-        /* CASE 1: Activating a previously inactive entry. */
-
+    if ( !act->pin ||
+         (!(dev_hst_ro_flags & GNTMAP_readonly) &&
+          !(act->pin & (GNTPIN_hstw_mask|GNTPIN_devw_mask))) )
+    {
         sflags = sha->flags;
         sdom   = sha->domid;
 
-        /* This loop attempts to set the access (reading/writing) flags
+        /*
+         * This loop attempts to set the access (reading/writing) flags
          * in the grant table entry.  It tries a cmpxchg on the field
          * up to five times, and then fails under the assumption that 
-         * the guest is misbehaving. */
+         * the guest is misbehaving.
+         */
         for ( ; ; )
         {
             u32 scombo, prev_scombo, new_scombo;
@@ -196,7 +198,7 @@
                  unlikely(sdom != led->domain->domain_id) )
                 PIN_FAIL(unlock_out, GNTST_general_error,
                          "Bad flags (%x) or dom (%d). (NB. expected dom %d)\n",
-                        sflags, sdom, led->domain->domain_id);
+                         sflags, sdom, led->domain->domain_id);
 
             /* Merge two 16-bit values into a 32-bit combined update. */
             /* NB. Endianness! */
@@ -232,132 +234,50 @@
             sdom   = (u16)(prev_scombo >> 16);
         }
 
-        /* rmb(); */ /* not on x86 */
-
-        frame = __gpfn_to_mfn(rd, sha->frame);
-
-        if ( unlikely(!pfn_valid(frame)) ||
-             unlikely(!((dev_hst_ro_flags & GNTMAP_readonly) ?
-                        get_page(pfn_to_page(frame), rd) :
-                        get_page_and_type(pfn_to_page(frame), rd,
-                                          PGT_writable_page))) )
-        {
-            clear_bit(_GTF_writing, &sha->flags);
-            clear_bit(_GTF_reading, &sha->flags);
-            PIN_FAIL(unlock_out, GNTST_general_error,
-                     "Could not pin the granted frame (%lx)!\n", frame);
+        if ( !act->pin )
+        {
+            act->domid = sdom;
+            act->frame = __gpfn_to_mfn(rd, sha->frame);
+        }
+    }
+    else if ( (act->pin & 0x80808080U) != 0 )
+        PIN_FAIL(unlock_out, ENOSPC,
+                 "Risk of counter overflow %08x\n", act->pin);
+
+    if ( dev_hst_ro_flags & GNTMAP_device_map )
+        act->pin += (dev_hst_ro_flags & GNTMAP_readonly) ?
+            GNTPIN_devr_inc : GNTPIN_devw_inc;
+    if ( dev_hst_ro_flags & GNTMAP_host_map )
+        act->pin += (dev_hst_ro_flags & GNTMAP_readonly) ?
+            GNTPIN_hstr_inc : GNTPIN_hstw_inc;
+
+    spin_unlock(&rd->grant_table->lock);
+
+    frame = act->frame;
+    if ( unlikely(!pfn_valid(frame)) ||
+         unlikely(!((dev_hst_ro_flags & GNTMAP_readonly) ?
+                    get_page(pfn_to_page(frame), rd) :
+                    get_page_and_type(pfn_to_page(frame), rd,
+                                      PGT_writable_page))) )
+        PIN_FAIL(undo_out, GNTST_general_error,
+                 "Could not pin the granted frame (%lx)!\n", frame);
+
+    if ( dev_hst_ro_flags & GNTMAP_host_map )
+    {
+        rc = create_grant_host_mapping(addr, frame, dev_hst_ro_flags);
+        if ( rc != GNTST_okay )
+        {
+            if ( !(dev_hst_ro_flags & GNTMAP_readonly) )
+                put_page_type(pfn_to_page(frame));
+            put_page(pfn_to_page(frame));
+            goto undo_out;
         }
 
         if ( dev_hst_ro_flags & GNTMAP_device_map )
-            act->pin += (dev_hst_ro_flags & GNTMAP_readonly) ?
-                GNTPIN_devr_inc : GNTPIN_devw_inc;
-        if ( dev_hst_ro_flags & GNTMAP_host_map )
-            act->pin += (dev_hst_ro_flags & GNTMAP_readonly) ?
-                GNTPIN_hstr_inc : GNTPIN_hstw_inc;
-        act->domid = sdom;
-        act->frame = frame;
-    }
-    else 
-    {
-        /* CASE 2: Active modications to an already active entry. */
-
-        /*
-         * A cheesy check for possible pin-count overflow.
-         * A more accurate check cannot be done with a single comparison.
-         */
-        if ( (act->pin & 0x80808080U) != 0 )
-            PIN_FAIL(unlock_out, ENOSPC,
-                     "Risk of counter overflow %08x\n", act->pin);
-
-        sflags = sha->flags;
-        frame  = act->frame;
-
-        if ( !(dev_hst_ro_flags & GNTMAP_readonly) &&
-             !(act->pin & (GNTPIN_hstw_mask|GNTPIN_devw_mask)) )
-        {
-            for ( ; ; )
-            {
-                u16 prev_sflags;
-                
-                if ( unlikely(sflags & GTF_readonly) )
-                    PIN_FAIL(unlock_out, GNTST_general_error,
-                             "Attempt to write-pin a r/o grant entry.\n");
-
-                prev_sflags = sflags;
-
-                /* NB. prev_sflags is updated in place to seen value. */
-                if ( unlikely(cmpxchg_user(&sha->flags, prev_sflags, 
-                                           prev_sflags | GTF_writing)) )
-                    PIN_FAIL(unlock_out, GNTST_general_error,
-                         "Fault while modifying shared flags.\n");
-
-                if ( likely(prev_sflags == sflags) )
-                    break;
-
-                if ( retries++ == 4 )
-                    PIN_FAIL(unlock_out, GNTST_general_error,
-                             "Shared grant entry is unstable.\n");
-
-                sflags = prev_sflags;
-            }
-
-            if ( unlikely(!get_page_type(pfn_to_page(frame),
-                                         PGT_writable_page)) )
-            {
-                clear_bit(_GTF_writing, &sha->flags);
-                PIN_FAIL(unlock_out, GNTST_general_error,
-                         "Attempt to write-pin a unwritable page.\n");
-            }
-        }
-
-        if ( dev_hst_ro_flags & GNTMAP_device_map )
-            act->pin += (dev_hst_ro_flags & GNTMAP_readonly) ? 
-                GNTPIN_devr_inc : GNTPIN_devw_inc;
-
-        if ( dev_hst_ro_flags & GNTMAP_host_map )
-            act->pin += (dev_hst_ro_flags & GNTMAP_readonly) ?
-                GNTPIN_hstr_inc : GNTPIN_hstw_inc;
-    }
-
-    /*
-     * At this point:
-     * act->pin updated to reference count mappings.
-     * sha->flags updated to indicate to granting domain mapping done.
-     * frame contains the mfn.
-     */
-
-    spin_unlock(&rd->grant_table->lock);
-
-    if ( dev_hst_ro_flags & GNTMAP_host_map )
-    {
-        rc = create_grant_host_mapping(addr, frame, dev_hst_ro_flags);
-        if ( rc < 0 )
-        {
-            /* Failure: undo and abort. */
-
-            spin_lock(&rd->grant_table->lock);
-
-            if ( dev_hst_ro_flags & GNTMAP_readonly )
-            {
-                act->pin -= GNTPIN_hstr_inc;
-            }
-            else
-            {
-                act->pin -= GNTPIN_hstw_inc;
-                if ( (act->pin & (GNTPIN_hstw_mask|GNTPIN_devw_mask)) == 0 )
-                {
-                    clear_bit(_GTF_writing, &sha->flags);
-                    put_page_type(pfn_to_page(frame));
-                }
-            }
-
-            if ( act->pin == 0 )
-            {
-                clear_bit(_GTF_reading, &sha->flags);
-                put_page(pfn_to_page(frame));
-            }
-
-            spin_unlock(&rd->grant_table->lock);
+        {
+            (void)get_page(pfn_to_page(frame), rd);
+            if ( !(dev_hst_ro_flags & GNTMAP_readonly) )
+                get_page_type(pfn_to_page(frame), PGT_writable_page);
         }
     }
 
@@ -375,6 +295,24 @@
     put_domain(rd);
     return rc;
 
+ undo_out:
+    spin_lock(&rd->grant_table->lock);
+
+    if ( dev_hst_ro_flags & GNTMAP_device_map )
+        act->pin -= (dev_hst_ro_flags & GNTMAP_readonly) ?
+            GNTPIN_devr_inc : GNTPIN_devw_inc;
+    if ( dev_hst_ro_flags & GNTMAP_host_map )
+        act->pin -= (dev_hst_ro_flags & GNTMAP_readonly) ?
+            GNTPIN_hstr_inc : GNTPIN_hstw_inc;
+
+    if ( !(dev_hst_ro_flags & GNTMAP_readonly) &&
+         !(act->pin & (GNTPIN_hstw_mask|GNTPIN_devw_mask)) )
+        clear_bit(_GTF_writing, &sha->flags);
+
+    if ( !act->pin )
+        clear_bit(_GTF_reading, &sha->flags);
+
+    spin_unlock(&rd->grant_table->lock);
 
  unlock_out:
     spin_unlock(&rd->grant_table->lock);
@@ -465,27 +403,42 @@
             PIN_FAIL(unmap_out, GNTST_general_error,
                      "Bad frame number doesn't match gntref.\n");
         if ( flags & GNTMAP_device_map )
-            act->pin -= (flags & GNTMAP_readonly) ? GNTPIN_devr_inc
-                                                  : GNTPIN_devw_inc;
-
-        map->ref_and_flags &= ~GNTMAP_device_map;
-        (void)__put_user(0, &uop->dev_bus_addr);
-    }
-
-    if ( (addr != 0) &&
-         (flags & GNTMAP_host_map) &&
-         ((act->pin & (GNTPIN_hstw_mask | GNTPIN_hstr_mask)) > 0))
+        {
+            ASSERT(act->pin & (GNTPIN_devw_mask | GNTPIN_devr_mask));
+            map->ref_and_flags &= ~GNTMAP_device_map;
+            if ( flags & GNTMAP_readonly )
+            {
+                act->pin -= GNTPIN_devr_inc;
+                put_page(pfn_to_page(frame));
+            }
+            else
+            {
+                act->pin -= GNTPIN_devw_inc;
+                put_page_and_type(pfn_to_page(frame));
+            }
+        }
+    }
+
+    if ( (addr != 0) && (flags & GNTMAP_host_map) )
     {
         if ( (rc = destroy_grant_host_mapping(addr, frame, flags)) < 0 )
             goto unmap_out;
 
+        ASSERT(act->pin & (GNTPIN_hstw_mask | GNTPIN_hstr_mask));
         map->ref_and_flags &= ~GNTMAP_host_map;
-
-        act->pin -= (flags & GNTMAP_readonly) ? GNTPIN_hstr_inc
-                                              : GNTPIN_hstw_inc;
-    }
-
-    if ( (map->ref_and_flags & (GNTMAP_device_map|GNTMAP_host_map)) == 0)
+        if ( flags & GNTMAP_readonly )
+        {
+            act->pin -= GNTPIN_hstr_inc;
+            put_page(pfn_to_page(frame));
+        }
+        else
+        {
+            act->pin -= GNTPIN_hstw_inc;
+            put_page_and_type(pfn_to_page(frame));
+        }
+    }
+
+    if ( (map->ref_and_flags & (GNTMAP_device_map|GNTMAP_host_map)) == 0 )
     {
         map->ref_and_flags = 0;
         put_maptrack_handle(ld->grant_table, handle);
@@ -495,20 +448,12 @@
     if ( !(flags & GNTMAP_readonly) )
          gnttab_log_dirty(rd, frame);
 
-    /* If the last writable mapping has been removed, put_page_type */
     if ( ((act->pin & (GNTPIN_devw_mask|GNTPIN_hstw_mask)) == 0) &&
          !(flags & GNTMAP_readonly) )
-    {
         clear_bit(_GTF_writing, &sha->flags);
-        put_page_type(pfn_to_page(frame));
-    }
 
     if ( act->pin == 0 )
-    {
-        act->frame = 0xdeadbeef;
         clear_bit(_GTF_reading, &sha->flags);
-        put_page(pfn_to_page(frame));
-    }
 
  unmap_out:
     (void)__put_user(rc, &uop->status);
@@ -666,6 +611,91 @@
     spin_unlock(&gt->lock);
 
     put_domain(d);
+    return 0;
+}
+
+/*
+ * Check that the given grant reference (rd,ref) allows 'ld' to transfer
+ * ownership of a page frame. If so, lock down the grant entry.
+ */
+static int 
+gnttab_prepare_for_transfer(
+    struct domain *rd, struct domain *ld, grant_ref_t ref)
+{
+    grant_table_t *rgt;
+    grant_entry_t *sha;
+    domid_t        sdom;
+    u16            sflags;
+    u32            scombo, prev_scombo;
+    int            retries = 0;
+    unsigned long  target_pfn;
+
+    if ( unlikely((rgt = rd->grant_table) == NULL) ||
+         unlikely(ref >= NR_GRANT_ENTRIES) )
+    {
+        DPRINTK("Dom %d has no g.t., or ref is bad (%d).\n",
+                rd->domain_id, ref);
+        return 0;
+    }
+
+    spin_lock(&rgt->lock);
+
+    sha = &rgt->shared[ref];
+    
+    sflags = sha->flags;
+    sdom   = sha->domid;
+
+    for ( ; ; )
+    {
+        target_pfn = sha->frame;
+
+        if ( unlikely(target_pfn >= max_page ) )
+        {
+            DPRINTK("Bad pfn (%lx)\n", target_pfn);
+            goto fail;
+        }
+
+        if ( unlikely(sflags != GTF_accept_transfer) ||
+             unlikely(sdom != ld->domain_id) )
+        {
+            DPRINTK("Bad flags (%x) or dom (%d). (NB. expected dom %d)\n",
+                    sflags, sdom, ld->domain_id);
+            goto fail;
+        }
+
+        /* Merge two 16-bit values into a 32-bit combined update. */
+        /* NB. Endianness! */
+        prev_scombo = scombo = ((u32)sdom << 16) | (u32)sflags;
+
+        /* NB. prev_scombo is updated in place to seen value. */
+        if ( unlikely(cmpxchg_user((u32 *)&sha->flags, prev_scombo, 
+                                   prev_scombo | GTF_transfer_committed)) )
+        {
+            DPRINTK("Fault while modifying shared flags and domid.\n");
+            goto fail;
+        }
+
+        /* Did the combined update work (did we see what we expected?). */
+        if ( likely(prev_scombo == scombo) )
+            break;
+
+        if ( retries++ == 4 )
+        {
+            DPRINTK("Shared grant entry is unstable.\n");
+            goto fail;
+        }
+
+        /* Didn't see what we expected. Split out the seen flags & dom. */
+        /* NB. Endianness! */
+        sflags = (u16)prev_scombo;
+        sdom   = (u16)(prev_scombo >> 16);
+    }
+
+    spin_unlock(&rgt->lock);
+    return 1;
+
+ fail:
+    spin_unlock(&rgt->lock);
     return 0;
 }
 
@@ -818,87 +848,6 @@
 }
 
 int 
-gnttab_prepare_for_transfer(
-    struct domain *rd, struct domain *ld, grant_ref_t ref)
-{
-    grant_table_t *rgt;
-    grant_entry_t *sha;
-    domid_t        sdom;
-    u16            sflags;
-    u32            scombo, prev_scombo;
-    int            retries = 0;
-    unsigned long  target_pfn;
-
-    if ( unlikely((rgt = rd->grant_table) == NULL) ||
-         unlikely(ref >= NR_GRANT_ENTRIES) )
-    {
-        DPRINTK("Dom %d has no g.t., or ref is bad (%d).\n",
-                rd->domain_id, ref);
-        return 0;
-    }
-
-    spin_lock(&rgt->lock);
-
-    sha = &rgt->shared[ref];
-    
-    sflags = sha->flags;
-    sdom   = sha->domid;
-
-    for ( ; ; )
-    {
-        target_pfn = sha->frame;
-
-        if ( unlikely(target_pfn >= max_page ) )
-        {
-            DPRINTK("Bad pfn (%lx)\n", target_pfn);
-            goto fail;
-        }
-
-        if ( unlikely(sflags != GTF_accept_transfer) ||
-             unlikely(sdom != ld->domain_id) )
-        {
-            DPRINTK("Bad flags (%x) or dom (%d). (NB. expected dom %d)\n",
-                    sflags, sdom, ld->domain_id);
-            goto fail;
-        }
-
-        /* Merge two 16-bit values into a 32-bit combined update. */
-        /* NB. Endianness! */
-        prev_scombo = scombo = ((u32)sdom << 16) | (u32)sflags;
-
-        /* NB. prev_scombo is updated in place to seen value. */
-        if ( unlikely(cmpxchg_user((u32 *)&sha->flags, prev_scombo, 
-                                   prev_scombo | GTF_transfer_committed)) )
-        {
-            DPRINTK("Fault while modifying shared flags and domid.\n");
-            goto fail;
-        }
-
-        /* Did the combined update work (did we see what we expected?). */
-        if ( likely(prev_scombo == scombo) )
-            break;
-
-        if ( retries++ == 4 )
-        {
-            DPRINTK("Shared grant entry is unstable.\n");
-            goto fail;
-        }
-
-        /* Didn't see what we expected. Split out the seen flags & dom. */
-        /* NB. Endianness! */
-        sflags = (u16)prev_scombo;
-        sdom   = (u16)(prev_scombo >> 16);
-    }
-
-    spin_unlock(&rgt->lock);
-    return 1;
-
- fail:
-    spin_unlock(&rgt->lock);
-    return 0;
-}
-
-int 
 grant_table_create(
     struct domain *d)
 {
@@ -989,42 +938,42 @@
         {
             if ( map->ref_and_flags & GNTMAP_device_map )
             {
-                BUG_ON((act->pin & GNTPIN_devr_mask) == 0);
+                BUG_ON(!(act->pin & GNTPIN_devr_mask));
                 act->pin -= GNTPIN_devr_inc;
+                put_page(pfn_to_page(act->frame));
             }
 
             if ( map->ref_and_flags & GNTMAP_host_map )
             {
-                BUG_ON((act->pin & GNTPIN_hstr_mask) == 0);
+                BUG_ON(!(act->pin & GNTPIN_hstr_mask));
                 act->pin -= GNTPIN_hstr_inc;
+                /* Done implicitly when page tables are destroyed. */
+                /* put_page(pfn_to_page(act->frame)); */
             }
         }
         else
         {
             if ( map->ref_and_flags & GNTMAP_device_map )
             {
-                BUG_ON((act->pin & GNTPIN_devw_mask) == 0);
+                BUG_ON(!(act->pin & GNTPIN_devw_mask));
                 act->pin -= GNTPIN_devw_inc;
+                put_page_and_type(pfn_to_page(act->frame));
             }
 
             if ( map->ref_and_flags & GNTMAP_host_map )
             {
-                BUG_ON((act->pin & GNTPIN_hstw_mask) == 0);
+                BUG_ON(!(act->pin & GNTPIN_hstw_mask));
                 act->pin -= GNTPIN_hstw_inc;
+                /* Done implicitly when page tables are destroyed. */
+                /* put_page_and_type(pfn_to_page(act->frame)); */
             }
 
             if ( (act->pin & (GNTPIN_devw_mask|GNTPIN_hstw_mask)) == 0 )
-            {
                 clear_bit(_GTF_writing, &sha->flags);
-                put_page_type(pfn_to_page(act->frame));
-            }
         }
 
         if ( act->pin == 0 )
-        {
             clear_bit(_GTF_reading, &sha->flags);
-            put_page(pfn_to_page(act->frame));
-        }
 
         spin_unlock(&rd->grant_table->lock);
 
@@ -1039,24 +988,17 @@
 grant_table_destroy(
     struct domain *d)
 {
-    grant_table_t *t;
-
-    if ( (t = d->grant_table) != NULL )
-    {
-        /* Free memory relating to this grant table. */
-        d->grant_table = NULL;
-        free_xenheap_pages(t->shared, ORDER_GRANT_FRAMES);
-        free_xenheap_page(t->maptrack);
-        xfree(t->active);
-        xfree(t);
-    }
-}
-
-void
-grant_table_init(
-    void)
-{
-    /* Nothing. */
+    grant_table_t *t = d->grant_table;
+
+    if ( t == NULL )
+        return;
+    
+    free_xenheap_pages(t->shared, ORDER_GRANT_FRAMES);
+    free_xenheap_page(t->maptrack);
+    xfree(t->active);
+    xfree(t);
+
+    d->grant_table = NULL;
 }
 
 /*
diff -r 5a790011259e -r 9b108cf447e5 xen/include/public/xen.h
--- a/xen/include/public/xen.h  Wed Dec 21 17:56:19 2005
+++ b/xen/include/public/xen.h  Wed Dec 21 18:52:00 2005
@@ -145,10 +145,6 @@
  * cmd: MMUEXT_SET_LDT
  * linear_addr: Linear address of LDT base (NB. must be page-aligned).
  * nr_ents: Number of entries in LDT.
- * 
- * cmd: MMUEXT_REASSIGN_PAGE
- * mfn: Machine frame number to be reassigned to the FD.
- *      (NB. page must currently belong to the calling domain).
  */
 #define MMUEXT_PIN_L1_TABLE      0
 #define MMUEXT_PIN_L2_TABLE      1
@@ -164,14 +160,13 @@
 #define MMUEXT_INVLPG_ALL       11
 #define MMUEXT_FLUSH_CACHE      12
 #define MMUEXT_SET_LDT          13
-#define MMUEXT_REASSIGN_PAGE    14
 #define MMUEXT_NEW_USER_BASEPTR 15
 
 #ifndef __ASSEMBLY__
 struct mmuext_op {
     unsigned int cmd;
     union {
-        /* [UN]PIN_TABLE, NEW_BASEPTR, NEW_USER_BASEPTR, REASSIGN_PAGE */
+        /* [UN]PIN_TABLE, NEW_BASEPTR, NEW_USER_BASEPTR */
         unsigned long mfn;
         /* INVLPG_LOCAL, INVLPG_ALL, SET_LDT */
         unsigned long linear_addr;
diff -r 5a790011259e -r 9b108cf447e5 xen/include/xen/grant_table.h
--- a/xen/include/xen/grant_table.h     Wed Dec 21 17:56:19 2005
+++ b/xen/include/xen/grant_table.h     Wed Dec 21 18:52:00 2005
@@ -84,23 +84,11 @@
     spinlock_t            lock;
 } grant_table_t;
 
-/* Start-of-day system initialisation. */
-void grant_table_init(
-    void);
-
 /* Create/destroy per-domain grant table context. */
 int grant_table_create(
     struct domain *d);
 void grant_table_destroy(
     struct domain *d);
-
-/*
- * Check that the given grant reference (rd,ref) allows 'ld' to transfer
- * ownership of a page frame. If so, lock down the grant entry.
- */
-int 
-gnttab_prepare_for_transfer(
-    struct domain *rd, struct domain *ld, grant_ref_t ref);
 
 /* Domain death release of granted mappings of other domains' memory. */
 void

_______________________________________________
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®.