Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932758AbbELMaU (ORCPT ); Tue, 12 May 2015 08:30:20 -0400 Received: from cn.fujitsu.com ([59.151.112.132]:27584 "EHLO heian.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S932531AbbELM3M (ORCPT ); Tue, 12 May 2015 08:29:12 -0400 X-IronPort-AV: E=Sophos;i="5.04,848,1406563200"; d="scan'208";a="92042599" From: Lai Jiangshan To: CC: Lai Jiangshan , Tejun Heo Subject: [PATCH 3/7 V2] workqueue: introduce get_pwq_unlocked() Date: Tue, 12 May 2015 20:32:31 +0800 Message-ID: <1431433955-3173-4-git-send-email-laijs@cn.fujitsu.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1431433955-3173-1-git-send-email-laijs@cn.fujitsu.com> References: <1431433955-3173-1-git-send-email-laijs@cn.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.167.226.103] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2533 Lines: 83 attrs management code may reuse existed pwq and it has open code to do "lock();get_pwq();unlock()", we move this open code into get_pwq_unlocked(). get_pwq_unlocked() will also be used in later patches to allow apply_wqattrs_prepare() to resue the original default or per-node pwq. Signed-off-by: Lai Jiangshan --- kernel/workqueue.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/kernel/workqueue.c b/kernel/workqueue.c index c8b9de0..0fa352d 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -1067,6 +1067,24 @@ static void put_pwq(struct pool_workqueue *pwq) } /** + * get_pwq_unlocked - get_pwq() with surrounding pool lock/unlock + * @pwq: pool_workqueue to get (should not %NULL) + * + * get_pwq() with locking. The caller should have at least an owned + * reference on @pwq to match the guarantees required by get_pwq(). + * + * Return itsefl for allowing chained expressions. + */ +static struct pool_workqueue *get_pwq_unlocked(struct pool_workqueue *pwq) +{ + spin_lock_irq(&pwq->pool->lock); + get_pwq(pwq); + spin_unlock_irq(&pwq->pool->lock); + + return pwq; +} + +/** * put_pwq_unlocked - put_pwq() with surrounding pool lock/unlock * @pwq: pool_workqueue to put (can be %NULL) * @@ -3733,7 +3751,8 @@ static void wq_update_unbound_numa(struct workqueue_struct *wq, int cpu, if (cpumask_equal(cpumask, pwq->pool->attrs->cpumask)) return; } else { - goto use_dfl_pwq; + pwq = get_pwq_unlocked(wq->dfl_pwq); + goto install; } /* create a new pwq */ @@ -3741,21 +3760,13 @@ static void wq_update_unbound_numa(struct workqueue_struct *wq, int cpu, if (!pwq) { pr_warn("workqueue: allocation failed while updating NUMA affinity of \"%s\"\n", wq->name); - goto use_dfl_pwq; + pwq = get_pwq_unlocked(wq->dfl_pwq); } +install: /* Install the new pwq. */ mutex_lock(&wq->mutex); old_pwq = numa_pwq_tbl_install(wq, node, pwq); - goto out_unlock; - -use_dfl_pwq: - mutex_lock(&wq->mutex); - spin_lock_irq(&wq->dfl_pwq->pool->lock); - get_pwq(wq->dfl_pwq); - spin_unlock_irq(&wq->dfl_pwq->pool->lock); - old_pwq = numa_pwq_tbl_install(wq, node, wq->dfl_pwq); -out_unlock: mutex_unlock(&wq->mutex); put_pwq_unlocked(old_pwq); } -- 2.1.0 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/