Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932638AbdIFOp7 (ORCPT ); Wed, 6 Sep 2017 10:45:59 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:51524 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932546AbdIFOp6 (ORCPT ); Wed, 6 Sep 2017 10:45:58 -0400 Subject: Re: [PATCH V13 4/4] powerpc/vphn: Fix numa update end-loop bug To: Michael Bringmann , linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org Cc: Michael Ellerman , John Allen References: From: Nathan Fontenot Date: Wed, 6 Sep 2017 09:45:52 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-TM-AS-GCONF: 00 x-cbid: 17090614-0036-0000-0000-0000026500E6 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00007677; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000226; SDB=6.00913113; UDB=6.00458257; IPR=6.00693375; BA=6.00005574; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00017033; XFM=3.00000015; UTC=2017-09-06 14:45:55 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17090614-0037-0000-0000-000041AD040E Message-Id: <0babc60c-8e66-e2f2-c316-c569a2ee1dfb@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-09-06_05:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1707230000 definitions=main-1709060207 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1852 Lines: 53 On 09/01/2017 10:48 AM, Michael Bringmann wrote: > powerpc/vphn: On Power systems with shared configurations of CPUs > and memory, there are some issues with the association of additional > CPUs and memory to nodes when hot-adding resources. This patch > fixes an end-of-updates processing problem observed occasionally > in numa_update_cpu_topology(). > > Signed-off-by: Michael Bringmann > --- > arch/powerpc/mm/numa.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c > index 3a5b334..fccf23f 100644 > --- a/arch/powerpc/mm/numa.c > +++ b/arch/powerpc/mm/numa.c > @@ -1410,6 +1410,13 @@ int numa_update_cpu_topology(bool cpus_locked) > cpu = cpu_last_thread_sibling(cpu); > } > > + /* > + * Prevent processing of 'updates' from overflowing array > + * in cases where last entry filled in a 'next' pointer. > + */ > + if (i) > + updates[i-1].next = NULL; > + This really looks like the bug is in the code above this where we fill in the updates array for each of the sibling cpus. The code there assumes that if the current update entry is not the end that there will be more updates and blindly sets the next pointer. Perhaps correcting the logic in that code to next pointers. Set the ud pointer to NULL before the outer for_each_cpu() loop. Then in the inner for_each_cpu(sibling,...) loop update the ud-> next pointer as the first operation. for_each_cpu(sibling, cpu_sibling_mask(cpu)) { if (ud) ud->next = &updates[i]; ... } Obviously untested, but I think this would prevent setting the next pointer in the last update entry that is filled out erroneously. -Nathan > pr_debug("Topology update for the following CPUs:\n"); > if (cpumask_weight(&updated_cpus)) { > for (ud = &updates[0]; ud; ud = ud->next) { >