All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/3] Updates to pxm2node mapping and nodeID sizing
@ 2015-02-24 19:11 Boris Ostrovsky
  2015-02-24 19:11 ` [PATCH v2 1/3] x86/numa: Allow arbitrary value of PXM in PXM<->node mapping Boris Ostrovsky
                   ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Boris Ostrovsky @ 2015-02-24 19:11 UTC (permalink / raw)
  To: keir, jbeulich, yang.z.zhang, kevin.tian, ian.campbell,
	stefano.stabellini, tim
  Cc: Andrew.Cooper3, dario.faggioli, boris.ostrovsky, xen-devel

Changes in v2 (only patch #2 is v2, the others are new)

* Added patch #1 to make pxm-to-node mapping independent of PXM values
* Added in patch #3 a couple of macros to access nodeID in memflags


Boris Ostrovsky (3):
  x86/numa: Allow arbitrary value of PXM in PXM<->node mapping
  x86/numa: Adjust datatypes for node and pxm
  mm: MEMF_node should handle changes in nodeid_t size

 xen/arch/x86/irq.c                  |    4 +-
 xen/arch/x86/numa.c                 |   15 ++--
 xen/arch/x86/setup.c                |    2 +-
 xen/arch/x86/smpboot.c              |    5 +-
 xen/arch/x86/srat.c                 |  122 ++++++++++++++++++++++++-----------
 xen/arch/x86/x86_64/mm.c            |    5 +-
 xen/common/page_alloc.c             |    5 +-
 xen/drivers/passthrough/vtd/iommu.c |    5 +-
 xen/include/asm-arm/numa.h          |    4 +-
 xen/include/asm-x86/irq.h           |    3 +-
 xen/include/asm-x86/numa.h          |   24 ++++---
 xen/include/xen/mm.h                |    6 ++-
 12 files changed, 130 insertions(+), 70 deletions(-)

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH v2 1/3] x86/numa: Allow arbitrary value of PXM in PXM<->node mapping
  2015-02-24 19:11 [PATCH v2 0/3] Updates to pxm2node mapping and nodeID sizing Boris Ostrovsky
@ 2015-02-24 19:11 ` Boris Ostrovsky
  2015-02-24 20:58   ` Boris Ostrovsky
                     ` (2 more replies)
  2015-02-24 19:11 ` [PATCH v2 2/3] x86/numa: Adjust datatypes for node and pxm Boris Ostrovsky
  2015-02-24 19:11 ` [PATCH v2 3/3] mm: MEMF_node should handle changes in nodeid_t size Boris Ostrovsky
  2 siblings, 3 replies; 14+ messages in thread
From: Boris Ostrovsky @ 2015-02-24 19:11 UTC (permalink / raw)
  To: keir, jbeulich, yang.z.zhang, kevin.tian, ian.campbell,
	stefano.stabellini, tim
  Cc: Andrew.Cooper3, dario.faggioli, boris.ostrovsky, xen-devel

ACPI defines proximity domain identifier as a 32-bit integer. While
in most cases the values will be zero-based this is not guaranteed,
making current pxm2node[256] mapping structure not appropriate.

We will instead use MAX_NUMNODES-sized array of struct pxm2node to
store PXM-to-node mapping. To accommodate common case of zero-based
and contiguios PXMs we will, whenever possible, try to use PXM as
index into this array array for fast lookups.

Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
---
 xen/arch/x86/srat.c |   93 +++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 68 insertions(+), 25 deletions(-)

diff --git a/xen/arch/x86/srat.c b/xen/arch/x86/srat.c
index 29fc724..c8841b9 100644
--- a/xen/arch/x86/srat.c
+++ b/xen/arch/x86/srat.c
@@ -27,35 +27,79 @@ static nodemask_t memory_nodes_parsed __initdata;
 static nodemask_t processor_nodes_parsed __initdata;
 static nodemask_t nodes_found __initdata;
 static struct node nodes[MAX_NUMNODES] __initdata;
-static u8 __read_mostly pxm2node[256] = { [0 ... 255] = NUMA_NO_NODE };
 
+struct pxm2node {
+    unsigned pxm;
+    int node;
+};
+static struct pxm2node __read_mostly p2n[MAX_NUMNODES] =
+    { [0 ... MAX_NUMNODES - 1] = {.node = NUMA_NO_NODE} };
+
+static int node_to_pxm(int n);
 
 static int num_node_memblks;
 static struct node node_memblk_range[NR_NODE_MEMBLKS];
 static int memblk_nodeid[NR_NODE_MEMBLKS];
 
-
-static int node_to_pxm(int n);
+static inline bool_t node_found(unsigned idx, unsigned pxm)
+{
+    return ((p2n[idx].pxm == pxm) &&
+            (p2n[idx].node != NUMA_NO_NODE));
+}
 
 int pxm_to_node(int pxm)
 {
-	if ((unsigned)pxm >= 256)
-		return -1;
-	/* Extend 0xff to (int)-1 */
-	return (signed char)pxm2node[pxm];
+    unsigned i;
+
+    if ( (pxm < MAX_NUMNODES) && node_found(pxm, pxm) )
+        return p2n[pxm].node;
+
+    for ( i = 0; i < MAX_NUMNODES; i++ )
+        if ( node_found(i, pxm) )
+            return p2n[i].node;
+
+    /* Extend 0xff to (int)-1 */
+    return (signed char)NUMA_NO_NODE;
 }
 
 __devinit int setup_node(int pxm)
 {
-	unsigned node = pxm2node[pxm];
-	if (node == 0xff) {
-		if (nodes_weight(nodes_found) >= MAX_NUMNODES)
-			return -1;
-		node = first_unset_node(nodes_found); 
-		node_set(node, nodes_found);
-		pxm2node[pxm] = node;
-	}
-	return pxm2node[pxm];
+    int node;
+    unsigned idx;
+    static bool_t warned;
+
+    if ( pxm < MAX_NUMNODES )
+    {
+        if ( node_found(pxm, pxm) )
+            return p2n[pxm].node;
+
+        /* Try to maintain indexing of p2n by pxm */
+        if ( p2n[pxm].node == NUMA_NO_NODE )
+        {
+            idx = pxm;
+            goto finish;
+        }
+    }
+
+    for ( idx = 0; idx < MAX_NUMNODES; idx++ )
+        if ( p2n[idx].node == NUMA_NO_NODE )
+            goto finish;
+
+    if ( !warned )
+    {
+        printk(XENLOG_WARNING "More PXMs than available nodes\n");
+        warned = 1;
+    }
+
+    return (signed char)NUMA_NO_NODE;
+
+ finish:
+    node = first_unset_node(nodes_found);
+    node_set(node, nodes_found);
+    p2n[idx].pxm = pxm;
+    p2n[pxm].node = node;
+
+    return node;
 }
 
 int valid_numa_range(u64 start, u64 end, int node)
