[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] vtd: fix memory allocation from NUMA node for VT-d.
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1227005562 0 # Node ID 2604400f75e318dc9f5201e3626213290a89862a # Parent 7dd7220641285076bc6894221b9d8ac46d5e922a vtd: fix memory allocation from NUMA node for VT-d. Signed-off-by: Yuji Shimada <shimada-yxb@xxxxxxxxxxxxxxx> --- xen/drivers/passthrough/vtd/ia64/vtd.c | 5 +++-- xen/drivers/passthrough/vtd/intremap.c | 2 +- xen/drivers/passthrough/vtd/iommu.c | 8 ++++---- xen/drivers/passthrough/vtd/qinval.c | 2 +- xen/drivers/passthrough/vtd/vtd.h | 2 +- xen/drivers/passthrough/vtd/x86/vtd.c | 5 +++-- 6 files changed, 13 insertions(+), 11 deletions(-) diff -r 7dd722064128 -r 2604400f75e3 xen/drivers/passthrough/vtd/ia64/vtd.c --- a/xen/drivers/passthrough/vtd/ia64/vtd.c Mon Nov 17 15:55:56 2008 +0000 +++ b/xen/drivers/passthrough/vtd/ia64/vtd.c Tue Nov 18 10:52:42 2008 +0000 @@ -21,6 +21,7 @@ #include <xen/sched.h> #include <xen/domain_page.h> #include <xen/iommu.h> +#include <xen/numa.h> #include <asm/xensystem.h> #include <asm/sal.h> #include "../iommu.h" @@ -44,12 +45,12 @@ void unmap_vtd_domain_page(void *va) } /* Allocate page table, return its machine address */ -u64 alloc_pgtable_maddr(void) +u64 alloc_pgtable_maddr(struct domain *d) { struct page_info *pg; u64 *vaddr; - pg = alloc_domheap_page(NULL, 0); + pg = alloc_domheap_page(NULL, d ? MEMF_node(domain_to_node(d)) : 0); vaddr = map_domain_page(page_to_mfn(pg)); if ( !vaddr ) return 0; diff -r 7dd722064128 -r 2604400f75e3 xen/drivers/passthrough/vtd/intremap.c --- a/xen/drivers/passthrough/vtd/intremap.c Mon Nov 17 15:55:56 2008 +0000 +++ b/xen/drivers/passthrough/vtd/intremap.c Tue Nov 18 10:52:42 2008 +0000 @@ -502,7 +502,7 @@ int intremap_setup(struct iommu *iommu) ir_ctrl = iommu_ir_ctrl(iommu); if ( ir_ctrl->iremap_maddr == 0 ) { - ir_ctrl->iremap_maddr = alloc_pgtable_maddr(); + ir_ctrl->iremap_maddr = alloc_pgtable_maddr(NULL); if ( ir_ctrl->iremap_maddr == 0 ) { dprintk(XENLOG_WARNING VTDPREFIX, diff -r 7dd722064128 -r 2604400f75e3 xen/drivers/passthrough/vtd/iommu.c --- a/xen/drivers/passthrough/vtd/iommu.c Mon Nov 17 15:55:56 2008 +0000 +++ b/xen/drivers/passthrough/vtd/iommu.c Tue Nov 18 10:52:42 2008 +0000 @@ -148,7 +148,7 @@ static u64 bus_to_context_maddr(struct i root = &root_entries[bus]; if ( !root_present(*root) ) { - maddr = alloc_pgtable_maddr(); + maddr = alloc_pgtable_maddr(NULL); if ( maddr == 0 ) { unmap_vtd_domain_page(root_entries); @@ -205,7 +205,7 @@ static u64 addr_to_dma_page_maddr(struct addr &= (((u64)1) << addr_width) - 1; spin_lock_irqsave(&hd->mapping_lock, flags); if ( hd->pgd_maddr == 0 ) - if ( !alloc || ((hd->pgd_maddr = alloc_pgtable_maddr()) == 0) ) + if ( !alloc || ((hd->pgd_maddr = alloc_pgtable_maddr(domain)) == 0) ) goto out; parent = (struct dma_pte *)map_vtd_domain_page(hd->pgd_maddr); @@ -218,7 +218,7 @@ static u64 addr_to_dma_page_maddr(struct { if ( !alloc ) break; - maddr = alloc_pgtable_maddr(); + maddr = alloc_pgtable_maddr(domain); if ( !maddr ) break; dma_set_pte_addr(*pte, maddr); @@ -605,7 +605,7 @@ static int iommu_set_root_entry(struct i spin_lock_irqsave(&iommu->register_lock, flags); if ( iommu->root_maddr == 0 ) - iommu->root_maddr = alloc_pgtable_maddr(); + iommu->root_maddr = alloc_pgtable_maddr(NULL); if ( iommu->root_maddr == 0 ) { spin_unlock_irqrestore(&iommu->register_lock, flags); diff -r 7dd722064128 -r 2604400f75e3 xen/drivers/passthrough/vtd/qinval.c --- a/xen/drivers/passthrough/vtd/qinval.c Mon Nov 17 15:55:56 2008 +0000 +++ b/xen/drivers/passthrough/vtd/qinval.c Tue Nov 18 10:52:42 2008 +0000 @@ -426,7 +426,7 @@ int qinval_setup(struct iommu *iommu) if ( qi_ctrl->qinval_maddr == 0 ) { - qi_ctrl->qinval_maddr = alloc_pgtable_maddr(); + qi_ctrl->qinval_maddr = alloc_pgtable_maddr(NULL); if ( qi_ctrl->qinval_maddr == 0 ) { dprintk(XENLOG_WARNING VTDPREFIX, diff -r 7dd722064128 -r 2604400f75e3 xen/drivers/passthrough/vtd/vtd.h --- a/xen/drivers/passthrough/vtd/vtd.h Mon Nov 17 15:55:56 2008 +0000 +++ b/xen/drivers/passthrough/vtd/vtd.h Tue Nov 18 10:52:42 2008 +0000 @@ -101,7 +101,7 @@ void cacheline_flush(char *); void cacheline_flush(char *); void flush_all_cache(void); void *map_to_nocache_virt(int nr_iommus, u64 maddr); -u64 alloc_pgtable_maddr(void); +u64 alloc_pgtable_maddr(struct domain *d); void free_pgtable_maddr(u64 maddr); void *map_vtd_domain_page(u64 maddr); void unmap_vtd_domain_page(void *va); diff -r 7dd722064128 -r 2604400f75e3 xen/drivers/passthrough/vtd/x86/vtd.c --- a/xen/drivers/passthrough/vtd/x86/vtd.c Mon Nov 17 15:55:56 2008 +0000 +++ b/xen/drivers/passthrough/vtd/x86/vtd.c Tue Nov 18 10:52:42 2008 +0000 @@ -22,6 +22,7 @@ #include <xen/domain_page.h> #include <asm/paging.h> #include <xen/iommu.h> +#include <xen/numa.h> #include "../iommu.h" #include "../dmar.h" #include "../vtd.h" @@ -37,13 +38,13 @@ void unmap_vtd_domain_page(void *va) } /* Allocate page table, return its machine address */ -u64 alloc_pgtable_maddr(void) +u64 alloc_pgtable_maddr(struct domain *d) { struct page_info *pg; u64 *vaddr; unsigned long mfn; - pg = alloc_domheap_page(NULL, 0); + pg = alloc_domheap_page(NULL, d ? MEMF_node(domain_to_node(d)) : 0); if ( !pg ) return 0; mfn = page_to_mfn(pg); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |