summaryrefslogtreecommitdiff
path: root/numa.c
diff options
context:
space:
mode:
authorBharata B Rao <bharata@linux.vnet.ibm.com>2015-06-29 13:50:27 +0530
committerEduardo Habkost <ehabkost@redhat.com>2015-07-03 17:47:58 -0300
commite75e2a14d5c13ad38dcf72b69922dee2dafbb0d0 (patch)
tree5aaa6669c9215fef99588d77490cdc211c044d63 /numa.c
parentabafabd8c982e875d60a10d37f0b91cff1003c55 (diff)
downloadqemu-e75e2a14d5c13ad38dcf72b69922dee2dafbb0d0.tar.gz
qemu-e75e2a14d5c13ad38dcf72b69922dee2dafbb0d0.tar.bz2
qemu-e75e2a14d5c13ad38dcf72b69922dee2dafbb0d0.zip
numa: API to lookup NUMA node by address
Introduce an API numa_get_node(ram_addr_t addr, Error **errp) that returns the NUMA node to which the given address belongs to. This API works uniformly for both boot time as well as hotplugged memory. This API is needed by sPAPR PowerPC to support ibm,dynamic-reconfiguration-memory device tree node which is needed for memory hotplug. Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Tested-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Diffstat (limited to 'numa.c')
-rw-r--r--numa.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/numa.c b/numa.c
index a73f6483ea..3c8005913f 100644
--- a/numa.c
+++ b/numa.c
@@ -97,6 +97,47 @@ static void numa_set_mem_ranges(void)
}
}
+/*
+ * Check if @addr falls under NUMA @node.
+ */
+static bool numa_addr_belongs_to_node(ram_addr_t addr, uint32_t node)
+{
+ struct numa_addr_range *range;
+
+ QLIST_FOREACH(range, &numa_info[node].addr, entry) {
+ if (addr >= range->mem_start && addr <= range->mem_end) {
+ return true;
+ }
+ }
+ return false;
+}
+
+/*
+ * Given an address, return the index of the NUMA node to which the
+ * address belongs to.
+ */
+uint32_t numa_get_node(ram_addr_t addr, Error **errp)
+{
+ uint32_t i;
+
+ /* For non NUMA configurations, check if the addr falls under node 0 */
+ if (!nb_numa_nodes) {
+ if (numa_addr_belongs_to_node(addr, 0)) {
+ return 0;
+ }
+ }
+
+ for (i = 0; i < nb_numa_nodes; i++) {
+ if (numa_addr_belongs_to_node(addr, i)) {
+ return i;
+ }
+ }
+
+ error_setg(errp, "Address 0x" RAM_ADDR_FMT " doesn't belong to any "
+ "NUMA node", addr);
+ return -1;
+}
+
static void numa_node_parse(NumaNodeOptions *node, QemuOpts *opts, Error **errp)
{
uint16_t nodenr;