From patchwork Fri Apr 24 06:47:44 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bharata B Rao X-Patchwork-Id: 464136 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 012051400A0 for ; Fri, 24 Apr 2015 17:00:01 +1000 (AEST) Received: from localhost ([::1]:43194 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YlXah-0004Rc-9O for incoming@patchwork.ozlabs.org; Fri, 24 Apr 2015 02:59:59 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54359) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YlXVH-0002R4-Mh for qemu-devel@nongnu.org; Fri, 24 Apr 2015 02:54:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YlXVD-00064I-BH for qemu-devel@nongnu.org; Fri, 24 Apr 2015 02:54:23 -0400 Received: from e23smtp02.au.ibm.com ([202.81.31.144]:60846) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YlXVC-00063d-Ms for qemu-devel@nongnu.org; Fri, 24 Apr 2015 02:54:19 -0400 Received: from /spool/local by e23smtp02.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 24 Apr 2015 16:54:15 +1000 Received: from d23dlp02.au.ibm.com (202.81.31.213) by e23smtp02.au.ibm.com (202.81.31.208) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 24 Apr 2015 16:54:13 +1000 Received: from d23relay06.au.ibm.com (d23relay06.au.ibm.com [9.185.63.219]) by d23dlp02.au.ibm.com (Postfix) with ESMTP id A548D2BB0052; Fri, 24 Apr 2015 16:54:12 +1000 (EST) Received: from d23av02.au.ibm.com (d23av02.au.ibm.com [9.190.235.138]) by d23relay06.au.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id t3O6s4ls41549982; Fri, 24 Apr 2015 16:54:12 +1000 Received: from d23av02.au.ibm.com (localhost [127.0.0.1]) by d23av02.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id t3O6rd5j000448; Fri, 24 Apr 2015 16:53:39 +1000 Received: from bharata.in.ibm.com ([9.79.216.71]) by d23av02.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id t3O6m5R0023890; Fri, 24 Apr 2015 16:53:25 +1000 From: Bharata B Rao To: qemu-devel@nongnu.org Date: Fri, 24 Apr 2015 12:17:44 +0530 Message-Id: <1429858066-12088-23-git-send-email-bharata@linux.vnet.ibm.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1429858066-12088-1-git-send-email-bharata@linux.vnet.ibm.com> References: <1429858066-12088-1-git-send-email-bharata@linux.vnet.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15042406-0005-0000-0000-000001B0ED62 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 202.81.31.144 Cc: aik@ozlabs.ru, Bharata B Rao , mdroth@linux.vnet.ibm.com, agraf@suse.de, Paolo Bonzini , qemu-ppc@nongnu.org, tyreld@linux.vnet.ibm.com, nfont@linux.vnet.ibm.com, imammedo@redhat.com, afaerber@suse.de, david@gibson.dropbear.id.au Subject: [Qemu-devel] [RFC PATCH v3 22/24] numa: API to lookup NUMA node by address X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Keep track of start and end address of each NUMA node in numa_info structure so that lookup of node by address becomes easier. Add an API get_numa_node() to lookup a node by address. This is needed by PowerPC memory hotplug implementation. Signed-off-by: Bharata B Rao Cc: Paolo Bonzini Reviewed-by: David Gibson --- include/sysemu/numa.h | 3 +++ numa.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h index 5633b85..7274d05 100644 --- a/include/sysemu/numa.h +++ b/include/sysemu/numa.h @@ -14,11 +14,14 @@ typedef struct node_info { DECLARE_BITMAP(node_cpu, MAX_CPUMASK_BITS); struct HostMemoryBackend *node_memdev; bool present; + ram_addr_t mem_start; + ram_addr_t mem_end; } NodeInfo; extern NodeInfo numa_info[MAX_NODES]; void parse_numa_opts(void); void numa_post_machine_init(void); void query_numa_node_mem(uint64_t node_mem[]); extern QemuOptsList qemu_numa_opts; +uint32_t get_numa_node(ram_addr_t addr, Error **errp); #endif diff --git a/numa.c b/numa.c index 5634bf0..85ff00f 100644 --- a/numa.c +++ b/numa.c @@ -53,6 +53,51 @@ static int max_numa_nodeid; /* Highest specified NUMA node ID, plus one. int nb_numa_nodes; NodeInfo numa_info[MAX_NODES]; +/* + * Given an address, return the index of the NUMA node to which the + * address belongs to. + */ +uint32_t get_numa_node(ram_addr_t addr, Error **errp) +{ + uint32_t i; + MemoryDeviceInfoList *info_list = NULL; + MemoryDeviceInfoList **prev = &info_list; + MemoryDeviceInfoList *info; + + for (i = 0; i < nb_numa_nodes; i++) { + if (addr >= numa_info[i].mem_start && addr < numa_info[i].mem_end) { + return i; + } + } + + /* + * If this @addr falls under cold or hotplugged memory regions, + * check there too. + */ + qmp_pc_dimm_device_list(qdev_get_machine(), &prev); + for (info = info_list; info; info = info->next) { + MemoryDeviceInfo *value = info->value; + + if (value) { + switch (value->kind) { + case MEMORY_DEVICE_INFO_KIND_DIMM: + if (addr >= value->dimm->addr && + addr < (value->dimm->addr + value->dimm->size)) { + qapi_free_MemoryDeviceInfoList(info_list); + return value->dimm->node; + } + break; + default: + break; + } + } + } + qapi_free_MemoryDeviceInfoList(info_list); + 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; @@ -119,6 +164,7 @@ static void numa_node_parse(NumaNodeOptions *node, QemuOpts *opts, Error **errp) numa_info[nodenr].node_mem = object_property_get_int(o, "size", NULL); numa_info[nodenr].node_memdev = MEMORY_BACKEND(o); } + numa_info[nodenr].present = true; max_numa_nodeid = MAX(max_numa_nodeid, nodenr + 1); } @@ -165,6 +211,17 @@ error: return -1; } +static void numa_set_mem_address(int nodenr) +{ + if (nodenr) { + numa_info[nodenr].mem_start = numa_info[nodenr-1].mem_end; + } else { + numa_info[nodenr].mem_start = 0; + } + numa_info[nodenr].mem_end = numa_info[nodenr].mem_start + + numa_info[nodenr].node_mem; +} + void parse_numa_opts(void) { int i; @@ -229,6 +286,10 @@ void parse_numa_opts(void) } for (i = 0; i < nb_numa_nodes; i++) { + numa_set_mem_address(i); + } + + for (i = 0; i < nb_numa_nodes; i++) { if (!bitmap_empty(numa_info[i].node_cpu, MAX_CPUMASK_BITS)) { break; }