diff -r 848a36114bb9 xen/arch/ia64/xen/mm.c --- a/xen/arch/ia64/xen/mm.c Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/arch/ia64/xen/mm.c Thu Apr 03 12:25:31 2008 +0200 @@ -822,7 +822,7 @@ __assign_new_domain_page(struct domain * BUG_ON(!pte_none(*pte)); - p = alloc_domheap_page(d); + p = alloc_domheap_page(d, 0); if (unlikely(!p)) { printk("assign_new_domain_page: Can't alloc!!!! Aaaargh!\n"); return(p); @@ -2316,7 +2316,7 @@ steal_page(struct domain *d, struct page unsigned long new_mfn; int ret; - new = alloc_domheap_page(d); + new = alloc_domheap_page(d, 0); if (new == NULL) { gdprintk(XENLOG_INFO, "alloc_domheap_page() failed\n"); return -1; @@ -2603,7 +2603,7 @@ void *pgtable_quicklist_alloc(void) BUG_ON(dom_p2m == NULL); if (!opt_p2m_xenheap) { - struct page_info *page = alloc_domheap_page(dom_p2m); + struct page_info *page = alloc_domheap_page(dom_p2m, 0); if (page == NULL) return NULL; p = page_to_virt(page); diff -r 848a36114bb9 xen/arch/ia64/xen/tlb_track.c --- a/xen/arch/ia64/xen/tlb_track.c Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/arch/ia64/xen/tlb_track.c Thu Apr 03 12:25:31 2008 +0200 @@ -48,7 +48,7 @@ tlb_track_allocate_entries(struct tlb_tr __func__, tlb_track->num_entries, tlb_track->limit); return -ENOMEM; } - entry_page = alloc_domheap_page(NULL); + entry_page = alloc_domheap_page(NULL, 0); if (entry_page == NULL) { dprintk(XENLOG_WARNING, "%s: domheap page failed. num_entries %d limit %d\n", @@ -84,7 +84,7 @@ tlb_track_create(struct domain* d) if (tlb_track == NULL) goto out; - hash_page = alloc_domheap_page(NULL); + hash_page = alloc_domheap_page(NULL, 0); if (hash_page == NULL) goto out; diff -r 848a36114bb9 xen/arch/x86/domain.c --- a/xen/arch/x86/domain.c Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/arch/x86/domain.c Thu Apr 03 12:25:31 2008 +0200 @@ -172,7 +172,7 @@ int setup_arg_xlat_area(struct vcpu *v, if ( !d->arch.mm_arg_xlat_l3 ) { - pg = alloc_domheap_page(NULL); + pg = alloc_domheap_page(NULL, 0); if ( !pg ) return -ENOMEM; d->arch.mm_arg_xlat_l3 = page_to_virt(pg); @@ -190,7 +190,7 @@ int setup_arg_xlat_area(struct vcpu *v, if ( !l3e_get_intpte(d->arch.mm_arg_xlat_l3[l3_table_offset(va)]) ) { - pg = alloc_domheap_page(NULL); + pg = alloc_domheap_page(NULL, 0); if ( !pg ) return -ENOMEM; clear_page(page_to_virt(pg)); @@ -199,7 +199,7 @@ int setup_arg_xlat_area(struct vcpu *v, l2tab = l3e_to_l2e(d->arch.mm_arg_xlat_l3[l3_table_offset(va)]); if ( !l2e_get_intpte(l2tab[l2_table_offset(va)]) ) { - pg = alloc_domheap_page(NULL); + pg = alloc_domheap_page(NULL, 0); if ( !pg ) return -ENOMEM; clear_page(page_to_virt(pg)); @@ -207,7 +207,7 @@ int setup_arg_xlat_area(struct vcpu *v, } l1tab = l2e_to_l1e(l2tab[l2_table_offset(va)]); BUG_ON(l1e_get_intpte(l1tab[l1_table_offset(va)])); - pg = alloc_domheap_page(NULL); + pg = alloc_domheap_page(NULL, 0); if ( !pg ) return -ENOMEM; l1tab[l1_table_offset(va)] = l1e_from_page(pg, PAGE_HYPERVISOR); @@ -253,7 +253,7 @@ static void release_arg_xlat_area(struct static int setup_compat_l4(struct vcpu *v) { - struct page_info *pg = alloc_domheap_page(NULL); + struct page_info *pg = alloc_domheap_page(NULL, 0); l4_pgentry_t *l4tab; int rc; @@ -478,8 +478,7 @@ int arch_domain_create(struct domain *d, #else /* __x86_64__ */ - if ( (pg = alloc_domheap_page_on_node(NULL, - cpu_to_node(d->vcpu[0]->processor))) == NULL ) + if ( (pg = alloc_domheap_page(NULL, MEMF_node(domain_to_node(d)))) == NULL ) goto fail; d->arch.mm_perdomain_l2 = page_to_virt(pg); clear_page(d->arch.mm_perdomain_l2); @@ -488,9 +487,8 @@ int arch_domain_create(struct domain *d, l2e_from_page(virt_to_page(d->arch.mm_perdomain_pt)+i, __PAGE_HYPERVISOR); - if ( (pg = alloc_domheap_page_on_node(NULL, - cpu_to_node(d->vcpu[0]->processor))) == NULL ) - goto fail; + if ( (pg = alloc_domheap_page(NULL, MEMF_node(domain_to_node(d)))) == NULL ) + goto fail; d->arch.mm_perdomain_l3 = page_to_virt(pg); clear_page(d->arch.mm_perdomain_l3); d->arch.mm_perdomain_l3[l3_table_offset(PERDOMAIN_VIRT_START)] = diff -r 848a36114bb9 xen/arch/x86/domain_build.c --- a/xen/arch/x86/domain_build.c Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/arch/x86/domain_build.c Thu Apr 03 12:25:31 2008 +0200 @@ -630,7 +630,7 @@ int __init construct_dom0( } else { - page = alloc_domheap_page(NULL); + page = alloc_domheap_page(NULL, 0); if ( !page ) panic("Not enough RAM for domain 0 PML4.\n"); l4start = l4tab = page_to_virt(page); diff -r 848a36114bb9 xen/arch/x86/hvm/stdvga.c --- a/xen/arch/x86/hvm/stdvga.c Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/arch/x86/hvm/stdvga.c Thu Apr 03 12:25:31 2008 +0200 @@ -514,8 +514,8 @@ void stdvga_init(struct domain *d) for ( i = 0; i != ARRAY_SIZE(s->vram_page); i++ ) { - if ( (pg = alloc_domheap_page_on_node(NULL, - cpu_to_node(d->vcpu[0]->processor))) == NULL ) + if ( (pg = alloc_domheap_page(NULL, + MEMF_node(domain_to_node(d)))) == NULL ) break; s->vram_page[i] = pg; p = map_domain_page(page_to_mfn(pg)); diff -r 848a36114bb9 xen/arch/x86/hvm/vlapic.c --- a/xen/arch/x86/hvm/vlapic.c Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/arch/x86/hvm/vlapic.c Thu Apr 03 12:25:31 2008 +0200 @@ -917,7 +917,7 @@ int vlapic_init(struct vcpu *v) int vlapic_init(struct vcpu *v) { struct vlapic *vlapic = vcpu_vlapic(v); - unsigned int memflags = 0; + unsigned int memflags = MEMF_node (vcpu_to_node(v)); HVM_DBG_LOG(DBG_LEVEL_VLAPIC, "%d", v->vcpu_id); @@ -926,11 +926,10 @@ int vlapic_init(struct vcpu *v) #ifdef __i386__ /* 32-bit VMX may be limited to 32-bit physical addresses. */ if ( boot_cpu_data.x86_vendor == X86_VENDOR_INTEL ) - memflags = MEMF_bits(32); + memflags |= MEMF_bits(32); #endif - vlapic->regs_page = alloc_domheap_pages_on_node(NULL, 0, memflags, - cpu_to_node(v->processor)); + vlapic->regs_page = alloc_domheap_page(NULL, memflags); if ( vlapic->regs_page == NULL ) { dprintk(XENLOG_ERR, "alloc vlapic regs error: %d/%d\n", diff -r 848a36114bb9 xen/arch/x86/mm/hap/hap.c --- a/xen/arch/x86/mm/hap/hap.c Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/arch/x86/mm/hap/hap.c Thu Apr 03 12:25:31 2008 +0200 @@ -136,8 +136,8 @@ static struct page_info *hap_alloc_p2m_p && mfn_x(page_to_mfn(pg)) >= (1UL << (32 - PAGE_SHIFT)) ) { free_domheap_page(pg); - pg = alloc_domheap_pages_on_node(NULL, 0, MEMF_bits(32), - cpu_to_node(d->vcpu[0]->processor)); + pg = alloc_domheap_page(NULL, MEMF_bits(32) | + MEMF_node(domain_to_node(d))); if ( likely(pg != NULL) ) { void *p = hap_map_domain_page(page_to_mfn(pg)); @@ -201,8 +201,7 @@ hap_set_allocation(struct domain *d, uns if ( d->arch.paging.hap.total_pages < pages ) { /* Need to allocate more memory from domheap */ - pg = alloc_domheap_page_on_node(NULL, - cpu_to_node(d->vcpu[0]->processor)); + pg = alloc_domheap_page(NULL, MEMF_node(domain_to_node(d))); if ( pg == NULL ) { HAP_PRINTK("failed to allocate hap pages.\n"); diff -r 848a36114bb9 xen/arch/x86/mm/paging.c --- a/xen/arch/x86/mm/paging.c Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/arch/x86/mm/paging.c Thu Apr 03 12:25:31 2008 +0200 @@ -100,8 +100,8 @@ static mfn_t paging_new_log_dirty_page(s static mfn_t paging_new_log_dirty_page(struct domain *d, void **mapping_p) { mfn_t mfn; - struct page_info *page = alloc_domheap_page_on_node(NULL, - cpu_to_node(d->vcpu[0]->processor)); + struct page_info *page = alloc_domheap_page(NULL, + MEMF_node(domain_to_node(d))); if ( unlikely(page == NULL) ) { diff -r 848a36114bb9 xen/arch/x86/mm/shadow/common.c --- a/xen/arch/x86/mm/shadow/common.c Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/arch/x86/mm/shadow/common.c Thu Apr 03 12:25:31 2008 +0200 @@ -1250,8 +1250,7 @@ static unsigned int sh_set_allocation(st { /* Need to allocate more memory from domheap */ sp = (struct shadow_page_info *) - alloc_domheap_pages_on_node(NULL, order, 0, - cpu_to_node(d->vcpu[0]->processor)); + alloc_domheap_pages(NULL, order, MEMF_node(domain_to_node(d))); if ( sp == NULL ) { SHADOW_PRINTK("failed to allocate shadow pages.\n"); diff -r 848a36114bb9 xen/arch/x86/x86_64/mm.c --- a/xen/arch/x86/x86_64/mm.c Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/arch/x86/x86_64/mm.c Thu Apr 03 12:25:31 2008 +0200 @@ -59,7 +59,7 @@ void *alloc_xen_pagetable(void) if ( !early_boot ) { - struct page_info *pg = alloc_domheap_page(NULL); + struct page_info *pg = alloc_domheap_page(NULL, 0); BUG_ON(pg == NULL); return page_to_virt(pg); } @@ -108,7 +108,7 @@ void __init paging_init(void) struct page_info *l1_pg, *l2_pg, *l3_pg; /* Create user-accessible L2 directory to map the MPT for guests. */ - if ( (l3_pg = alloc_domheap_page(NULL)) == NULL ) + if ( (l3_pg = alloc_domheap_page(NULL, 0)) == NULL ) goto nomem; l3_ro_mpt = page_to_virt(l3_pg); clear_page(l3_ro_mpt); @@ -134,7 +134,7 @@ void __init paging_init(void) 1UL << L2_PAGETABLE_SHIFT); if ( !((unsigned long)l2_ro_mpt & ~PAGE_MASK) ) { - if ( (l2_pg = alloc_domheap_page(NULL)) == NULL ) + if ( (l2_pg = alloc_domheap_page(NULL, 0)) == NULL ) goto nomem; va = RO_MPT_VIRT_START + (i << L2_PAGETABLE_SHIFT); l2_ro_mpt = page_to_virt(l2_pg); @@ -154,7 +154,7 @@ void __init paging_init(void) l4_table_offset(HIRO_COMPAT_MPT_VIRT_START)); l3_ro_mpt = l4e_to_l3e(idle_pg_table[l4_table_offset( HIRO_COMPAT_MPT_VIRT_START)]); - if ( (l2_pg = alloc_domheap_page(NULL)) == NULL ) + if ( (l2_pg = alloc_domheap_page(NULL, 0)) == NULL ) goto nomem; compat_idle_pg_table_l2 = l2_ro_mpt = page_to_virt(l2_pg); clear_page(l2_ro_mpt); diff -r 848a36114bb9 xen/common/grant_table.c --- a/xen/common/grant_table.c Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/common/grant_table.c Thu Apr 03 12:25:31 2008 +0200 @@ -1102,7 +1102,7 @@ gnttab_transfer( struct page_info *new_page; void *sp, *dp; - new_page = alloc_domheap_pages(NULL, 0, MEMF_bits(max_bitsize)); + new_page = alloc_domheap_page(NULL, MEMF_bits(max_bitsize)); if ( new_page == NULL ) { gop.status = GNTST_address_too_big; diff -r 848a36114bb9 xen/common/memory.c --- a/xen/common/memory.c Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/common/memory.c Thu Apr 03 12:25:32 2008 +0200 @@ -38,19 +38,13 @@ struct memop_args { int preempted; /* Was the hypercall preempted? */ }; -static unsigned int select_local_node(struct domain *d) -{ - struct vcpu *v = d->vcpu[0]; - return (v ? cpu_to_node(v->processor) : 0); -} - static void increase_reservation(struct memop_args *a) { struct page_info *page; unsigned long i; xen_pfn_t mfn; struct domain *d = a->domain; - unsigned int node = select_local_node(d); + unsigned int node = domain_to_node (d); if ( !guest_handle_is_null(a->extent_list) && !guest_handle_okay(a->extent_list, a->nr_extents) ) @@ -68,8 +62,8 @@ static void increase_reservation(struct goto out; } - page = alloc_domheap_pages_on_node ( - d, a->extent_order, a->memflags, node); + page = alloc_domheap_pages ( + d, a->extent_order, a->memflags | MEMF_node(node)); if ( unlikely(page == NULL) ) { gdprintk(XENLOG_INFO, "Could not allocate order=%d extent: " @@ -98,7 +92,7 @@ static void populate_physmap(struct memo unsigned long i, j; xen_pfn_t gpfn, mfn; struct domain *d = a->domain; - unsigned int node = select_local_node(d); + unsigned int node = domain_to_node(d); if ( !guest_handle_okay(a->extent_list, a->nr_extents) ) return; @@ -118,8 +112,8 @@ static void populate_physmap(struct memo if ( unlikely(__copy_from_guest_offset(&gpfn, a->extent_list, i, 1)) ) goto out; - page = alloc_domheap_pages_on_node ( - d, a->extent_order, a->memflags, node); + page = alloc_domheap_pages ( + d, a->extent_order, a->memflags | MEMF_node(node)); if ( unlikely(page == NULL) ) { gdprintk(XENLOG_INFO, "Could not allocate order=%d extent: " @@ -299,7 +293,7 @@ static long memory_exchange(XEN_GUEST_HA unsigned long in_chunk_order, out_chunk_order; xen_pfn_t gpfn, gmfn, mfn; unsigned long i, j, k; - unsigned int memflags = 0, node; + unsigned int memflags = 0; long rc = 0; struct domain *d; struct page_info *page; @@ -355,7 +349,7 @@ static long memory_exchange(XEN_GUEST_HA memflags |= MEMF_bits(domain_clamp_alloc_bitsize( d, exch.out.address_bits ? : (BITS_PER_LONG+PAGE_SHIFT))); - node = select_local_node(d); + memflags |= MEMF_node (domain_to_node(d)); for ( i = (exch.nr_exchanged >> in_chunk_order); i < (exch.in.nr_extents >> in_chunk_order); @@ -404,8 +398,8 @@ static long memory_exchange(XEN_GUEST_HA /* Allocate a chunk's worth of anonymous output pages. */ for ( j = 0; j < (1UL << out_chunk_order); j++ ) { - page = alloc_domheap_pages_on_node( - NULL, exch.out.extent_order, memflags, node); + page = alloc_domheap_pages( + NULL, exch.out.extent_order, memflags); if ( unlikely(page == NULL) ) { rc = -ENOMEM; diff -r 848a36114bb9 xen/common/page_alloc.c --- a/xen/common/page_alloc.c Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/common/page_alloc.c Thu Apr 03 12:25:32 2008 +0200 @@ -337,6 +337,7 @@ static struct page_info *alloc_heap_page cpumask_t extra_cpus_mask, mask; struct page_info *pg; + if ( node == NUMA_NO_NODE ) node = cpu_to_node(smp_processor_id()); ASSERT(node >= 0); ASSERT(node < num_nodes); ASSERT(zone_lo <= zone_hi); @@ -780,12 +781,12 @@ int assign_pages( } -struct page_info *alloc_domheap_pages_on_node( - struct domain *d, unsigned int order, unsigned int memflags, - unsigned int node) +struct page_info *alloc_domheap_pages( + struct domain *d, unsigned int order, unsigned int memflags) { struct page_info *pg = NULL; unsigned int bits = memflags >> _MEMF_bits, zone_hi = NR_ZONES - 1; + unsigned int node = (((memflags >> _MEMF_node)&0xFF) - 1 ) &0xFF; ASSERT(!in_irq()); @@ -823,13 +824,6 @@ struct page_info *alloc_domheap_pages_on } return pg; -} - -struct page_info *alloc_domheap_pages( - struct domain *d, unsigned int order, unsigned int flags) -{ - return alloc_domheap_pages_on_node (d, order, flags, - cpu_to_node (smp_processor_id()); } void free_domheap_pages(struct page_info *pg, unsigned int order) diff -r 848a36114bb9 xen/drivers/passthrough/vtd/iommu.c --- a/xen/drivers/passthrough/vtd/iommu.c Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/drivers/passthrough/vtd/iommu.c Thu Apr 03 12:25:32 2008 +0200 @@ -270,8 +270,8 @@ static struct page_info *addr_to_dma_pag if ( dma_pte_addr(*pte) == 0 ) { - pg = alloc_domheap_page_on_node(NULL, - cpu_to_node(domain->vcpu[0]->processor)); + pg = alloc_domheap_page(NULL, + MEMF_node(domain_to_node(domain))); vaddr = map_domain_page(page_to_mfn(pg)); if ( !vaddr ) { diff -r 848a36114bb9 xen/include/asm-x86/numa.h --- a/xen/include/asm-x86/numa.h Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/include/asm-x86/numa.h Thu Apr 03 12:25:32 2008 +0200 @@ -4,11 +4,16 @@ #include #define NODES_SHIFT 6 +#define NUMA_NO_NODE 0xff extern unsigned char cpu_to_node[]; extern cpumask_t node_to_cpumask[]; #define cpu_to_node(cpu) (cpu_to_node[cpu]) +#define domain_to_node(domain) ((domain!=NULL && domain->vcpu[0]!=NULL)?\ + cpu_to_node[domain->vcpu[0]->processor]:\ + NUMA_NO_NODE) +#define vcpu_to_node(vcpu) (cpu_to_node[v->processor]) #define parent_node(node) (node) #define node_to_first_cpu(node) (__ffs(node_to_cpumask[node])) #define node_to_cpumask(node) (node_to_cpumask[node]) @@ -73,6 +78,5 @@ static inline __attribute__((pure)) int #define clear_node_cpumask(cpu) do {} while (0) #endif -#define NUMA_NO_NODE 0xff #endif diff -r 848a36114bb9 xen/include/xen/mm.h --- a/xen/include/xen/mm.h Thu Apr 03 00:37:33 2008 +0200 +++ b/xen/include/xen/mm.h Thu Apr 03 12:25:32 2008 +0200 @@ -54,15 +54,11 @@ void init_domheap_pages(paddr_t ps, padd void init_domheap_pages(paddr_t ps, paddr_t pe); struct page_info *alloc_domheap_pages( struct domain *d, unsigned int order, unsigned int memflags); -struct page_info *alloc_domheap_pages_on_node( - struct domain *d, unsigned int order, unsigned int memflags, - unsigned int node_id); void free_domheap_pages(struct page_info *pg, unsigned int order); unsigned long avail_domheap_pages_region( unsigned int node, unsigned int min_width, unsigned int max_width); unsigned long avail_domheap_pages(void); -#define alloc_domheap_page(d) (alloc_domheap_pages(d,0,0)) -#define alloc_domheap_page_on_node(d, n) (alloc_domheap_pages_on_node(d,0,0,n)) +#define alloc_domheap_page(d,f) (alloc_domheap_pages(d,0,f)) #define free_domheap_page(p) (free_domheap_pages(p,0)) void scrub_heap_pages(void); @@ -76,6 +72,8 @@ int assign_pages( /* memflags: */ #define _MEMF_no_refcount 0 #define MEMF_no_refcount (1U<<_MEMF_no_refcount) +#define _MEMF_node 8 +#define MEMF_node(n) ((((n)+1)&0xff)<<_MEMF_node) #define _MEMF_bits 24 #define MEMF_bits(n) ((n)<<_MEMF_bits)