diff for duplicates of <20111105133846.GA4415@phenom.dumpdata.com> diff --git a/a/1.txt b/N1/1.txt index 7823e08..93be980 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -45,171 +45,3 @@ sure on the outcome. perhaps a better way would be for you to pull all patches in your tree?] Also, not sure what you thought of this patch below? - ->From b9acd3abc12972be0d938d7bc2466d899023e757 Mon Sep 17 00:00:00 2001 -From: David Vrabel <david.vrabel@citrix.com> -Date: Thu, 29 Sep 2011 16:53:32 +0100 -Subject: [PATCH] xen: map foreign pages for shared rings by updating the PTEs - directly - -When mapping a foreign page with xenbus_map_ring_valloc() with the -GNTTABOP_map_grant_ref hypercall, set the GNTMAP_contains_pte flag and -pass a pointer to the PTE (in init_mm). - -After the page is mapped, the usual fault mechanism can be used to -update additional MMs. This allows the vmalloc_sync_all() to be -removed from alloc_vm_area(). - -Signed-off-by: David Vrabel <david.vrabel@citrix.com> -Cc: Andrew Morton <akpm@linux-foundation.org> -Cc: Jeremy Fitzhardinge <jeremy@goop.org> -Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> ---- - arch/x86/xen/grant-table.c | 2 +- - drivers/xen/xenbus/xenbus_client.c | 11 ++++++++--- - include/linux/vmalloc.h | 2 +- - mm/vmalloc.c | 27 +++++++++++++-------------- - 4 files changed, 23 insertions(+), 19 deletions(-) - -diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c -index 6bbfd7a..5a40d24 100644 ---- a/arch/x86/xen/grant-table.c -+++ b/arch/x86/xen/grant-table.c -@@ -71,7 +71,7 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes, - - if (shared == NULL) { - struct vm_struct *area = -- alloc_vm_area(PAGE_SIZE * max_nr_gframes); -+ alloc_vm_area(PAGE_SIZE * max_nr_gframes, NULL); - BUG_ON(area == NULL); - shared = area->addr; - *__shared = shared; -diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c -index 229d3ad..52bc57f 100644 ---- a/drivers/xen/xenbus/xenbus_client.c -+++ b/drivers/xen/xenbus/xenbus_client.c -@@ -34,6 +34,7 @@ - #include <linux/types.h> - #include <linux/vmalloc.h> - #include <asm/xen/hypervisor.h> -+#include <asm/xen/page.h> - #include <xen/interface/xen.h> - #include <xen/interface/event_channel.h> - #include <xen/events.h> -@@ -435,19 +436,20 @@ EXPORT_SYMBOL_GPL(xenbus_free_evtchn); - int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr) - { - struct gnttab_map_grant_ref op = { -- .flags = GNTMAP_host_map, -+ .flags = GNTMAP_host_map | GNTMAP_contains_pte, - .ref = gnt_ref, - .dom = dev->otherend_id, - }; - struct vm_struct *area; -+ pte_t *pte; - - *vaddr = NULL; - -- area = alloc_vm_area(PAGE_SIZE); -+ area = alloc_vm_area(PAGE_SIZE, &pte); - if (!area) - return -ENOMEM; - -- op.host_addr = (unsigned long)area->addr; -+ op.host_addr = arbitrary_virt_to_machine(pte).maddr; - - if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1)) - BUG(); -@@ -526,6 +528,7 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr) - struct gnttab_unmap_grant_ref op = { - .host_addr = (unsigned long)vaddr, - }; -+ unsigned int level; - - /* It'd be nice if linux/vmalloc.h provided a find_vm_area(void *addr) - * method so that we don't have to muck with vmalloc internals here. -@@ -547,6 +550,8 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr) - } - - op.handle = (grant_handle_t)area->phys_addr; -+ op.host_addr = arbitrary_virt_to_machine( -+ lookup_address((unsigned long)vaddr, &level)).maddr; - - if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)) - BUG(); -diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h -index 9332e52..1a77252 100644 ---- a/include/linux/vmalloc.h -+++ b/include/linux/vmalloc.h -@@ -118,7 +118,7 @@ unmap_kernel_range(unsigned long addr, unsigned long size) - #endif - - /* Allocate/destroy a 'vmalloc' VM area. */ --extern struct vm_struct *alloc_vm_area(size_t size); -+extern struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes); - extern void free_vm_area(struct vm_struct *area); - - /* for /dev/kmem */ -diff --git a/mm/vmalloc.c b/mm/vmalloc.c -index 5016f19..b5deec6 100644 ---- a/mm/vmalloc.c -+++ b/mm/vmalloc.c -@@ -2105,23 +2105,30 @@ void __attribute__((weak)) vmalloc_sync_all(void) - - static int f(pte_t *pte, pgtable_t table, unsigned long addr, void *data) - { -- /* apply_to_page_range() does all the hard work. */ -+ pte_t ***p = data; -+ -+ if (p) { -+ *(*p) = pte; -+ (*p)++; -+ } - return 0; - } - - /** - * alloc_vm_area - allocate a range of kernel address space - * @size: size of the area -+ * @ptes: returns the PTEs for the address space - * - * Returns: NULL on failure, vm_struct on success - * - * This function reserves a range of kernel address space, and - * allocates pagetables to map that range. No actual mappings -- * are created. If the kernel address space is not shared -- * between processes, it syncs the pagetable across all -- * processes. -+ * are created. -+ * -+ * If @ptes is non-NULL, pointers to the PTEs (in init_mm) -+ * allocated for the VM area are returned. - */ --struct vm_struct *alloc_vm_area(size_t size) -+struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes) - { - struct vm_struct *area; - -@@ -2135,19 +2142,11 @@ struct vm_struct *alloc_vm_area(size_t size) - * of kernel virtual address space and mapped into init_mm. - */ - if (apply_to_page_range(&init_mm, (unsigned long)area->addr, -- area->size, f, NULL)) { -+ size, f, ptes ? &ptes : NULL)) { - free_vm_area(area); - return NULL; - } - -- /* -- * If the allocated address space is passed to a hypercall -- * before being used then we cannot rely on a page fault to -- * trigger an update of the page tables. So sync all the page -- * tables here. -- */ -- vmalloc_sync_all(); -- - return area; - } - EXPORT_SYMBOL_GPL(alloc_vm_area); --- -1.7.7.1 diff --git a/a/content_digest b/N1/content_digest index 2689cb6..12eaf12 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -65,174 +65,6 @@ "sure on the outcome. perhaps a better way would be for you to pull\n" "all patches in your tree?]\n" "\n" - "Also, not sure what you thought of this patch below?\n" - "\n" - ">From b9acd3abc12972be0d938d7bc2466d899023e757 Mon Sep 17 00:00:00 2001\n" - "From: David Vrabel <david.vrabel@citrix.com>\n" - "Date: Thu, 29 Sep 2011 16:53:32 +0100\n" - "Subject: [PATCH] xen: map foreign pages for shared rings by updating the PTEs\n" - " directly\n" - "\n" - "When mapping a foreign page with xenbus_map_ring_valloc() with the\n" - "GNTTABOP_map_grant_ref hypercall, set the GNTMAP_contains_pte flag and\n" - "pass a pointer to the PTE (in init_mm).\n" - "\n" - "After the page is mapped, the usual fault mechanism can be used to\n" - "update additional MMs. This allows the vmalloc_sync_all() to be\n" - "removed from alloc_vm_area().\n" - "\n" - "Signed-off-by: David Vrabel <david.vrabel@citrix.com>\n" - "Cc: Andrew Morton <akpm@linux-foundation.org>\n" - "Cc: Jeremy Fitzhardinge <jeremy@goop.org>\n" - "Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>\n" - "---\n" - " arch/x86/xen/grant-table.c | 2 +-\n" - " drivers/xen/xenbus/xenbus_client.c | 11 ++++++++---\n" - " include/linux/vmalloc.h | 2 +-\n" - " mm/vmalloc.c | 27 +++++++++++++--------------\n" - " 4 files changed, 23 insertions(+), 19 deletions(-)\n" - "\n" - "diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c\n" - "index 6bbfd7a..5a40d24 100644\n" - "--- a/arch/x86/xen/grant-table.c\n" - "+++ b/arch/x86/xen/grant-table.c\n" - "@@ -71,7 +71,7 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,\n" - " \n" - " \tif (shared == NULL) {\n" - " \t\tstruct vm_struct *area =\n" - "-\t\t\talloc_vm_area(PAGE_SIZE * max_nr_gframes);\n" - "+\t\t\talloc_vm_area(PAGE_SIZE * max_nr_gframes, NULL);\n" - " \t\tBUG_ON(area == NULL);\n" - " \t\tshared = area->addr;\n" - " \t\t*__shared = shared;\n" - "diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c\n" - "index 229d3ad..52bc57f 100644\n" - "--- a/drivers/xen/xenbus/xenbus_client.c\n" - "+++ b/drivers/xen/xenbus/xenbus_client.c\n" - "@@ -34,6 +34,7 @@\n" - " #include <linux/types.h>\n" - " #include <linux/vmalloc.h>\n" - " #include <asm/xen/hypervisor.h>\n" - "+#include <asm/xen/page.h>\n" - " #include <xen/interface/xen.h>\n" - " #include <xen/interface/event_channel.h>\n" - " #include <xen/events.h>\n" - "@@ -435,19 +436,20 @@ EXPORT_SYMBOL_GPL(xenbus_free_evtchn);\n" - " int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)\n" - " {\n" - " \tstruct gnttab_map_grant_ref op = {\n" - "-\t\t.flags = GNTMAP_host_map,\n" - "+\t\t.flags = GNTMAP_host_map | GNTMAP_contains_pte,\n" - " \t\t.ref = gnt_ref,\n" - " \t\t.dom = dev->otherend_id,\n" - " \t};\n" - " \tstruct vm_struct *area;\n" - "+\tpte_t *pte;\n" - " \n" - " \t*vaddr = NULL;\n" - " \n" - "-\tarea = alloc_vm_area(PAGE_SIZE);\n" - "+\tarea = alloc_vm_area(PAGE_SIZE, &pte);\n" - " \tif (!area)\n" - " \t\treturn -ENOMEM;\n" - " \n" - "-\top.host_addr = (unsigned long)area->addr;\n" - "+\top.host_addr = arbitrary_virt_to_machine(pte).maddr;\n" - " \n" - " \tif (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))\n" - " \t\tBUG();\n" - "@@ -526,6 +528,7 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)\n" - " \tstruct gnttab_unmap_grant_ref op = {\n" - " \t\t.host_addr = (unsigned long)vaddr,\n" - " \t};\n" - "+\tunsigned int level;\n" - " \n" - " \t/* It'd be nice if linux/vmalloc.h provided a find_vm_area(void *addr)\n" - " \t * method so that we don't have to muck with vmalloc internals here.\n" - "@@ -547,6 +550,8 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)\n" - " \t}\n" - " \n" - " \top.handle = (grant_handle_t)area->phys_addr;\n" - "+\top.host_addr = arbitrary_virt_to_machine(\n" - "+\t\tlookup_address((unsigned long)vaddr, &level)).maddr;\n" - " \n" - " \tif (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))\n" - " \t\tBUG();\n" - "diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h\n" - "index 9332e52..1a77252 100644\n" - "--- a/include/linux/vmalloc.h\n" - "+++ b/include/linux/vmalloc.h\n" - "@@ -118,7 +118,7 @@ unmap_kernel_range(unsigned long addr, unsigned long size)\n" - " #endif\n" - " \n" - " /* Allocate/destroy a 'vmalloc' VM area. */\n" - "-extern struct vm_struct *alloc_vm_area(size_t size);\n" - "+extern struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes);\n" - " extern void free_vm_area(struct vm_struct *area);\n" - " \n" - " /* for /dev/kmem */\n" - "diff --git a/mm/vmalloc.c b/mm/vmalloc.c\n" - "index 5016f19..b5deec6 100644\n" - "--- a/mm/vmalloc.c\n" - "+++ b/mm/vmalloc.c\n" - "@@ -2105,23 +2105,30 @@ void __attribute__((weak)) vmalloc_sync_all(void)\n" - " \n" - " static int f(pte_t *pte, pgtable_t table, unsigned long addr, void *data)\n" - " {\n" - "-\t/* apply_to_page_range() does all the hard work. */\n" - "+\tpte_t ***p = data;\n" - "+\n" - "+\tif (p) {\n" - "+\t\t*(*p) = pte;\n" - "+\t\t(*p)++;\n" - "+\t}\n" - " \treturn 0;\n" - " }\n" - " \n" - " /**\n" - " *\talloc_vm_area - allocate a range of kernel address space\n" - " *\t@size:\t\tsize of the area\n" - "+ *\t@ptes:\t\treturns the PTEs for the address space\n" - " *\n" - " *\tReturns:\tNULL on failure, vm_struct on success\n" - " *\n" - " *\tThis function reserves a range of kernel address space, and\n" - " *\tallocates pagetables to map that range. No actual mappings\n" - "- *\tare created. If the kernel address space is not shared\n" - "- *\tbetween processes, it syncs the pagetable across all\n" - "- *\tprocesses.\n" - "+ *\tare created.\n" - "+ *\n" - "+ *\tIf @ptes is non-NULL, pointers to the PTEs (in init_mm)\n" - "+ *\tallocated for the VM area are returned.\n" - " */\n" - "-struct vm_struct *alloc_vm_area(size_t size)\n" - "+struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes)\n" - " {\n" - " \tstruct vm_struct *area;\n" - " \n" - "@@ -2135,19 +2142,11 @@ struct vm_struct *alloc_vm_area(size_t size)\n" - " \t * of kernel virtual address space and mapped into init_mm.\n" - " \t */\n" - " \tif (apply_to_page_range(&init_mm, (unsigned long)area->addr,\n" - "-\t\t\t\tarea->size, f, NULL)) {\n" - "+\t\t\t\tsize, f, ptes ? &ptes : NULL)) {\n" - " \t\tfree_vm_area(area);\n" - " \t\treturn NULL;\n" - " \t}\n" - " \n" - "-\t/*\n" - "-\t * If the allocated address space is passed to a hypercall\n" - "-\t * before being used then we cannot rely on a page fault to\n" - "-\t * trigger an update of the page tables. So sync all the page\n" - "-\t * tables here.\n" - "-\t */\n" - "-\tvmalloc_sync_all();\n" - "-\n" - " \treturn area;\n" - " }\n" - " EXPORT_SYMBOL_GPL(alloc_vm_area);\n" - "-- \n" - 1.7.7.1 + Also, not sure what you thought of this patch below? -6f594230a6df51b35f1a4709f24c0372c5ca46b066052018fa03b6ea2dcb1675 +d5810f7e07303b2e7a48d9ccacf54b1618068c737820763ebe6c6f2f59a1862e
diff --git a/a/1.txt b/N2/1.txt index 7823e08..63264ff 100644 --- a/a/1.txt +++ b/N2/1.txt @@ -213,3 +213,10 @@ index 5016f19..b5deec6 100644 EXPORT_SYMBOL_GPL(alloc_vm_area); -- 1.7.7.1 + +-- +To unsubscribe, send a message with 'unsubscribe linux-mm' in +the body to majordomo@kvack.org. For more info on Linux MM, +see: http://www.linux-mm.org/ . +Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ +Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> diff --git a/a/content_digest b/N2/content_digest index 2689cb6..22cb641 100644 --- a/a/content_digest +++ b/N2/content_digest @@ -233,6 +233,13 @@ " }\n" " EXPORT_SYMBOL_GPL(alloc_vm_area);\n" "-- \n" - 1.7.7.1 + "1.7.7.1\n" + "\n" + "--\n" + "To unsubscribe, send a message with 'unsubscribe linux-mm' in\n" + "the body to majordomo@kvack.org. For more info on Linux MM,\n" + "see: http://www.linux-mm.org/ .\n" + "Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/\n" + "Don't email: <a href=mailto:\"dont@kvack.org\"> email@kvack.org </a>" -6f594230a6df51b35f1a4709f24c0372c5ca46b066052018fa03b6ea2dcb1675 +e7244a65c2341c517cc8b2661567e15bd89785f86a0984bda175923a36cb0861
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.