WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Dynamic sizing of a domain's grant map tracking table on

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Dynamic sizing of a domain's grant map tracking table on demand.
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Tue, 05 Apr 2005 00:55:55 +0000
Delivery-date: Tue, 05 Apr 2005 08:03:58 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: Xen Development List <xen-devel@xxxxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
ChangeSet 1.1449, 2005/04/05 01:55:55+01:00, cwc22@xxxxxxxxxxxxxxxxxxxxxx

        Dynamic sizing of a domain's grant map tracking table on demand.
        Grant tables now default for block front/back communication.



 linux-2.4.29-xen-sparse/arch/xen/defconfig-xen0 |    2 -
 linux-2.4.29-xen-sparse/arch/xen/defconfig-xenU |    2 -
 linux-2.6.11-xen-sparse/arch/xen/Kconfig        |    5 +-
 xen/common/grant_table.c                        |   44 ++++++++++++++++++------
 xen/include/xen/grant_table.h                   |    3 +
 5 files changed, 39 insertions(+), 17 deletions(-)


diff -Nru a/linux-2.4.29-xen-sparse/arch/xen/defconfig-xen0 
b/linux-2.4.29-xen-sparse/arch/xen/defconfig-xen0
--- a/linux-2.4.29-xen-sparse/arch/xen/defconfig-xen0   2005-04-05 04:04:03 
-04:00
+++ b/linux-2.4.29-xen-sparse/arch/xen/defconfig-xen0   2005-04-05 04:04:03 
-04:00
@@ -16,7 +16,7 @@
 CONFIG_XEN_SCRUB_PAGES=y
 CONFIG_XEN_NETDEV_FRONTEND=y
 CONFIG_XEN_BLKDEV_FRONTEND=y
-# CONFIG_XEN_BLKDEV_GRANT is not set
+CONFIG_XEN_BLKDEV_GRANT=y
 # CONFIG_XEN_USB_FRONTEND is not set
 CONFIG_NO_IDLE_HZ=y
 CONFIG_FOREIGN_PAGES=y
diff -Nru a/linux-2.4.29-xen-sparse/arch/xen/defconfig-xenU 
b/linux-2.4.29-xen-sparse/arch/xen/defconfig-xenU
--- a/linux-2.4.29-xen-sparse/arch/xen/defconfig-xenU   2005-04-05 04:04:03 
-04:00
+++ b/linux-2.4.29-xen-sparse/arch/xen/defconfig-xenU   2005-04-05 04:04:03 
-04:00
@@ -15,7 +15,7 @@
 CONFIG_XEN_SCRUB_PAGES=y
 CONFIG_XEN_NETDEV_FRONTEND=y
 CONFIG_XEN_BLKDEV_FRONTEND=y
-# CONFIG_XEN_BLKDEV_GRANT is not set
+CONFIG_XEN_BLKDEV_GRANT=y
 # CONFIG_XEN_USB_FRONTEND is not set
 CONFIG_NO_IDLE_HZ=y
 # CONFIG_FOREIGN_PAGES is not set
diff -Nru a/linux-2.6.11-xen-sparse/arch/xen/Kconfig 
b/linux-2.6.11-xen-sparse/arch/xen/Kconfig
--- a/linux-2.6.11-xen-sparse/arch/xen/Kconfig  2005-04-05 04:04:03 -04:00
+++ b/linux-2.6.11-xen-sparse/arch/xen/Kconfig  2005-04-05 04:04:03 -04:00
@@ -64,12 +64,11 @@
 config XEN_BLKDEV_GRANT
         bool "Grant table substrate for block drivers (DANGEROUS)"
         depends on !XEN_BLKDEV_TAP_BE
-        default n
+        default y
         help
           This introduces the use of grant tables as a data exhange mechanism
           between the frontend and backend block drivers. This currently
-          conflicts with the block tap, and should be considered untested
-          and likely to render your system unstable.
+          conflicts with the block tap.
 
 config XEN_NETDEV_BACKEND
        bool "Network-device backend driver"
