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-devel

[Xen-devel] [PATCH] Use a single mmap interface in libxc

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] Use a single mmap interface in libxc
From: Patrick Colp <Patrick.Colp@xxxxxxxxxx>
Date: Mon, 20 Jul 2009 10:27:52 +0100
Delivery-date: Mon, 20 Jul 2009 02:28:36 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Patrick Colp <Patrick.Colp@xxxxxxxxxx>
# Date 1248081941 -3600
# Node ID 8e1301247d784ffb98b0721d9f6f46daa0640af1
# Parent  91407452cdb62f427c74e227956dc34a107cab46
Use a single mmap interface in libxc.

This patch modifies xc_map_foreign_range and xc_map_foreign_ranges to call
mmap_map_foreign_batch. This eliminates the need for multiple privcmd mmap
ioctls. Now only IOCTL_PRIVCMD_MMAPBATCH is required.

Signed-off-by: Patrick Colp <Patrick.Colp@xxxxxxxxxx>

diff -r 91407452cdb6 -r 8e1301247d78 tools/libxc/xc_linux.c
--- a/tools/libxc/xc_linux.c    Wed Jul 15 13:15:50 2009 +0100
+++ b/tools/libxc/xc_linux.c    Mon Jul 20 10:25:41 2009 +0100
@@ -92,67 +92,38 @@
                            int size, int prot,
                            unsigned long mfn)
 {
-    privcmd_mmap_t ioctlx;
-    privcmd_mmap_entry_t entry;
-    void *addr;
-    addr = mmap(NULL, size, prot, MAP_SHARED, xc_handle, 0);
-    if ( addr == MAP_FAILED ) {
-        perror("xc_map_foreign_range: mmap failed");
-        return NULL;
-    }
+    xen_pfn_t *arr;
+    int num;
+    int i;
 
-    ioctlx.num=1;
-    ioctlx.dom=dom;
-    ioctlx.entry=&entry;
-    entry.va=(unsigned long) addr;
-    entry.mfn=mfn;
-    entry.npages=(size+PAGE_SIZE-1)>>PAGE_SHIFT;
-    if ( ioctl(xc_handle, IOCTL_PRIVCMD_MMAP, &ioctlx) < 0 )
-    {
-        int saved_errno = errno;
-        perror("xc_map_foreign_range: ioctl failed");
-        (void)munmap(addr, size);
-        errno = saved_errno;
-        return NULL;
-    }
-    return addr;
+    num = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
+    arr = calloc(num, sizeof(xen_pfn_t));
+
+    for ( i = 0; i < num; i++ )
+        arr[i] = mfn + i;
+
+    return xc_map_foreign_batch(xc_handle, dom, prot, arr, num);
 }
 
 void *xc_map_foreign_ranges(int xc_handle, uint32_t dom,
                             size_t size, int prot, size_t chunksize,
                             privcmd_mmap_entry_t entries[], int nentries)
 {
-    privcmd_mmap_t ioctlx;
-    int i, rc;
-    void *addr;
+    xen_pfn_t *arr;
+    int num_per_entry;
+    int num;
+    int i;
+    int j;
 
-    addr = mmap(NULL, size, prot, MAP_SHARED, xc_handle, 0);
-    if ( addr == MAP_FAILED )
-        goto mmap_failed;
+    num_per_entry = chunksize >> PAGE_SHIFT;
+    num = num_per_entry * nentries;
+    arr = calloc(num, sizeof(xen_pfn_t));
 
     for ( i = 0; i < nentries; i++ )
-    {
-        entries[i].va = (unsigned long)addr + (i * chunksize);
-        entries[i].npages = chunksize >> PAGE_SHIFT;
-    }
+        for ( j = 0; j < num_per_entry; j++ )
+            arr[i * num_per_entry + j] = entries[i].mfn + j;
 
-    ioctlx.num   = nentries;
-    ioctlx.dom   = dom;
-    ioctlx.entry = entries;
-
-    rc = ioctl(xc_handle, IOCTL_PRIVCMD_MMAP, &ioctlx);
-    if ( rc )
-        goto ioctl_failed;
-
-    return addr;
-
-ioctl_failed:
-    rc = munmap(addr, size);
-    if ( rc == -1 )
-        ERROR("%s: error in error path\n", __FUNCTION__);
-
-mmap_failed:
-    return NULL;
+    return xc_map_foreign_batch(xc_handle, dom, prot, arr, num);
 }
 
 static int do_privcmd(int xc_handle, unsigned int cmd, unsigned long data)

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

<Prev in Thread] Current Thread [Next in Thread>