Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xen/grant-table: Make it running on 64KB granularity

The Xen interface is using 4KB page granularity. This means that each
grant is 4KB.

The current implementation allocates a Linux page per grant. On Linux
using 64KB page granularity, only the first 4KB of the page will be
used.

We could decrease the memory wasted by sharing the page with multiple
grant. It will require some care with the {Set,Clear}ForeignPage macro.

Note that no changes has been made in the x86 code because both Linux
and Xen will only use 4KB page granularity.

Signed-off-by: Julien Grall <julien.grall@citrix.com>
Reviewed-by: David Vrabel <david.vrabel@citrix.com>
Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: David Vrabel <david.vrabel@citrix.com>

authored by

Julien Grall and committed by
David Vrabel
5ed5451d a001c9d9

+6 -6
+3 -3
arch/arm/xen/p2m.c
··· 93 93 for (i = 0; i < count; i++) { 94 94 if (map_ops[i].status) 95 95 continue; 96 - set_phys_to_machine(map_ops[i].host_addr >> PAGE_SHIFT, 97 - map_ops[i].dev_bus_addr >> PAGE_SHIFT); 96 + set_phys_to_machine(map_ops[i].host_addr >> XEN_PAGE_SHIFT, 97 + map_ops[i].dev_bus_addr >> XEN_PAGE_SHIFT); 98 98 } 99 99 100 100 return 0; ··· 108 108 int i; 109 109 110 110 for (i = 0; i < count; i++) { 111 - set_phys_to_machine(unmap_ops[i].host_addr >> PAGE_SHIFT, 111 + set_phys_to_machine(unmap_ops[i].host_addr >> XEN_PAGE_SHIFT, 112 112 INVALID_P2M_ENTRY); 113 113 } 114 114
+3 -3
drivers/xen/grant-table.c
··· 642 642 if (xen_auto_xlat_grant_frames.count) 643 643 return -EINVAL; 644 644 645 - vaddr = xen_remap(addr, PAGE_SIZE * max_nr_gframes); 645 + vaddr = xen_remap(addr, XEN_PAGE_SIZE * max_nr_gframes); 646 646 if (vaddr == NULL) { 647 647 pr_warn("Failed to ioremap gnttab share frames (addr=%pa)!\n", 648 648 &addr); ··· 654 654 return -ENOMEM; 655 655 } 656 656 for (i = 0; i < max_nr_gframes; i++) 657 - pfn[i] = PFN_DOWN(addr) + i; 657 + pfn[i] = XEN_PFN_DOWN(addr) + i; 658 658 659 659 xen_auto_xlat_grant_frames.vaddr = vaddr; 660 660 xen_auto_xlat_grant_frames.pfn = pfn; ··· 1004 1004 { 1005 1005 /* Only version 1 is used, which will always be available. */ 1006 1006 grant_table_version = 1; 1007 - grefs_per_grant_frame = PAGE_SIZE / sizeof(struct grant_entry_v1); 1007 + grefs_per_grant_frame = XEN_PAGE_SIZE / sizeof(struct grant_entry_v1); 1008 1008 gnttab_interface = &gnttab_v1_ops; 1009 1009 1010 1010 pr_info("Grant tables using version %d layout\n", grant_table_version);