From patchwork Mon Mar 12 04:43:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pingfan Liu X-Patchwork-Id: 884308 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 40058l3dWYz9sR5 for ; Mon, 12 Mar 2018 15:48:23 +1100 (AEDT) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="edEA2APd"; dkim-atps=neutral Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 40058l1v9hzDqmr for ; Mon, 12 Mar 2018 15:48:23 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="edEA2APd"; dkim-atps=neutral X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:400e:c05::242; helo=mail-pg0-x242.google.com; envelope-from=kernelfans@gmail.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="edEA2APd"; dkim-atps=neutral Received: from mail-pg0-x242.google.com (mail-pg0-x242.google.com [IPv6:2607:f8b0:400e:c05::242]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4005331XVJzDrDJ for ; Mon, 12 Mar 2018 15:43:26 +1100 (AEDT) Received: by mail-pg0-x242.google.com with SMTP id m15so1061119pgc.1 for ; Sun, 11 Mar 2018 21:43:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=IzNmrHj7nlLbOSjdCJYX1YbObXRG7B5cqzQbjmJp4ug=; b=edEA2APdNEotZQNUn0nvIvedxoyjxjzcLZFxvDJ2absn1eZIyCeqQZIRjOQnzwK2eK Z6A0lUZq7mTB8jsZJ/NMBRplujXXSYpV7u3HYKXcbCi2+5leASEB4OpG94IbBgQBKj8Z owO2vCtkIl0z8hphyGe+1ATmRczUBd0G/DAtsw745PkojCSNCHWtxIZGAWyYEXvO2wQq aRojRR5Hw/bA9L7QLbeD0MDBTd9o9jNZE4Thyi7m8BBkZVPJ4i04PiVT8cukPBe0Y6sK gXUJGqHKH1L3ml9JUaHPPM3HL5O6ElvkklgLecfbzoKkC65WgAWsy9F1OOl37/hKblX1 k+eA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=IzNmrHj7nlLbOSjdCJYX1YbObXRG7B5cqzQbjmJp4ug=; b=kB5eOiK9E15saJHBmRujHBs0yqSIleFGSLexq38nloKYgbbiGGan5zQCbGRDnpUEAP 9KBHnylEcW499tqQBg4n8v2m0KIqNAQgnjacrz6QEQj3TrsMqWChnN73lYInEysy2nrJ h25kZRZ+VVu8hH1BINS1h9hf7BtffENPn1kKMMt1BeMIS8J9zOi+aJrO+dXEEh941r51 GZpZmUcE6Y/g1heEQKxWsfIZG0ngHAhVeDfzFE02DLvzASZJw1nuTLbyK1+jLGPpNRGC V3R8NZm3Pmfb9mFc5dAk42JgS9Xd9yXbQXHI9t1fqGyLf1rurtqYrgMuFpUHy5HKT92p 9jIw== X-Gm-Message-State: AElRT7Hpp42I55cYFA/q2yC+JZoF5Rdl7IJI51vUUH8d3bVzWoKCkwCc lxYCJg/zDPcV3z2X+lDYk8Dd X-Google-Smtp-Source: AG47ELu9tHSZJBgVfynGNIyuUezaRsGR6SsX92UXO3aliES34GKDjC/Dr2unavs1b13sdLSVeWRNGA== X-Received: by 10.98.135.76 with SMTP id i73mr6699651pfe.140.1520829804761; Sun, 11 Mar 2018 21:43:24 -0700 (PDT) Received: from mylaptop.nay.redhat.com ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id 2sm14564731pfo.70.2018.03.11.21.43.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Mar 2018 21:43:23 -0700 (PDT) From: Pingfan Liu To: linuxppc-dev@lists.ozlabs.org Subject: [PATCHv4 1/3] powerpc, cpu: partially unbind the mapping between cpu logical id and its seq in dt Date: Mon, 12 Mar 2018 12:43:08 +0800 Message-Id: <1520829790-14029-2-git-send-email-kernelfans@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1520829790-14029-1-git-send-email-kernelfans@gmail.com> References: <1520829790-14029-1-git-send-email-kernelfans@gmail.com> X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: cascardo@canonical.com, gpiccoli@linux.vnet.ibm.com, mahesh@linux.vnet.ibm.com, kexec@lists.infradead.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" For kexec -p, the boot cpu can be not the cpu0, this causes the problem to alloc paca[]. In theory, there is no requirement to assign cpu's logical id as its present seq by device tree. But we have something like cpu_first_thread_sibling(), which makes assumption on the mapping inside a core. Hence partially changing the mapping, i.e. unbind the mapping of core while keep the mapping inside a core. After this patch, boot-cpu will always be mapped into the range [0,threads_per_core). Signed-off-by: Pingfan Liu --- arch/powerpc/include/asm/smp.h | 1 + arch/powerpc/kernel/prom.c | 25 ++++++++++++++----------- arch/powerpc/kernel/setup-common.c | 21 +++++++++++++++++++++ 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h index fac963e..1299100 100644 --- a/arch/powerpc/include/asm/smp.h +++ b/arch/powerpc/include/asm/smp.h @@ -30,6 +30,7 @@ #include extern int boot_cpuid; +extern int boot_cpuhwid; extern int spinning_secondaries; extern void cpu_die(void); diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index da67606..d0ebb25 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c @@ -315,8 +315,7 @@ static int __init early_init_dt_scan_cpus(unsigned long node, const __be32 *intserv; int i, nthreads; int len; - int found = -1; - int found_thread = 0; + bool found = false; /* We are scanning "cpu" nodes only */ if (type == NULL || strcmp(type, "cpu") != 0) @@ -341,8 +340,11 @@ static int __init early_init_dt_scan_cpus(unsigned long node, if (fdt_version(initial_boot_params) >= 2) { if (be32_to_cpu(intserv[i]) == fdt_boot_cpuid_phys(initial_boot_params)) { - found = boot_cpu_count; - found_thread = i; + /* always map the boot-cpu logical id into the + * the range of [0, thread_per_core) + */ + boot_cpuid = i; + found = true; } } else { /* @@ -351,8 +353,10 @@ static int __init early_init_dt_scan_cpus(unsigned long node, * off secondary threads. */ if (of_get_flat_dt_prop(node, - "linux,boot-cpu", NULL) != NULL) - found = boot_cpu_count; + "linux,boot-cpu", NULL) != NULL) { + boot_cpuid = i; + found = true; + } } #ifdef CONFIG_SMP /* logical cpu id is always 0 on UP kernels */ @@ -361,13 +365,12 @@ static int __init early_init_dt_scan_cpus(unsigned long node, } /* Not the boot CPU */ - if (found < 0) + if (!found) return 0; - DBG("boot cpu: logical %d physical %d\n", found, - be32_to_cpu(intserv[found_thread])); - boot_cpuid = found; - set_hard_smp_processor_id(found, be32_to_cpu(intserv[found_thread])); + boot_cpuhwid = be32_to_cpu(intserv[boot_cpuid]); + DBG("boot cpu: logical %d physical %d\n", boot_cpuid, boot_cpuhwid); + set_hard_smp_processor_id(boot_cpuid, boot_cpuhwid); /* * PAPR defines "logical" PVR values for cpus that diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index 66f7cc6..1a67344 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c @@ -86,6 +86,7 @@ struct machdep_calls *machine_id; EXPORT_SYMBOL(machine_id); int boot_cpuid = -1; +int boot_cpuhwid = -1; EXPORT_SYMBOL_GPL(boot_cpuid); /* @@ -459,11 +460,17 @@ static void __init cpu_init_thread_core_maps(int tpc) void __init smp_setup_cpu_maps(void) { struct device_node *dn; + struct device_node *boot_dn = NULL; + bool handling_bootdn = true; int cpu = 0; int nthreads = 1; DBG("smp_setup_cpu_maps()\n"); +again: + /* E.g. kexec will not boot from the 1st core. So firstly loop to find out + * the dn of boot-cpu, and map them onto [0, nthreads) + */ for_each_node_by_type(dn, "cpu") { const __be32 *intserv; __be32 cpu_be; @@ -488,6 +495,16 @@ void __init smp_setup_cpu_maps(void) nthreads = len / sizeof(int); + if (handling_bootdn) { + if (boot_cpuid < nthreads && + be32_to_cpu(intserv[boot_cpuid]) == boot_cpuhwid) { + boot_dn = dn; + } + if (boot_dn == NULL) + continue; + } else if (dn == boot_dn) + continue; + for (j = 0; j < nthreads && cpu < nr_cpu_ids; j++) { bool avail; @@ -509,6 +526,10 @@ void __init smp_setup_cpu_maps(void) of_node_put(dn); break; } + if (handling_bootdn) { + handling_bootdn = false; + goto again; + } } /* If no SMT supported, nthreads is forced to 1 */