@@ -111,8 +155,6 @@ static __init void bad_srat(void)
 	acpi_numa = -1;
 	for (i = 0; i < MAX_LOCAL_APIC; i++)
 		apicid_to_node[i] = NUMA_NO_NODE;
-	for (i = 0; i < ARRAY_SIZE(pxm2node); i++)
-		pxm2node[i] = NUMA_NO_NODE;
 	mem_hotplug = 0;
 }
 
@@ -440,13 +482,14 @@ int __init acpi_scan_nodes(u64 start, u64 end)
 
 static int node_to_pxm(int n)
 {
-       int i;
-       if (pxm2node[n] == n)
-               return n;
-       for (i = 0; i < 256; i++)
-               if (pxm2node[i] == n)
-                       return i;
-       return 0;
+    unsigned i;
+
+    if ( p2n[n].node == n )
+        return p2n[n].pxm;
+    for ( i = 0; i < MAX_NUMNODES; i++ )
+        if ( p2n[i].node == n )
+            return p2n[i].pxm;
+    return 0;
 }
 
 int __node_distance(int a, int b)
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 2/3] x86/numa: Adjust datatypes for node and pxm
  2015-02-24 19:11 [PATCH v2 0/3] Updates to pxm2node mapping and nodeID sizing Boris Ostrovsky
  2015-02-24 19:11 ` [PATCH v2 1/3] x86/numa: Allow arbitrary value of PXM in PXM<->node mapping Boris Ostrovsky
@ 2015-02-24 19:11 ` Boris Ostrovsky
  2015-02-25  9:44   ` Jan Beulich
  2015-02-24 19:11 ` [PATCH v2 3/3] mm: MEMF_node should handle changes in nodeid_t size Boris Ostrovsky
  2 siblings, 1 reply; 14+ messages in thread
From: Boris Ostrovsky @ 2015-02-24 19:11 UTC (permalink / raw)
  To: keir, jbeulich, yang.z.zhang, kevin.tian, ian.campbell,
	stefano.stabellini, tim
  Cc: Andrew.Cooper3, dario.faggioli, boris.ostrovsky, xen-devel

Use u8-sized node IDs and unsigned PXMs consistently throughout
code (and introduce nodeid_t type).

Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
---