diff -Nru a/xen/common/grant_table.c b/xen/common/grant_table.c
--- a/xen/common/grant_table.c  2005-04-05 04:04:03 -04:00
+++ b/xen/common/grant_table.c  2005-04-05 04:04:03 -04:00
@@ -42,7 +42,7 @@
     grant_table_t *t)
 {
     unsigned int h;
-    if ( unlikely((h = t->maptrack_head) == NR_MAPTRACK_ENTRIES) )
+    if ( unlikely((h = t->maptrack_head) == t->maptrack_limit) )
         return -1;
     t->maptrack_head = t->maptrack[h].ref_and_flags >> MAPTRACK_REF_SHIFT;
     t->map_count++;
@@ -362,10 +362,30 @@
     /* get a maptrack handle */
     if ( unlikely((handle = get_maptrack_handle(ld->grant_table)) == -1) )
     {
-        put_domain(rd);
-        DPRINTK("No more map handles available\n");
-        (void)__put_user(GNTST_no_device_space, &uop->handle);
-        return GNTST_no_device_space;
+        int              i;
+        grant_mapping_t *new_mt;
+        grant_table_t   *lgt      = ld->grant_table;
+
+        /* grow the maptrack table */
+        if ( (new_mt = (void *)alloc_xenheap_pages(lgt->maptrack_order + 1)) 
== NULL )
+        {
+            put_domain(rd);
+            DPRINTK("No more map handles available\n");
+            (void)__put_user(GNTST_no_device_space, &uop->handle);
+            return GNTST_no_device_space;
+        }
+
+        memcpy(new_mt, lgt->maptrack, PAGE_SIZE << lgt->maptrack_order);
+        for ( i = lgt->maptrack_limit; i < (lgt->maptrack_limit << 1); i++ )
+            new_mt[i].ref_and_flags = (i+1) << MAPTRACK_REF_SHIFT;
+
+        free_xenheap_pages((unsigned long)lgt->maptrack, lgt->maptrack_order);
+        lgt->maptrack          = new_mt;
+        lgt->maptrack_order   += 1;
+        lgt->maptrack_limit  <<= 1;
+
+        printk("Doubled maptrack size\n");
+        handle = get_maptrack_handle(ld->grant_table);
     }
 
 #ifdef GRANT_DEBUG_VERBOSE
@@ -458,7 +478,7 @@
 
     map = &ld->grant_table->maptrack[handle];
 
-    if ( unlikely(handle >= NR_MAPTRACK_ENTRIES) ||
+    if ( unlikely(handle >= ld->grant_table->maptrack_limit) ||
          unlikely(!(map->ref_and_flags & MAPTRACK_GNTMAP_MASK)) )
     {
         DPRINTK("Bad handle (%d).\n", handle);
@@ -752,7 +772,7 @@
         }
     }
 
-    for ( i = 0; i < NR_MAPTRACK_ENTRIES; i++ )
+    for ( i = 0; i < gt->maptrack_limit; i++ )
     {
         maptrack = &gt->maptrack[i];
 
@@ -860,7 +880,7 @@
 
     rgt = rd->grant_table;
 
-    for ( handle = 0; handle < NR_MAPTRACK_ENTRIES; handle++ )
+    for ( handle = 0; handle < lgt->maptrack_limit; handle++ )
     {
         map = &lgt->maptrack[handle];
 
@@ -1074,8 +1094,10 @@
     /* Tracking of mapped foreign frames table */
     if ( (t->maptrack = (void *)alloc_xenheap_page()) == NULL )
         goto no_mem;
+    t->maptrack_order = 0;
+    t->maptrack_limit = PAGE_SIZE / sizeof(grant_mapping_t);
     memset(t->maptrack, 0, PAGE_SIZE);
-    for ( i = 0; i < NR_MAPTRACK_ENTRIES; i++ )
+    for ( i = 0; i < t->maptrack_limit; i++ )
         t->maptrack[i].ref_and_flags = (i+1) << MAPTRACK_REF_SHIFT;
 
     /* Shared grant table. */
@@ -1121,7 +1143,7 @@
 
     ld = current->domain;
 
-    for ( handle = 0; handle < NR_MAPTRACK_ENTRIES; handle++ )
+    for ( handle = 0; handle < gt->maptrack_limit; handle++ )
     {
         map = &gt->maptrack[handle];
 
@@ -1191,7 +1213,7 @@
         /* Free memory relating to this grant table. */
         d->grant_table = NULL;
         free_xenheap_pages((unsigned long)t->shared, ORDER_GRANT_FRAMES);
-        free_xenheap_page((unsigned long)t->maptrack);
+        free_xenheap_page((unsigned long)t->maptrack); //cwc22
         xfree(t->active);
         xfree(t);
     }
diff -Nru a/xen/include/xen/grant_table.h b/xen/include/xen/grant_table.h
--- a/xen/include/xen/grant_table.h     2005-04-05 04:04:03 -04:00
+++ b/xen/include/xen/grant_table.h     2005-04-05 04:04:03 -04:00
@@ -66,7 +66,6 @@
 } grant_mapping_t;
 #define MAPTRACK_GNTMAP_MASK 7
 #define MAPTRACK_REF_SHIFT   3
-#define NR_MAPTRACK_ENTRIES  (PAGE_SIZE / sizeof(grant_mapping_t))
 
 /* Per-domain grant information. */
 typedef struct {
@@ -77,6 +76,8 @@
     /* Mapping tracking table. */
     grant_mapping_t      *maptrack;
     unsigned int          maptrack_head;
+    unsigned int          maptrack_order;
+    unsigned int          maptrack_limit;
     unsigned int          map_count;
     /* Lock protecting updates to active and shared grant tables. */
     spinlock_t            lock;

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Dynamic sizing of a domain's grant map tracking table on demand., BitKeeper Bot <=