From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753062AbcDBLKz (ORCPT ); Sat, 2 Apr 2016 07:10:55 -0400 Received: from www.linutronix.de ([62.245.132.108]:57054 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751353AbcDBLKx (ORCPT ); Sat, 2 Apr 2016 07:10:53 -0400 Message-Id: <20160402110035.315879045@linutronix.de> User-Agent: quilt/0.63-1 Date: Sat, 02 Apr 2016 11:09:15 -0000 From: Thomas Gleixner To: LKML Cc: Sebastian Andrzej Siewior , Darren Hart , Peter Zijlstra , Ingo Molnar , Michael Kerrisk , Davidlohr Bueso , Chris Mason , "Carlos O'Donell" , Torvald Riegel , Eric Dumazet Subject: [RFC patch 1/7] futex: Provide helpers for hash bucket add/remove References: <20160402095108.894519835@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Disposition: inline; filename=futex--Provide-helpers-for-hash-bucket-add-remove.patch X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Provide helpers for adding/removing futex_q to/from a hash bucket so we don't have more open coded places when adding support for attached futexes. Signed-off-by: Thomas Gleixner --- kernel/futex.c | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) Index: b/kernel/futex.c =================================================================== --- a/kernel/futex.c +++ b/kernel/futex.c @@ -373,6 +373,35 @@ static inline int hb_waiters_pending(str #endif } +/** + * hb_insert_q - Insert futex_q into a hash bucket + * @q: Pointer to the futex_q object + * @hb: Pointer to the hash bucket + * @prio: Priority ordering for insertion + * + * Inserts @q into the hash buckets @hb plist. Must be called with @hb->lock + * held. + */ +static inline void +hb_insert_q(struct futex_q *q, struct futex_hash_bucket *hb, int prio) +{ + plist_node_init(&q->list, prio); + plist_add(&q->list, &hb->chain); +} + +/** + * hb_remove_q - Remove futex_q from a hash bucket + * @q: Pointer to the futex_q object + * @hb: Pointer to the hash bucket + * + * Removes @q from the hash buckets @hb plist. Must be called with @hb->lock + * held. + */ +static inline void hb_remove_q(struct futex_q *q, struct futex_hash_bucket *hb) +{ + plist_del(&q->list, &hb->chain); +} + /* * We hash on the keys returned from get_futex_key (see below). */ @@ -1221,7 +1250,7 @@ static void __unqueue_futex(struct futex return; hb = container_of(q->lock_ptr, struct futex_hash_bucket, lock); - plist_del(&q->list, &hb->chain); + hb_remove_q(q, hb); hb_waiters_dec(hb); } @@ -1523,7 +1552,7 @@ void requeue_futex(struct futex_q *q, st * requeue. */ if (likely(&hb1->chain != &hb2->chain)) { - plist_del(&q->list, &hb1->chain); + hb_remove_q(q, hb1); hb_waiters_dec(hb1); plist_add(&q->list, &hb2->chain); hb_waiters_inc(hb2); @@ -1985,9 +2014,7 @@ static inline void queue_me(struct futex * the others are woken last, in FIFO order. */ prio = min(current->normal_prio, MAX_RT_PRIO); - - plist_node_init(&q->list, prio); - plist_add(&q->list, &hb->chain); + hb_insert_q(q, hb, prio); q->task = current; spin_unlock(&hb->lock); } @@ -2697,7 +2724,7 @@ int handle_early_requeue_pi_wakeup(struc * We were woken prior to requeue by a timeout or a signal. * Unqueue the futex_q and determine which it was. */ - plist_del(&q->list, &hb->chain); + hb_remove_q(q, hb); hb_waiters_dec(hb); /* Handle spurious wakeups gracefully */