Changes (due to new pxm-to-node mapping from patch #1):
 * No MAX_PXM
 * No need to BUILD_BUG_ON(MAX_NUMNODES > 254)


 xen/arch/x86/irq.c                  |    4 +-
 xen/arch/x86/numa.c                 |   15 ++++++------
 xen/arch/x86/setup.c                |    2 +-
 xen/arch/x86/smpboot.c              |    5 ++-
 xen/arch/x86/srat.c                 |   41 ++++++++++++++++++----------------
 xen/arch/x86/x86_64/mm.c            |    5 ++-
 xen/common/page_alloc.c             |    5 ++-
 xen/drivers/passthrough/vtd/iommu.c |    5 ++-
 xen/include/asm-arm/numa.h          |    4 ++-
 xen/include/asm-x86/irq.h           |    3 +-
 xen/include/asm-x86/numa.h          |   24 +++++++++++---------
 11 files changed, 63 insertions(+), 50 deletions(-)

diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c
index f214072..9be8840 100644
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -153,7 +153,7 @@ int __init bind_irq_vector(int irq, int vector, const cpumask_t *cpu_mask)
 /*
  * Dynamic irq allocate and deallocation for MSI
  */
-int create_irq(int node)
+int create_irq(nodeid_t node)
 {
     int irq, ret;
     struct irq_desc *desc;
@@ -173,7 +173,7 @@ int create_irq(int node)
     {
         cpumask_t *mask = NULL;
 
-        if (node != NUMA_NO_NODE && node >= 0)
+        if ( node != NUMA_NO_NODE )
         {
             mask = &node_to_cpumask(node);
             if (cpumask_empty(mask))
diff --git a/xen/arch/x86/numa.c b/xen/arch/x86/numa.c
index 628a40a..7a01923 100644
--- a/xen/arch/x86/numa.c
+++ b/xen/arch/x86/numa.c
@@ -35,13 +35,13 @@ static typeof(*memnodemap) _memnodemap[64];
 unsigned long memnodemapsize;
 u8 *memnodemap;
 
-unsigned char cpu_to_node[NR_CPUS] __read_mostly = {
+nodeid_t cpu_to_node[NR_CPUS] __read_mostly = {
     [0 ... NR_CPUS-1] = NUMA_NO_NODE
 };
 /*
  * Keep BIOS's CPU2node information, should not be used for memory allocaion
  */
-unsigned char apicid_to_node[MAX_LOCAL_APIC] __cpuinitdata = {
+nodeid_t apicid_to_node[MAX_LOCAL_APIC] __cpuinitdata = {
     [0 ... MAX_LOCAL_APIC-1] = NUMA_NO_NODE
 };
 cpumask_t node_to_cpumask[MAX_NUMNODES] __read_mostly;
@@ -65,7 +65,7 @@ int srat_disabled(void)
  * -1 if node overlap or lost ram (shift too big)
  */
 static int __init populate_memnodemap(const struct node *nodes,
-                                      int numnodes, int shift, int *nodeids)
+                                      int numnodes, int shift, nodeid_t *nodeids)
 {
     unsigned long spdx, epdx;
     int i, res = -1;
@@ -150,7 +150,7 @@ static int __init extract_lsb_from_nodes(const struct node *nodes,
 }
 
 int __init compute_hash_shift(struct node *nodes, int numnodes,
-                              int *nodeids)
+                              nodeid_t *nodeids)
 {
     int shift;
 
@@ -172,7 +172,7 @@ int __init compute_hash_shift(struct node *nodes, int numnodes,
     return shift;
 }
 /* initialize NODE_DATA given nodeid and start/end */
-void __init setup_node_bootmem(int nodeid, u64 start, u64 end)
+void __init setup_node_bootmem(nodeid_t nodeid, u64 start, u64 end)
 { 
     unsigned long start_pfn, end_pfn;
 
@@ -294,7 +294,7 @@ __cpuinit void numa_add_cpu(int cpu)
     cpumask_set_cpu(cpu, &node_to_cpumask[cpu_to_node(cpu)]);
 } 
 
-void __cpuinit numa_set_node(int cpu, int node)
+void __cpuinit numa_set_node(int cpu, nodeid_t node)
 {
     cpu_to_node[cpu] = node;
 }
@@ -340,7 +340,8 @@ static __init int numa_setup(char *opt)
  */
 void __init init_cpu_to_node(void)
 {
-    int i, node;
+    unsigned i;
+    nodeid_t node;
 
     for ( i = 0; i < nr_cpu_ids; i++ )
     {
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index c27c49c..84da722 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -188,7 +188,7 @@ static void __init init_idle_domain(void)
 
 void __devinit srat_detect_node(int cpu)
 {
-    unsigned node;
+    nodeid_t node;
     u32 apicid = x86_cpu_to_apicid[cpu];
 
     node = apicid_to_node[apicid];
diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c
index c54be7e..3d970dd 100644
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -843,7 +843,8 @@ void __cpu_die(unsigned int cpu)
 
 int cpu_add(uint32_t apic_id, uint32_t acpi_id, uint32_t pxm)
 {
-    int node, cpu = -1;
+    nodeid_t node;
+    int cpu = -1;
 
     dprintk(XENLOG_DEBUG, "cpu_add apic_id %x acpi_id %x pxm %x\n",
             apic_id, acpi_id, pxm);
@@ -877,7 +878,7 @@ int cpu_add(uint32_t apic_id, uint32_t acpi_id, uint32_t pxm)
 
     if ( !srat_disabled() )
     {
-        if ( (node = setup_node(pxm)) < 0 )
+        if ( (node = setup_node(pxm)) == NUMA_NO_NODE )
         {
             dprintk(XENLOG_WARNING,
                     "Setup node failed for pxm %x\n", pxm);
diff --git a/xen/arch/x86/srat.c b/xen/arch/x86/srat.c
index c8841b9..63569f9 100644
--- a/xen/arch/x86/srat.c
+++ b/xen/arch/x86/srat.c
@@ -30,16 +30,16 @@ static struct node nodes[MAX_NUMNODES] __initdata;
 
 struct pxm2node {
     unsigned pxm;
-    int node;
+    nodeid_t node;
 };
 static struct pxm2node __read_mostly p2n[MAX_NUMNODES] =
     { [0 ... MAX_NUMNODES - 1] = {.node = NUMA_NO_NODE} };
 
-static int node_to_pxm(int n);
+static unsigned node_to_pxm(nodeid_t n);
 
 static int num_node_memblks;
 static struct node node_memblk_range[NR_NODE_MEMBLKS];
-static int memblk_nodeid[NR_NODE_MEMBLKS];
+static nodeid_t memblk_nodeid[NR_NODE_MEMBLKS];
 
 static inline bool_t node_found(unsigned idx, unsigned pxm)
 {
@@ -47,7 +47,7 @@ static inline bool_t node_found(unsigned idx, unsigned pxm)
             (p2n[idx].node != NUMA_NO_NODE));
 }
 
-int pxm_to_node(int pxm)
+nodeid_t pxm_to_node(unsigned pxm)
 {
     unsigned i;
 
@@ -58,13 +58,12 @@ int pxm_to_node(int pxm)
         if ( node_found(i, pxm) )
             return p2n[i].node;
 
-    /* Extend 0xff to (int)-1 */
-    return (signed char)NUMA_NO_NODE;
+    return NUMA_NO_NODE;
 }
 
-__devinit int setup_node(int pxm)
+__devinit nodeid_t setup_node(unsigned pxm)
 {
-    int node;
+    nodeid_t node;
     unsigned idx;
     static bool_t warned;
 
@@ -91,7 +90,7 @@ __devinit int setup_node(int pxm)
         warned = 1;
     }
 
-    return (signed char)NUMA_NO_NODE;
+    return NUMA_NO_NODE;
 
  finish:
     node = first_unset_node(nodes_found);
@@ -102,7 +101,7 @@ __devinit int setup_node(int pxm)
     return node;
 }
 
-int valid_numa_range(u64 start, u64 end, int node)
+int valid_numa_range(u64 start, u64 end, nodeid_t node)
 {
 	int i;
 
@@ -204,8 +203,9 @@ void __init acpi_numa_slit_init(struct acpi_table_slit *slit)
 void __init
 acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
 {
-	int pxm, node;
-	int apic_id;
+	unsigned pxm;
+	nodeid_t node;
+	u32 apic_id;
 
 	if (srat_disabled())
 		return;
@@ -217,7 +217,7 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
 		return;
 	pxm = pa->proximity_domain;
 	node = setup_node(pxm);
-	if (node < 0) {
+	if (node == NUMA_NO_NODE) {
 		printk(KERN_ERR "SRAT: Too many proximity domains %x\n", pxm);
 		bad_srat();
 		return;
@@ -234,7 +234,9 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
 void __init
 acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)
 {
-	int pxm, node;
+	unsigned pxm;
+	nodeid_t node;
+
 	if (srat_disabled())
 		return;
 	if (pa->header.length != sizeof(struct acpi_srat_cpu_affinity)) {
@@ -250,7 +252,7 @@ acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)
 		pxm |= pa->proximity_domain_hi[2] << 24;
 	}
 	node = setup_node(pxm);
-	if (node < 0) {
+	if (node == NUMA_NO_NODE) {
 		printk(KERN_ERR "SRAT: Too many proximity domains %x\n", pxm);
 		bad_srat();
 		return;
@@ -268,7 +270,8 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
 {
 	struct node *nd;
 	u64 start, end;
-	int node, pxm;
+	unsigned pxm;
+	nodeid_t node;
 	int i;
 
 	if (srat_disabled())
@@ -294,7 +297,7 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
 	if (srat_rev < 2)
 		pxm &= 0xff;
 	node = setup_node(pxm);
-	if (node < 0) {
+	if (node == NUMA_NO_NODE) {
 		printk(KERN_ERR "SRAT: Too many proximity domains.\n");
 		bad_srat();
 		return;
@@ -480,7 +483,7 @@ int __init acpi_scan_nodes(u64 start, u64 end)
 	return 0;
 }
 
-static int node_to_pxm(int n)
+static unsigned node_to_pxm(nodeid_t n)
 {
     unsigned i;
 
@@ -492,7 +495,7 @@ static int node_to_pxm(int n)
     return 0;
 }
 
-int __node_distance(int a, int b)
+int __node_distance(nodeid_t a, nodeid_t b)
 {
 	int index;
 
diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c
index d631aee..6875c92 100644
--- a/xen/arch/x86/x86_64/mm.c
+++ b/xen/arch/x86/x86_64/mm.c
@@ -1343,7 +1343,8 @@ int mem_hotadd_check(unsigned long spfn, unsigned long epfn)
 int memory_add(unsigned long spfn, unsigned long epfn, unsigned int pxm)
 {
     struct mem_hotadd_info info;
-    int ret, node;
+    int ret;
+    nodeid_t node;
     unsigned long old_max = max_page, old_total = total_pages;
     unsigned long old_node_start, old_node_span, orig_online;
     unsigned long i;
@@ -1353,7 +1354,7 @@ int memory_add(unsigned long spfn, unsigned long epfn, unsigned int pxm)
     if ( !mem_hotadd_check(spfn, epfn) )
         return -EINVAL;
 
-    if ( (node = setup_node(pxm)) == -1 )
+    if ( (node = setup_node(pxm)) == NUMA_NO_NODE )
         return -EINVAL;
 
     if ( !valid_numa_range(spfn << PAGE_SHIFT, epfn << PAGE_SHIFT, node) )
diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
index 7b4092d..124fa88 100644
--- a/xen/common/page_alloc.c
+++ b/xen/common/page_alloc.c
@@ -581,7 +581,7 @@ static struct page_info *alloc_heap_pages(
     struct domain *d)
 {
     unsigned int first_node, i, j, zone = 0, nodemask_retry = 0;
-    unsigned int node = (uint8_t)((memflags >> _MEMF_node) - 1);
+    nodeid_t node = (nodeid_t)((memflags >> _MEMF_node) - 1);
     unsigned long request = 1UL << order;
     struct page_info *pg;
     nodemask_t nodemask = (d != NULL ) ? d->node_affinity : node_online_map;
@@ -1278,7 +1278,8 @@ static void __init smp_scrub_heap_pages(void *data)
     unsigned long mfn, start, end;
     struct page_info *pg;
     struct scrub_region *r;
-    unsigned int temp_cpu, node, cpu_idx = 0;
+    unsigned int temp_cpu, cpu_idx = 0;
+    nodeid_t node;
     unsigned int cpu = smp_processor_id();
 
     if ( data )
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 19d8165..2e0af6f 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -190,14 +190,15 @@ u64 alloc_pgtable_maddr(struct acpi_drhd_unit *drhd, unsigned long npages)
     struct acpi_rhsa_unit *rhsa;
     struct page_info *pg, *cur_pg;
     u64 *vaddr;
-    int node = -1, i;
+    nodeid_t node = NUMA_NO_NODE;
+    unsigned i;
 
     rhsa = drhd_to_rhsa(drhd);
     if ( rhsa )
         node =  pxm_to_node(rhsa->proximity_domain);
 
     pg = alloc_domheap_pages(NULL, get_order_from_pages(npages),
-                             (node == -1 ) ? 0 : MEMF_node(node));
+                             (node == NUMA_NO_NODE) ? 0 : MEMF_node(node));
     if ( !pg )
         return 0;
 
diff --git a/xen/include/asm-arm/numa.h b/xen/include/asm-arm/numa.h
index 06a9d5a..a00cb7c 100644
--- a/xen/include/asm-arm/numa.h
+++ b/xen/include/asm-arm/numa.h
@@ -1,11 +1,13 @@
 #ifndef __ARCH_ARM_NUMA_H
 #define __ARCH_ARM_NUMA_H
 
+typedef u8 nodeid_t;
+
 /* Fake one node for now. See also node_online_map. */
 #define cpu_to_node(cpu) 0
 #define node_to_cpumask(node)   (cpu_online_map)
 
-static inline __attribute__((pure)) int phys_to_nid(paddr_t addr)
+static inline __attribute__((pure)) nodeid_t phys_to_nid(paddr_t addr)
 {
     return 0;
 }
diff --git a/xen/include/asm-x86/irq.h b/xen/include/asm-x86/irq.h
index d3c55f3..a44305e 100644
--- a/xen/include/asm-x86/irq.h
+++ b/xen/include/asm-x86/irq.h
@@ -5,6 +5,7 @@
 
 #include <xen/config.h>
 #include <asm/atomic.h>
+#include <asm/numa.h>
 #include <xen/cpumask.h>
 #include <xen/smp.h>
 #include <xen/hvm/irq.h>
@@ -155,7 +156,7 @@ int  init_irq_data(void);
 void clear_irq_vector(int irq);
 
 int irq_to_vector(int irq);
-int create_irq(int node);
+int create_irq(nodeid_t node);
 void destroy_irq(unsigned int irq);
 int assign_irq_vector(int irq, const cpumask_t *);
 
diff --git a/xen/include/asm-x86/numa.h b/xen/include/asm-x86/numa.h
index 5959860..419f770 100644
--- a/xen/include/asm-x86/numa.h
+++ b/xen/include/asm-x86/numa.h
@@ -5,6 +5,8 @@
 
 #define NODES_SHIFT 6
 
+typedef u8 nodeid_t;
+
 extern int srat_rev;
 
 extern unsigned char cpu_to_node[];
@@ -20,8 +22,8 @@ struct node {
 };
 
 extern int compute_hash_shift(struct node *nodes, int numnodes,
-			      int *nodeids);
-extern int pxm_to_node(int nid);
+			      nodeid_t *nodeids);
+extern nodeid_t pxm_to_node(unsigned pxm);
 
 #define ZONE_ALIGN (1UL << (MAX_ORDER+PAGE_SHIFT))
 #define VIRTUAL_BUG_ON(x) 
@@ -32,12 +34,12 @@ extern int numa_off;
 
 
 extern int srat_disabled(void);
-extern void numa_set_node(int cpu, int node);
-extern int setup_node(int pxm);
+extern void numa_set_node(int cpu, nodeid_t node);
+extern nodeid_t setup_node(unsigned pxm);
 extern void srat_detect_node(int cpu);
 
-extern void setup_node_bootmem(int nodeid, u64 start, u64 end);
-extern unsigned char apicid_to_node[];
+extern void setup_node_bootmem(nodeid_t nodeid, u64 start, u64 end);
+extern nodeid_t apicid_to_node[];
 #ifdef CONFIG_NUMA
 extern void init_cpu_to_node(void);
 
@@ -54,14 +56,14 @@ extern u8 *memnodemap;
 struct node_data {
     unsigned long node_start_pfn;
     unsigned long node_spanned_pages;
-    unsigned int  node_id;
+    nodeid_t      node_id;
 };
 
 extern struct node_data node_data[];
 
-static inline __attribute__((pure)) int phys_to_nid(paddr_t addr) 
+static inline __attribute__((pure)) nodeid_t phys_to_nid(paddr_t addr) 
 { 
-	unsigned nid;
+	nodeid_t nid;
 	VIRTUAL_BUG_ON((paddr_to_pdx(addr) >> memnode_shift) >= memnodemapsize);
 	nid = memnodemap[paddr_to_pdx(addr) >> memnode_shift]; 
 	VIRTUAL_BUG_ON(nid >= MAX_NUMNODES || !node_data[nid]); 
@@ -75,7 +77,7 @@ static inline __attribute__((pure)) int phys_to_nid(paddr_t addr)
 #define node_end_pfn(nid)       (NODE_DATA(nid)->node_start_pfn + \
 				 NODE_DATA(nid)->node_spanned_pages)
 
-extern int valid_numa_range(u64 start, u64 end, int node);
+extern int valid_numa_range(u64 start, u64 end, nodeid_t node);
 #else
 #define init_cpu_to_node() do {} while (0)
 #define clear_node_cpumask(cpu) do {} while (0)
@@ -83,6 +85,6 @@ extern int valid_numa_range(u64 start, u64 end, int node);
 #endif
 
 void srat_parse_regions(u64 addr);
-extern int __node_distance(int a, int b);
+extern int __node_distance(nodeid_t a, nodeid_t b);
 
 #endif
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 3/3] mm: MEMF_node should handle changes in nodeid_t size
  2015-02-24 19:11 [PATCH v2 0/3] Updates to pxm2node mapping and nodeID sizing Boris Ostrovsky
  2015-02-24 19:11 ` [PATCH v2 1/3] x86/numa: Allow arbitrary value of PXM in PXM<->node mapping Boris Ostrovsky
  2015-02-24 19:11 ` [PATCH v2 2/3] x86/numa: Adjust datatypes for node and pxm Boris Ostrovsky
@ 2015-02-24 19:11 ` Boris Ostrovsky
  2015-02-25  9:47   ` Jan Beulich
  2015-02-25 10:35   ` Jan Beulich
  2 siblings, 2 replies; 14+ messages in thread
From: Boris Ostrovsky @ 2015-02-24 19:11 UTC (permalink / raw)
  To: keir, jbeulich, yang.z.zhang, kevin.tian, ian.campbell,
	stefano.stabellini, tim
  Cc: Andrew.Cooper3, dario.faggioli, boris.ostrovsky, xen-devel

Instead of using a hardcoded constant to extract nodeID from
memflags use a macro whose value is based on nodeid_t size.

Also provide a macro for extracting nodeID from memflags so that
users don't need to remember to decrement the value.

Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
---
 xen/common/page_alloc.c |    2 +-
 xen/include/xen/mm.h    |    6 +++++-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
index 124fa88..367b5bd 100644
--- a/xen/common/page_alloc.c
+++ b/xen/common/page_alloc.c
@@ -581,7 +581,7 @@ static struct page_info *alloc_heap_pages(
     struct domain *d)
 {
     unsigned int first_node, i, j, zone = 0, nodemask_retry = 0;
-    nodeid_t node = (nodeid_t)((memflags >> _MEMF_node) - 1);
+    nodeid_t node = MEMF2NODE(memflags);
     unsigned long request = 1UL << order;
     struct page_info *pg;
     nodemask_t nodemask = (d != NULL ) ? d->node_affinity : node_online_map;
diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h
index 74a65a6..c86c487 100644
--- a/xen/include/xen/mm.h
+++ b/xen/include/xen/mm.h
@@ -110,6 +110,8 @@ struct npfec {
 };
 
 /* memflags: */
+#define MEMF_node_mask    ((1U << sizeof(nodeid_t)) - 1)
+
 #define _MEMF_no_refcount 0
 #define  MEMF_no_refcount (1U<<_MEMF_no_refcount)
 #define _MEMF_populate_on_demand 1
@@ -121,10 +123,12 @@ struct npfec {
 #define _MEMF_exact_node  4
 #define  MEMF_exact_node  (1U<<_MEMF_exact_node)
 #define _MEMF_node        8
-#define  MEMF_node(n)     ((((n)+1)&0xff)<<_MEMF_node)
+#define  MEMF_node(n)     ((((n)+1) & MEMF_node_mask) << _MEMF_node)
 #define _MEMF_bits        24
 #define  MEMF_bits(n)     ((n)<<_MEMF_bits)
 
+#define MEMF2NODE(memflags) (MASK_EXTR(memflags, MEMF_node_mask) - 1)
+
 #ifdef CONFIG_PAGEALLOC_MAX_ORDER
 #define MAX_ORDER CONFIG_PAGEALLOC_MAX_ORDER
 #else
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 1/3] x86/numa: Allow arbitrary value of PXM in PXM<->node mapping
  2015-02-24 19:11 ` [PATCH v2 1/3] x86/numa: Allow arbitrary value of PXM in PXM<->node mapping Boris Ostrovsky
@ 2015-02-24 20:58   ` Boris Ostrovsky
  2015-02-25  9:34   ` Jan Beulich
  2015-02-25 10:34   ` Jan Beulich
  2 siblings, 0 replies; 14+ messages in thread
From: Boris Ostrovsky @ 2015-02-24 20:58 UTC (permalink / raw)
  To: keir, jbeulich, yang.z.zhang, kevin.tian, ian.campbell,
	stefano.stabellini, tim
  Cc: Andrew.Cooper3, dario.faggioli, xen-devel

On 02/24/2015 02:11 PM, Boris Ostrovsky wrote:
>   __devinit int setup_node(int pxm)
>   {

...

> +
> + finish:
> +    node = first_unset_node(nodes_found);
> +    node_set(node, nodes_found);
> +    p2n[idx].pxm = pxm;
> +    p2n[pxm].node = node;


This is a typo. Should be

     p2n[idx].node = node;

-boris

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 1/3] x86/numa: Allow arbitrary value of PXM in PXM<->node mapping
  2015-02-24 19:11 ` [PATCH v2 1/3] x86/numa: Allow arbitrary value of PXM in PXM<->node mapping Boris Ostrovsky
  2015-02-24 20:58   ` Boris Ostrovsky
@ 2015-02-25  9:34   ` Jan Beulich
  2015-02-25 13:11     ` Boris Ostrovsky
  2015-02-25 10:34   ` Jan Beulich
  2 siblings, 1 reply; 14+ messages in thread
From: Jan Beulich @ 2015-02-25  9:34 UTC (permalink / raw)
  To: Boris Ostrovsky
  Cc: kevin.tian, keir, ian.campbell, Andrew.Cooper3, dario.faggioli,
	tim, xen-devel, stefano.stabellini, yang.z.zhang

>>> On 24.02.15 at 20:11, <boris.ostrovsky@oracle.com> wrote:
> --- a/xen/arch/x86/srat.c
> +++ b/xen/arch/x86/srat.c
> @@ -27,35 +27,79 @@ static nodemask_t memory_nodes_parsed __initdata;
>  static nodemask_t processor_nodes_parsed __initdata;
>  static nodemask_t nodes_found __initdata;
>  static struct node nodes[MAX_NUMNODES] __initdata;
> -static u8 __read_mostly pxm2node[256] = { [0 ... 255] = NUMA_NO_NODE };
>  
> +struct pxm2node {
> +    unsigned pxm;
> +    int node;
> +};
> +static struct pxm2node __read_mostly p2n[MAX_NUMNODES] =

Can this please continue to be named pxm2node[]? "p2..." is too
commonly used for representing a phys-to-something conversion.

> +    { [0 ... MAX_NUMNODES - 1] = {.node = NUMA_NO_NODE} };
> +
> +static int node_to_pxm(int n);

I don't see why you need to reinstate this forward declaration.

>  int pxm_to_node(int pxm)
>  {
> -	if ((unsigned)pxm >= 256)
> -		return -1;
> -	/* Extend 0xff to (int)-1 */
> -	return (signed char)pxm2node[pxm];
> +    unsigned i;
> +
> +    if ( (pxm < MAX_NUMNODES) && node_found(pxm, pxm) )
> +        return p2n[pxm].node;

With this the function parameter's type can't remain to be signed.
Also please don't change coding style here, unless you do so for
the whole file (in a separate patch). The one change I wouldn't
mind is switching node_to_pxm() from 8-space to tab indentation.

>  __devinit int setup_node(int pxm)
>  {
> -	unsigned node = pxm2node[pxm];
> -	if (node == 0xff) {
> -		if (nodes_weight(nodes_found) >= MAX_NUMNODES)
> -			return -1;
> -		node = first_unset_node(nodes_found); 
> -		node_set(node, nodes_found);
> -		pxm2node[pxm] = node;
> -	}
> -	return pxm2node[pxm];
> +    int node;
> +    unsigned idx;
> +    static bool_t warned;
> +
> +    if ( pxm < MAX_NUMNODES )
> +    {
> +        if ( node_found(pxm, pxm) )
> +            return p2n[pxm].node;
> +
> +        /* Try to maintain indexing of p2n by pxm */

Coding style.

> @@ -111,8 +155,6 @@ static __init void bad_srat(void)
>  	acpi_numa = -1;
>  	for (i = 0; i < MAX_LOCAL_APIC; i++)
>  		apicid_to_node[i] = NUMA_NO_NODE;
> -	for (i = 0; i < ARRAY_SIZE(pxm2node); i++)
> -		pxm2node[i] = NUMA_NO_NODE;

Without any replacement?

Jan

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 2/3] x86/numa: Adjust datatypes for node and pxm
  2015-02-24 19:11 ` [PATCH v2 2/3] x86/numa: Adjust datatypes for node and pxm Boris Ostrovsky
@ 2015-02-25  9:44   ` Jan Beulich
  0 siblings, 0 replies; 14+ messages in thread
From: Jan Beulich @ 2015-02-25  9:44 UTC (permalink / raw)
  To: Boris Ostrovsky
  Cc: kevin.tian, keir, ian.campbell, Andrew.Cooper3, dario.faggioli,
	tim, xen-devel, stefano.stabellini, yang.z.zhang

>>> On 24.02.15 at 20:11, <boris.ostrovsky@oracle.com> wrote:
> --- a/xen/arch/x86/smpboot.c
> +++ b/xen/arch/x86/smpboot.c
> @@ -843,7 +843,8 @@ void __cpu_die(unsigned int cpu)
>  
>  int cpu_add(uint32_t apic_id, uint32_t acpi_id, uint32_t pxm)
>  {
> -    int node, cpu = -1;
> +    nodeid_t node;

Please take the opportunity and move the declaration into the
scope it's actually needed in, at once allowing the call the
setup_node() to become its initializer.

Jan

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 3/3] mm: MEMF_node should handle changes in nodeid_t size
  2015-02-24 19:11 ` [PATCH v2 3/3] mm: MEMF_node should handle changes in nodeid_t size Boris Ostrovsky
@ 2015-02-25  9:47   ` Jan Beulich
  2015-02-25 10:35   ` Jan Beulich
  1 sibling, 0 replies; 14+ messages in thread
From: Jan Beulich @ 2015-02-25  9:47 UTC (permalink / raw)
  To: Boris Ostrovsky
  Cc: kevin.tian, keir, ian.campbell, Andrew.Cooper3, dario.faggioli,
	tim, xen-devel, stefano.stabellini, yang.z.zhang

>>> On 24.02.15 at 20:11, <boris.ostrovsky@oracle.com> wrote:
> Instead of using a hardcoded constant to extract nodeID from
> memflags use a macro whose value is based on nodeid_t size.
> 
> Also provide a macro for extracting nodeID from memflags so that
> users don't need to remember to decrement the value.
> 
> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> ---
>  xen/common/page_alloc.c |    2 +-
>  xen/include/xen/mm.h    |    6 +++++-
>  2 files changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
> index 124fa88..367b5bd 100644
> --- a/xen/common/page_alloc.c
> +++ b/xen/common/page_alloc.c
> @@ -581,7 +581,7 @@ static struct page_info *alloc_heap_pages(
>      struct domain *d)
>  {
>      unsigned int first_node, i, j, zone = 0, nodemask_retry = 0;
> -    nodeid_t node = (nodeid_t)((memflags >> _MEMF_node) - 1);
> +    nodeid_t node = MEMF2NODE(memflags);
>      unsigned long request = 1UL << order;
>      struct page_info *pg;
>      nodemask_t nodemask = (d != NULL ) ? d->node_affinity : node_online_map;
> diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h
> index 74a65a6..c86c487 100644
> --- a/xen/include/xen/mm.h
> +++ b/xen/include/xen/mm.h
> @@ -110,6 +110,8 @@ struct npfec {
>  };
>  
>  /* memflags: */
> +#define MEMF_node_mask    ((1U << sizeof(nodeid_t)) - 1)

DYM 8 * sizeof()? Also please put this side by side with _MEMF_node.

> @@ -121,10 +123,12 @@ struct npfec {
>  #define _MEMF_exact_node  4
>  #define  MEMF_exact_node  (1U<<_MEMF_exact_node)
>  #define _MEMF_node        8
> -#define  MEMF_node(n)     ((((n)+1)&0xff)<<_MEMF_node)
> +#define  MEMF_node(n)     ((((n)+1) & MEMF_node_mask) << _MEMF_node)
>  #define _MEMF_bits        24
>  #define  MEMF_bits(n)     ((n)<<_MEMF_bits)

At the very least you'll want to put a BUILD_BUG_ON() somewhere
to make sure MEMF_node() doesn't spill into MEMF_bits().

Jan

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 1/3] x86/numa: Allow arbitrary value of PXM in PXM<->node mapping
  2015-02-24 19:11 ` [PATCH v2 1/3] x86/numa: Allow arbitrary value of PXM in PXM<->node mapping Boris Ostrovsky
  2015-02-24 20:58   ` Boris Ostrovsky
  2015-02-25  9:34   ` Jan Beulich
@ 2015-02-25 10:34   ` Jan Beulich
  2 siblings, 0 replies; 14+ messages in thread
From: Jan Beulich @ 2015-02-25 10:34 UTC (permalink / raw)
  To: Boris Ostrovsky
  Cc: kevin.tian, keir, ian.campbell, Andrew.Cooper3, dario.faggioli,
	tim, xen-devel, stefano.stabellini, yang.z.zhang

>>> On 24.02.15 at 20:11, <boris.ostrovsky@oracle.com> wrote:
> --- a/xen/arch/x86/srat.c
> +++ b/xen/arch/x86/srat.c
> @@ -27,35 +27,79 @@ static nodemask_t memory_nodes_parsed __initdata;
>  static nodemask_t processor_nodes_parsed __initdata;
>  static nodemask_t nodes_found __initdata;
>  static struct node nodes[MAX_NUMNODES] __initdata;
> -static u8 __read_mostly pxm2node[256] = { [0 ... 255] = NUMA_NO_NODE };
>  
> +struct pxm2node {
> +    unsigned pxm;
> +    int node;
> +};
> +static struct pxm2node __read_mostly p2n[MAX_NUMNODES] =
> +    { [0 ... MAX_NUMNODES - 1] = {.node = NUMA_NO_NODE} };

Type and initializer don't match up.

Jan

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 3/3] mm: MEMF_node should handle changes in nodeid_t size
  2015-02-24 19:11 ` [PATCH v2 3/3] mm: MEMF_node should handle changes in nodeid_t size Boris Ostrovsky
  2015-02-25  9:47   ` Jan Beulich
@ 2015-02-25 10:35   ` Jan Beulich
  2015-02-25 13:30     ` Boris Ostrovsky
  1 sibling, 1 reply; 14+ messages in thread
From: Jan Beulich @ 2015-02-25 10:35 UTC (permalink / raw)
  To: Boris Ostrovsky
  Cc: kevin.tian, keir, ian.campbell, Andrew.Cooper3, dario.faggioli,
	tim, xen-devel, stefano.stabellini, yang.z.zhang

>>> On 24.02.15 at 20:11, <boris.ostrovsky@oracle.com> wrote:
> @@ -121,10 +123,12 @@ struct npfec {
>  #define _MEMF_exact_node  4
>  #define  MEMF_exact_node  (1U<<_MEMF_exact_node)
>  #define _MEMF_node        8
> -#define  MEMF_node(n)     ((((n)+1)&0xff)<<_MEMF_node)
> +#define  MEMF_node(n)     ((((n)+1) & MEMF_node_mask) << _MEMF_node)
>  #define _MEMF_bits        24
>  #define  MEMF_bits(n)     ((n)<<_MEMF_bits)
>  
> +#define MEMF2NODE(memflags) (MASK_EXTR(memflags, MEMF_node_mask) - 1)

As this is being used just once, I don't really see a need for it to be
exposed globally. Perhaps do away with the macro, but at the very
least confine it to page_alloc.c.

Jan

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 1/3] x86/numa: Allow arbitrary value of PXM in PXM<->node mapping
  2015-02-25  9:34   ` Jan Beulich
@ 2015-02-25 13:11     ` Boris Ostrovsky
  2015-02-25 13:25       ` Jan Beulich
  0 siblings, 1 reply; 14+ messages in thread
From: Boris Ostrovsky @ 2015-02-25 13:11 UTC (permalink / raw)
  To: Jan Beulich
  Cc: kevin.tian, keir, ian.campbell, Andrew.Cooper3, dario.faggioli,
	tim, xen-devel, stefano.stabellini, yang.z.zhang

On 02/25/2015 04:34 AM, Jan Beulich wrote:
>>>> On 24.02.15 at 20:11, <boris.ostrovsky@oracle.com> wrote:
>> --- a/xen/arch/x86/srat.c
>> +++ b/xen/arch/x86/srat.c
>> @@ -27,35 +27,79 @@ static nodemask_t memory_nodes_parsed __initdata;
>>   static nodemask_t processor_nodes_parsed __initdata;
>>   static nodemask_t nodes_found __initdata;
>>   static struct node nodes[MAX_NUMNODES] __initdata;
>> -static u8 __read_mostly pxm2node[256] = { [0 ... 255] = NUMA_NO_NODE };
>>   
>> +struct pxm2node {
>> +    unsigned pxm;
>> +    int node;
>> +};
>> +static struct pxm2node __read_mostly p2n[MAX_NUMNODES] =
> Can this please continue to be named pxm2node[]? "p2..." is too
> commonly used for representing a phys-to-something conversion.
>
>> +    { [0 ... MAX_NUMNODES - 1] = {.node = NUMA_NO_NODE} };
>> +
>> +static int node_to_pxm(int n);
> I don't see why you need to reinstate this forward declaration.

It is used in acpi_numa_memory_affinity_init() which is defined above 
node_to_pxm().

I can just move node_to_pxm() definition higher and drop forward 
declaration.

>
>>   int pxm_to_node(int pxm)
>>   {
>> -	if ((unsigned)pxm >= 256)
>> -		return -1;
>> -	/* Extend 0xff to (int)-1 */
>> -	return (signed char)pxm2node[pxm];
>> +    unsigned i;
>> +
>> +    if ( (pxm < MAX_NUMNODES) && node_found(pxm, pxm) )
>> +        return p2n[pxm].node;
> With this the function parameter's type can't remain to be signed.

Right. I was hoping to defer all type changes to the next patch but this 
(and setup_node() below) will need to change here.

-boris

> Also please don't change coding style here, unless you do so for
> the whole file (in a separate patch). The one change I wouldn't
> mind is switching node_to_pxm() from 8-space to tab indentation.
>
>>   __devinit int setup_node(int pxm)
>>   {
>> -	unsigned node = pxm2node[pxm];
>> -	if (node == 0xff) {
>> -		if (nodes_weight(nodes_found) >= MAX_NUMNODES)
>> -			return -1;
>> -		node = first_unset_node(nodes_found);
>> -		node_set(node, nodes_found);
>> -		pxm2node[pxm] = node;
>> -	}
>> -	return pxm2node[pxm];
>> +    int node;
>> +    unsigned idx;
>> +    static bool_t warned;
>> +
>> +    if ( pxm < MAX_NUMNODES )
>> +    {
>> +        if ( node_found(pxm, pxm) )
>> +            return p2n[pxm].node;

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 1/3] x86/numa: Allow arbitrary value of PXM in PXM<->node mapping
  2015-02-25 13:11     ` Boris Ostrovsky
@ 2015-02-25 13:25       ` Jan Beulich
  0 siblings, 0 replies; 14+ messages in thread
From: Jan Beulich @ 2015-02-25 13:25 UTC (permalink / raw)
  To: Boris Ostrovsky
  Cc: kevin.tian, keir, ian.campbell, Andrew.Cooper3, dario.faggioli,
	tim, xen-devel, stefano.stabellini, yang.z.zhang

>>> On 25.02.15 at 14:11, <boris.ostrovsky@oracle.com> wrote:
> On 02/25/2015 04:34 AM, Jan Beulich wrote:
>>>>> On 24.02.15 at 20:11, <boris.ostrovsky@oracle.com> wrote:
>>> +    { [0 ... MAX_NUMNODES - 1] = {.node = NUMA_NO_NODE} };
>>> +
>>> +static int node_to_pxm(int n);
>> I don't see why you need to reinstate this forward declaration.
> 
> It is used in acpi_numa_memory_affinity_init() which is defined above 
> node_to_pxm().
> 
> I can just move node_to_pxm() definition higher and drop forward 
> declaration.

Looks like I mixed this up with ...

>>>   int pxm_to_node(int pxm)

... this. Keep things as they are then please.

Jan

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 3/3] mm: MEMF_node should handle changes in nodeid_t size
  2015-02-25 10:35   ` Jan Beulich
@ 2015-02-25 13:30     ` Boris Ostrovsky
  2015-02-25 14:16       ` Jan Beulich
  0 siblings, 1 reply; 14+ messages in thread
From: Boris Ostrovsky @ 2015-02-25 13:30 UTC (permalink / raw)
  To: Jan Beulich
  Cc: kevin.tian, keir, ian.campbell, Andrew.Cooper3, dario.faggioli,
	tim, xen-devel, stefano.stabellini, yang.z.zhang

On 02/25/2015 05:35 AM, Jan Beulich wrote:
>>>> On 24.02.15 at 20:11, <boris.ostrovsky@oracle.com> wrote:
>> @@ -121,10 +123,12 @@ struct npfec {
>>   #define _MEMF_exact_node  4
>>   #define  MEMF_exact_node  (1U<<_MEMF_exact_node)
>>   #define _MEMF_node        8
>> -#define  MEMF_node(n)     ((((n)+1)&0xff)<<_MEMF_node)
>> +#define  MEMF_node(n)     ((((n)+1) & MEMF_node_mask) << _MEMF_node)
>>   #define _MEMF_bits        24
>>   #define  MEMF_bits(n)     ((n)<<_MEMF_bits)
>>   
>> +#define MEMF2NODE(memflags) (MASK_EXTR(memflags, MEMF_node_mask) - 1)
> As this is being used just once, I don't really see a need for it to be
> exposed globally. Perhaps do away with the macro, but at the very
> least confine it to page_alloc.c.

I intentionally put it here: we have macro to encode ('put', so to 
speak) nodeID in memflags in this file (by adding one to it) and so I 
felt that we don't need to expose this encoding outside of this file by 
providing a "get" macro.

-boris

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 3/3] mm: MEMF_node should handle changes in nodeid_t size
  2015-02-25 13:30     ` Boris Ostrovsky
@ 2015-02-25 14:16       ` Jan Beulich
  0 siblings, 0 replies; 14+ messages in thread
From: Jan Beulich @ 2015-02-25 14:16 UTC (permalink / raw)
  To: Boris Ostrovsky
  Cc: kevin.tian, keir, ian.campbell, Andrew.Cooper3, dario.faggioli,
	tim, xen-devel, stefano.stabellini, yang.z.zhang

>>> On 25.02.15 at 14:30, <boris.ostrovsky@oracle.com> wrote:
> On 02/25/2015 05:35 AM, Jan Beulich wrote:
>>>>> On 24.02.15 at 20:11, <boris.ostrovsky@oracle.com> wrote:
>>> @@ -121,10 +123,12 @@ struct npfec {
>>>   #define _MEMF_exact_node  4
>>>   #define  MEMF_exact_node  (1U<<_MEMF_exact_node)
>>>   #define _MEMF_node        8
>>> -#define  MEMF_node(n)     ((((n)+1)&0xff)<<_MEMF_node)
>>> +#define  MEMF_node(n)     ((((n)+1) & MEMF_node_mask) << _MEMF_node)
>>>   #define _MEMF_bits        24
>>>   #define  MEMF_bits(n)     ((n)<<_MEMF_bits)
>>>   
>>> +#define MEMF2NODE(memflags) (MASK_EXTR(memflags, MEMF_node_mask) - 1)
>> As this is being used just once, I don't really see a need for it to be
>> exposed globally. Perhaps do away with the macro, but at the very
>> least confine it to page_alloc.c.
> 
> I intentionally put it here: we have macro to encode ('put', so to 
> speak) nodeID in memflags in this file (by adding one to it) and so I 
> felt that we don't need to expose this encoding outside of this file by 
> providing a "get" macro.

Hmm, don't know. The encoding one obviously is needed in various
places, while the decoding one is not supposed to be needed
elsewhere. But if you strongly feel so, I can live with that macro
staying here.

Jan

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2015-02-25 14:16 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-24 19:11 [PATCH v2 0/3] Updates to pxm2node mapping and nodeID sizing Boris Ostrovsky
2015-02-24 19:11 ` [PATCH v2 1/3] x86/numa: Allow arbitrary value of PXM in PXM<->node mapping Boris Ostrovsky
2015-02-24 20:58   ` Boris Ostrovsky
2015-02-25  9:34   ` Jan Beulich
2015-02-25 13:11     ` Boris Ostrovsky
2015-02-25 13:25       ` Jan Beulich
2015-02-25 10:34   ` Jan Beulich
2015-02-24 19:11 ` [PATCH v2 2/3] x86/numa: Adjust datatypes for node and pxm Boris Ostrovsky
2015-02-25  9:44   ` Jan Beulich
2015-02-24 19:11 ` [PATCH v2 3/3] mm: MEMF_node should handle changes in nodeid_t size Boris Ostrovsky
2015-02-25  9:47   ` Jan Beulich
2015-02-25 10:35   ` Jan Beulich
2015-02-25 13:30     ` Boris Ostrovsky
2015-02-25 14:16       ` Jan Beulich

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.