From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S942377AbdEYPa7 (ORCPT ); Thu, 25 May 2017 11:30:59 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:42309 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S934547AbdEYPa4 (ORCPT ); Thu, 25 May 2017 11:30:56 -0400 Subject: Re: [PATCH] workqueue: Ensure that cpumask set for pools created after boot To: Tejun Heo References: <20170510173340.GF32165@htj.duckdns.org> <20170516155527.GB6389@htj.duckdns.org> <20170523194952.GF13222@htj.duckdns.org> <20170523201029.GH13222@htj.duckdns.org> <20170525150353.GE23493@htj.duckdns.org> <20170525150752.GF23493@htj.duckdns.org> Cc: Lai Jiangshan , linux-kernel@vger.kernel.org, Nathan Fontenot From: Michael Bringmann Organization: IBM Linux Technology Center Date: Thu, 25 May 2017 10:30:46 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 In-Reply-To: <20170525150752.GF23493@htj.duckdns.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-TM-AS-GCONF: 00 x-cbid: 17052515-8235-0000-0000-00000B9271A8 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00007116; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000212; SDB=6.00865491; UDB=6.00429756; IPR=6.00645267; BA=6.00005374; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00015581; XFM=3.00000015; UTC=2017-05-25 15:30:48 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17052515-8236-0000-0000-00003BF87A8C Message-Id: X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-05-25_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-1705250293 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I will try that patch shortly. I also updated my patch to be conditional on whether the pool's cpumask attribute was empty. You should have received V2 of that patch by now. As to your remark about 'proper subset of possible cpumask for the node', would that not be the case when we are removing VPs? On 05/25/2017 10:07 AM, Tejun Heo wrote: > On Thu, May 25, 2017 at 11:03:53AM -0400, Tejun Heo wrote: >> wq_update_unbound_numa() should have never called into >> alloc_unbound_pwq() w/ empty node cpu mask. It should have fallen >> back to the dfl_pwq. It looks like I just messed up the logic there >> from the initial commit of the feature. Can you please see whether >> the following fixes the problem? > > Can you please try the following instead. On the second thought, I > don't think the current logic is wrong. If this fixes the issue, > somehow your setup is having a situation where online cpumask for a > node is a proper superset of possible cpumask for the node. > > Thanks. > > diff --git a/kernel/workqueue.c b/kernel/workqueue.c > index c74bf39ef764..4da5ff649ff8 100644 > --- a/kernel/workqueue.c > +++ b/kernel/workqueue.c > @@ -3559,13 +3559,13 @@ static struct pool_workqueue *alloc_unbound_pwq(struct workqueue_struct *wq, > * stable. > * > * Return: %true if the resulting @cpumask is different from @attrs->cpumask, > - * %false if equal. > + * %false if equal. On %false return, the content of @cpumask is undefined. > */ > 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; > + return false; > > /* does @node have any online CPUs @attrs wants? */ > cpumask_and(cpumask, cpumask_of_node(node), attrs->cpumask); > @@ -3573,15 +3573,13 @@ static bool wq_calc_node_cpumask(const struct workqueue_attrs *attrs, int node, > cpumask_clear_cpu(cpu_going_down, cpumask); > > if (cpumask_empty(cpumask)) > - goto use_dfl; > + return false; > > /* yeap, return possible CPUs in @node that @attrs wants */ > 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; > + return !cpumask_empty(cpumask) && > + !cpumask_equal(cpumask, attrs->cpumask); > } > > /* install @pwq into @wq's numa_pwq_tbl[] for @node and return the old pwq */ > > -- 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