Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751629AbbHAW3P (ORCPT ); Sat, 1 Aug 2015 18:29:15 -0400 Received: from bombadil.infradead.org ([198.137.202.9]:54248 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751463AbbHAW3O (ORCPT ); Sat, 1 Aug 2015 18:29:14 -0400 Date: Sun, 2 Aug 2015 00:29:03 +0200 From: Peter Zijlstra To: Waiman Long Cc: Ingo Molnar , Thomas Gleixner , "H. Peter Anvin" , x86@kernel.org, linux-kernel@vger.kernel.org, Scott J Norton , Douglas Hatch , Davidlohr Bueso Subject: Re: [PATCH v4 1/7] locking/pvqspinlock: Unconditional PV kick with _Q_SLOW_VAL Message-ID: <20150801222903.GC25159@twins.programming.kicks-ass.net> References: <1438395724-25910-1-git-send-email-Waiman.Long@hp.com> <1438395724-25910-2-git-send-email-Waiman.Long@hp.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438395724-25910-2-git-send-email-Waiman.Long@hp.com> User-Agent: Mutt/1.5.21 (2012-12-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2962 Lines: 77 On Fri, Jul 31, 2015 at 10:21:58PM -0400, Waiman Long wrote: > The smp_store_release() is not a full barrier. In order to avoid missed > wakeup, we may need to add memory barrier around locked and cpu state > variables adding to complexity. As the chance of spurious wakeup is very > low, it is easier and safer to just do an unconditional kick at unlock > time. > > Signed-off-by: Waiman Long > --- > kernel/locking/qspinlock_paravirt.h | 11 ++++++++--- > 1 files changed, 8 insertions(+), 3 deletions(-) > > diff --git a/kernel/locking/qspinlock_paravirt.h b/kernel/locking/qspinlock_paravirt.h > index 15d3733..2dd4b39 100644 > --- a/kernel/locking/qspinlock_paravirt.h > +++ b/kernel/locking/qspinlock_paravirt.h > @@ -240,7 +240,6 @@ static void pv_wait_head(struct qspinlock *lock, struct mcs_spinlock *node) > cpu_relax(); > } > > - WRITE_ONCE(pn->state, vcpu_halted); > if (!lp) { /* ONCE */ > lp = pv_hash(lock, pn); > /* > @@ -320,9 +319,15 @@ __visible void __pv_queued_spin_unlock(struct qspinlock *lock) > /* > * At this point the memory pointed at by lock can be freed/reused, > * however we can still use the pv_node to kick the CPU. > + * > + * As smp_store_release() is not a full barrier, adding a check to > + * the node->state doesn't guarantee the checking is really done > + * after clearing the lock byte This is true, but _WHY_ is that a problem ? since they are in 2 separate > + * cachelines and so hardware can reorder them. That's just gibberish, even in the same cacheline stuff can get reordered. So either we insert > + * memory barrier here and in the corresponding pv_wait_head() > + * function or we do an unconditional kick which is what is done here. why, why why ? You've added words, but you've not actually described what the problem is you're trying to fix. AFAICT the only thing we really care about here is that the load in question happens _after_ we observe SLOW, and that is still true. The order against the unlock is irrelevant. So we set ->state before we hash and before we set SLOW. Given that we've seen SLOW, we must therefore also see ->state. If ->state == halted, this means the CPU in question is blocked and the pv_node will not get re-used -- if it does get re-used, it wasn't blocked and we don't care either. Therefore, ->cpu is stable and we'll kick it into action. How do you end up not waking a waiting cpu? Explain that. > */ > - if (READ_ONCE(node->state) == vcpu_halted) > - pv_kick(node->cpu); > + pv_kick(node->cpu); > } Also, this patch clearly isn't against my tree. -- 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/