From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753976AbdFMUEn (ORCPT ); Tue, 13 Jun 2017 16:04:43 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:47633 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752615AbdFMUEk (ORCPT ); Tue, 13 Jun 2017 16:04:40 -0400 Subject: Re: [PATCH] workqueue: Ensure that cpumask set for pools created after boot To: Tejun Heo Cc: Lai Jiangshan , linux-kernel@vger.kernel.org, Nathan Fontenot References: <20170523201029.GH13222@htj.duckdns.org> <20170525150353.GE23493@htj.duckdns.org> <20170525150752.GF23493@htj.duckdns.org> <20170606180913.GA32062@htj.duckdns.org> <736f7f6e-8d47-eaea-acc6-8ed75014a287@linux.vnet.ibm.com> <20170612161433.GB19206@htj.duckdns.org> <69c4bbad-5d40-d054-0004-38ac81377b0b@linux.vnet.ibm.com> <20170612173225.GD19206@htj.duckdns.org> From: Michael Bringmann Organization: IBM Linux Technology Center Date: Tue, 13 Jun 2017 15:04:30 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.0 MIME-Version: 1.0 In-Reply-To: <20170612173225.GD19206@htj.duckdns.org> Content-Type: multipart/mixed; boundary="------------01567241F3C5E302E68A0E4D" Content-Language: en-US X-TM-AS-GCONF: 00 x-cbid: 17061320-0036-0000-0000-000002299F64 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00007226; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000212; SDB=6.00874318; UDB=6.00435198; IPR=6.00654406; BA=6.00005420; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00015810; XFM=3.00000015; UTC=2017-06-13 20:04:38 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17061320-0037-0000-0000-000040B672AA Message-Id: <0b95fc96-a481-4439-de65-ffdffa207f47@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-06-13_09:,, 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-1703280000 definitions=main-1706130340 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is a multi-part message in MIME format. --------------01567241F3C5E302E68A0E4D Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Hello: On 06/12/2017 12:32 PM, Tejun Heo wrote: > Hello, > > On Mon, Jun 12, 2017 at 12:10:49PM -0500, Michael Bringmann wrote: >>> The reason why we're ending up with empty masks is because >>> wq_calc_node_cpumask() is assuming that the possible node cpumask is >>> always a superset of online (as it should). We can trigger a fat >>> warning there if that isn't so and just return false from that >>> function. >> >> What would that look like? I should be able to test it on top of the >> other changes / corrections. > > So, the function looks like the following now. > > static bool wq_calc_node_cpumask(const struct workqueue_attrs *attrs, int node, > int cpu_going_down, cpumask_t *cpumask) > { > if (!wq_numa_enabled || attrs->no_numa) > goto use_dfl; > > /* does @node have any online CPUs @attrs wants? */ > A: cpumask_and(cpumask, cpumask_of_node(node), attrs->cpumask); > if (cpu_going_down >= 0) > cpumask_clear_cpu(cpu_going_down, cpumask); > > B: if (cpumask_empty(cpumask)) > goto use_dfl; > > /* yeap, return possible CPUs in @node that @attrs wants */ > C: cpumask_and(cpumask, attrs->cpumask, wq_numa_possible_cpumask[node]); > return !cpumask_equal(cpumask, attrs->cpumask); > > use_dfl: > cpumask_copy(cpumask, attrs->cpumask); > return false; > } > > A is calculating the target cpumask to use using the online map. B > falls back to dfl mask if the intersection is empty. C calculates the > eventual mask to use from the intersection of possible mask and what's > requested. The assumption is that because possible is a superset of > online, C's result can't be smaller than A. > > So, what we can do is if to calculate the possible intersection, > compare it against the online intersection, and if the latter is > bigger, trigger a big fat warning and return false there. So the revisions to the function would look like, correct? diff --git a/kernel/workqueue.c b/kernel/workqueue.c index c74bf39..5d7674e 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -3564,19 +3564,28 @@ static struct pool_workqueue *alloc_unbound_pwq(struct workqueue_struct *wq, static bool wq_calc_node_cpumask(const struct workqueue_attrs *attrs, int node, int cpu_going_down, cpumask_t *cpumask) { + cpumask_t onl_targ_cm; + if (!wq_numa_enabled || attrs->no_numa) goto use_dfl; /* does @node have any online CPUs @attrs wants? */ - cpumask_and(cpumask, cpumask_of_node(node), attrs->cpumask); + cpumask_and(&onl_targ_cm, cpumask_of_node(node), attrs->cpumask); if (cpu_going_down >= 0) - cpumask_clear_cpu(cpu_going_down, cpumask); + cpumask_clear_cpu(cpu_going_down, &onl_targ_cm); - if (cpumask_empty(cpumask)) + if (cpumask_empty(&onl_targ_cm)) goto use_dfl; /* yeap, return possible CPUs in @node that @attrs wants */ cpumask_and(cpumask, attrs->cpumask, wq_numa_possible_cpumask[node]); + + if (cpumask_weight(&onl_targ_cm) > cpumask_weight(cpumask)) { + printk(KERN_INFO "WARNING: WQ cpumask: onl intersect > " + "possible intersect\n"); + return false; + } + return !cpumask_equal(cpumask, attrs->cpumask); use_dfl: > >>> I have no idea about the specifics of ppc but at least the code base >>> we have currently expect all possible cpus and nodes and their >>> mappings to be established on boot. >> >> Hopefully, the new properties will fix the holes in the current implementation >> with regard to hot-add. > > Yeah, that's the only proper fix here. I incorporated other changes to try to fill in the possible map more accurately, and with only the above modification to workqueue.c, I ran a hot-add CPU test to add 8 VPs to a powerpc Shared CPU configuration. It produced a lot of the warning messages -- a lot more than I was expecting. But it did not crash. I have attached a compressed copy of the log file, here. > > Thanks. > Thanks. -- Michael W. Bringmann Linux Technology Center IBM Corporation Tie-Line 363-5196 External: (512) 286-5196 Cell: (512) 466-0650 mwb@linux.vnet.ibm.com --------------01567241F3C5E302E68A0E4D Content-Type: application/x-xz; name="boot-run.log.xz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="boot-run.log.xz" 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 jJ/9gQABpW/WwAYAn2MsVbHEZ/sCAAAAAARZWg== --------------01567241F3C5E302E68A0E4D--