xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [PATCH, RFC 3/4] qemu: use new (replacement) mmap-batch ioctl
@ 2010-01-11 14:50 Jan Beulich
  2010-01-12 17:25 ` Ian Jackson
  0 siblings, 1 reply; 7+ messages in thread
From: Jan Beulich @ 2010-01-11 14:50 UTC (permalink / raw)
  To: xen-devel

--- 2010-01-06.orig/qemu/hw/xen_common.h	2009-01-27 08:32:14.000000000 +0100
+++ 2010-01-06/qemu/hw/xen_common.h	2010-01-08 17:19:07.000000000 +0100
@@ -30,5 +30,10 @@
 # define xen_rmb() rmb()
 # define xen_wmb() wmb()
 #endif
+#if __XEN_LATEST_INTERFACE_VERSION__ < 0x0003020a
+void * __attribute__((__weak__))
+xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot,
+                    const xen_pfn_t *, int *err, unsigned int num);
+#endif
 
 #endif /* QEMU_HW_XEN_COMMON_H */
--- 2010-01-06.orig/qemu/hw/xen_machine_fv.c	2009-05-19 16:24:10.000000000 +0200
+++ 2010-01-06/qemu/hw/xen_machine_fv.c	2010-01-08 17:24:10.000000000 +0100
@@ -109,6 +109,34 @@ static void qemu_remap_bucket(struct map
     for (i = 0; i < MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT; i++)
         pfns[i] = (address_index << (MCACHE_BUCKET_SHIFT-XC_PAGE_SHIFT)) + i;
 
+    if (xc_map_foreign_bulk != NULL) {
+        int err[MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT];
+
+        vaddr_base = xc_map_foreign_bulk(xc_handle, domid,
+                                         PROT_READ|PROT_WRITE, pfns, err,
+                                         MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT);
+        if (vaddr_base == NULL) {
+            fprintf(logfile, "xc_map_foreign_bulk error %d\n", errno);
+            exit(-1);
+        }
+
+        entry->vaddr_base  = vaddr_base;
+        entry->paddr_index = address_index;
+
+        for (i = 0; i < MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT;
+             i += BITS_PER_LONG) {
+            unsigned long word = 0;
+            j = ((i + BITS_PER_LONG) > (MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT)) ?
+                (MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT) % BITS_PER_LONG :
+                BITS_PER_LONG;
+            while (j > 0)
+                word = (word << 1) | !err[i + --j];
+            entry->valid_mapping[i / BITS_PER_LONG] = word;
+        }
+
+        return;
+    }
+
     vaddr_base = xc_map_foreign_batch(xc_handle, domid, PROT_READ|PROT_WRITE,
                                       pfns, MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT);
     if (vaddr_base == NULL) {
@@ -347,11 +375,11 @@ static void xen_init_fv(ram_addr_t ram_s
                 (STORE_PAGE_START >> XC_PAGE_SHIFT); 
     }
 
-    phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
+    phys_ram_base = xc_map_foreign_pages(xc_handle, domid,
                                          PROT_READ|PROT_WRITE,
                                          page_array, nr_pages);
     if (phys_ram_base == 0) {
-        fprintf(logfile, "xc_map_foreign_batch returned error %d\n", errno);
+        fprintf(logfile, "xc_map_foreign_pages returned error %d\n", errno);
         exit(-1);
     }
     free(page_array);

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2010-01-13  8:56 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-01-11 14:50 [PATCH, RFC 3/4] qemu: use new (replacement) mmap-batch ioctl Jan Beulich
2010-01-12 17:25 ` Ian Jackson
2010-01-13  7:50   ` Jan Beulich
2010-01-13  7:59     ` Keir Fraser
2010-01-13  8:03       ` Jan Beulich
2010-01-13  8:28         ` Keir Fraser
2010-01-13  8:56           ` Jan Beulich

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).