From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755029AbcAYCYI (ORCPT ); Sun, 24 Jan 2016 21:24:08 -0500 Received: from mx2.suse.de ([195.135.220.15]:39918 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753892AbcAYCYD (ORCPT ); Sun, 24 Jan 2016 21:24:03 -0500 Date: Sun, 24 Jan 2016 18:23:43 -0800 From: Davidlohr Bueso To: Waiman Long Cc: Ding Tianhong , Peter Zijlstra , Ingo Molnar , "linux-kernel@vger.kernel.org" , Linus Torvalds , "Paul E. McKenney" , Thomas Gleixner , Will Deacon , Jason Low , Tim Chen , Waiman Long Subject: [PATCH] locking/mutex: Allow next waiter lockless wakeup Message-ID: <20160125022343.GA3322@linux-uzut.site> References: <56A0A4ED.3070308@huawei.com> <56A1638A.7050202@hpe.com> <20160122060944.GA28537@linux-uzut.site> <56A230C3.4070801@hpe.com> <20160122164630.GA1633@linux-uzut.site> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline In-Reply-To: <20160122164630.GA1633@linux-uzut.site> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Make use of wake_q and enable the wakeup to occur after releasing the wait_lock. This is similar to what we do with rtmutex top waiter, slightly shortening the critical region and allow other waiters to acquire the wait_lock sooner. In low contention cases it can also help the recently woken waiter to find the wait_lock available (fastpath) when it continues execution. Signed-off-by: Davidlohr Bueso --- kernel/locking/mutex.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c index 0551c21..e364b42 100644 --- a/kernel/locking/mutex.c +++ b/kernel/locking/mutex.c @@ -716,6 +716,7 @@ static inline void __mutex_unlock_common_slowpath(struct mutex *lock, int nested) { unsigned long flags; + WAKE_Q(wake_q); /* * As a performance measurement, release the lock before doing other @@ -743,11 +744,11 @@ __mutex_unlock_common_slowpath(struct mutex *lock, int nested) struct mutex_waiter, list); debug_mutex_wake_waiter(lock, waiter); - - wake_up_process(waiter->task); + wake_q_add(&wake_q, waiter->task); } spin_unlock_mutex(&lock->wait_lock, flags); + wake_up_q(&wake_q); } /* -- 2.1.4