[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] allow domain heap allocations to specify more than one NUMA node
commit a7596378e454773220a0003e18295a064f2c472c Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Fri Mar 6 17:27:33 2015 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Fri Mar 6 17:27:33 2015 +0100 allow domain heap allocations to specify more than one NUMA node ... using struct domain as a container for passing the respective affinity mask: Quite a number of allocations are domain specific, yet not to be accounted for that domain. Introduce a flag suppressing the accounting altogether (i.e. going beyond MEMF_no_refcount) and use it right away in common code (x86 and IOMMU code will get adjusted subsequently). Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- xen/common/grant_table.c | 3 ++- xen/common/memory.c | 3 ++- xen/common/page_alloc.c | 9 +++++++-- xen/include/xen/mm.h | 2 ++ 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index 1a11766..dfb45f8 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -1657,7 +1657,8 @@ gnttab_transfer( struct page_info *new_page; void *sp, *dp; - new_page = alloc_domheap_page(NULL, MEMF_bits(max_bitsize)); + new_page = alloc_domheap_page(e, MEMF_no_owner | + MEMF_bits(max_bitsize)); if ( new_page == NULL ) { gop.status = GNTST_address_too_big; diff --git a/xen/common/memory.c b/xen/common/memory.c index 9d9d43c..60432ec 100644 --- a/xen/common/memory.c +++ b/xen/common/memory.c @@ -462,7 +462,8 @@ static long memory_exchange(XEN_GUEST_HANDLE_PARAM(xen_memory_exchange_t) arg) /* Allocate a chunk's worth of anonymous output pages. */ for ( j = 0; j < (1UL << out_chunk_order); j++ ) { - page = alloc_domheap_pages(NULL, exch.out.extent_order, memflags); + page = alloc_domheap_pages(d, exch.out.extent_order, + MEMF_no_owner | memflags); if ( unlikely(page == NULL) ) { rc = -ENOMEM; diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c index 9060386..d999296 100644 --- a/xen/common/page_alloc.c +++ b/xen/common/page_alloc.c @@ -1685,10 +1685,14 @@ struct page_info *alloc_domheap_pages( ASSERT(!in_irq()); - bits = domain_clamp_alloc_bitsize(d, bits ? : (BITS_PER_LONG+PAGE_SHIFT)); + bits = domain_clamp_alloc_bitsize(memflags & MEMF_no_owner ? NULL : d, + bits ? : (BITS_PER_LONG+PAGE_SHIFT)); if ( (zone_hi = min_t(unsigned int, bits_to_zone(bits), zone_hi)) == 0 ) return NULL; + if ( memflags & MEMF_no_owner ) + memflags |= MEMF_no_refcount; + if ( dma_bitsize && ((dma_zone = bits_to_zone(dma_bitsize)) < zone_hi) ) pg = alloc_heap_pages(dma_zone + 1, zone_hi, order, memflags, d); @@ -1698,7 +1702,8 @@ struct page_info *alloc_domheap_pages( memflags, d)) == NULL)) ) return NULL; - if ( (d != NULL) && assign_pages(d, pg, order, memflags) ) + if ( d && !(memflags & MEMF_no_owner) && + assign_pages(d, pg, order, memflags) ) { free_heap_pages(pg, order); return NULL; diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h index 6ea8b8c..fd60c9c 100644 --- a/xen/include/xen/mm.h +++ b/xen/include/xen/mm.h @@ -120,6 +120,8 @@ struct npfec { #define MEMF_no_dma (1U<<_MEMF_no_dma) #define _MEMF_exact_node 4 #define MEMF_exact_node (1U<<_MEMF_exact_node) +#define _MEMF_no_owner 5 +#define MEMF_no_owner (1U<<_MEMF_no_owner) #define _MEMF_node 8 #define MEMF_node_mask ((1U << (8 * sizeof(nodeid_t))) - 1) #define MEMF_node(n) ((((n) + 1) & MEMF_node_mask) << _MEMF_node) -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |