From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53151) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YYg5i-00084d-Dg for qemu-devel@nongnu.org; Thu, 19 Mar 2015 15:26:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YYg5e-0005dL-Fm for qemu-devel@nongnu.org; Thu, 19 Mar 2015 15:26:50 -0400 Received: from mx1.redhat.com ([209.132.183.28]:51658) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YYg5e-0005dE-87 for qemu-devel@nongnu.org; Thu, 19 Mar 2015 15:26:46 -0400 From: Eduardo Habkost Date: Thu, 19 Mar 2015 16:26:11 -0300 Message-Id: <1426793174-19012-4-git-send-email-ehabkost@redhat.com> In-Reply-To: <1426793174-19012-1-git-send-email-ehabkost@redhat.com> References: <1426793174-19012-1-git-send-email-ehabkost@redhat.com> Subject: [Qemu-devel] [PULL 3/6] numa: Reject configuration if CPU appears on multiple nodes List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Maydell Cc: qemu-devel@nongnu.org, Paolo Bonzini , Igor Mammedov , =?UTF-8?q?Andreas=20F=C3=A4rber?= , "Michael S. Tsirkin" Each CPU can appear in only one NUMA node on the NUMA config. Reject configuration if a CPU appears in multiple nodes. Reviewed-by: Igor Mammedov Signed-off-by: Eduardo Habkost --- numa.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/numa.c b/numa.c index 6b4ab0e..518aedd 100644 --- a/numa.c +++ b/numa.c @@ -167,6 +167,41 @@ error: return -1; } +static char *enumerate_cpus(unsigned long *cpus, int max_cpus) +{ + int cpu; + bool first = true; + GString *s = g_string_new(NULL); + + for (cpu = find_first_bit(cpus, max_cpus); + cpu < max_cpus; + cpu = find_next_bit(cpus, max_cpus, cpu + 1)) { + g_string_append_printf(s, "%s%d", first ? "" : " ", cpu); + first = false; + } + return g_string_free(s, FALSE); +} + +static void validate_numa_cpus(void) +{ + int i; + DECLARE_BITMAP(seen_cpus, MAX_CPUMASK_BITS); + + bitmap_zero(seen_cpus, MAX_CPUMASK_BITS); + for (i = 0; i < nb_numa_nodes; i++) { + if (bitmap_intersects(seen_cpus, numa_info[i].node_cpu, + MAX_CPUMASK_BITS)) { + bitmap_and(seen_cpus, seen_cpus, + numa_info[i].node_cpu, MAX_CPUMASK_BITS); + error_report("CPU(s) present in multiple NUMA nodes: %s", + enumerate_cpus(seen_cpus, max_cpus));; + exit(EXIT_FAILURE); + } + bitmap_or(seen_cpus, seen_cpus, + numa_info[i].node_cpu, MAX_CPUMASK_BITS); + } +} + void parse_numa_opts(void) { int i; @@ -244,6 +279,8 @@ void parse_numa_opts(void) set_bit(i, numa_info[i % nb_numa_nodes].node_cpu); } } + + validate_numa_cpus(); } } -- 2.1.0