From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1164811AbdEYPIN (ORCPT ); Thu, 25 May 2017 11:08:13 -0400 Received: from mail-yb0-f194.google.com ([209.85.213.194]:33144 "EHLO mail-yb0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S966211AbdEYPH4 (ORCPT ); Thu, 25 May 2017 11:07:56 -0400 Date: Thu, 25 May 2017 11:07:52 -0400 From: Tejun Heo To: Michael Bringmann Cc: Lai Jiangshan , linux-kernel@vger.kernel.org, Nathan Fontenot Subject: Re: [PATCH] workqueue: Ensure that cpumask set for pools created after boot Message-ID: <20170525150752.GF23493@htj.duckdns.org> 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> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20170525150353.GE23493@htj.duckdns.org> User-Agent: Mutt/1.8.2 (2017-04-18) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 */