Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753118AbbDARmy (ORCPT ); Wed, 1 Apr 2015 13:42:54 -0400 Received: from casper.infradead.org ([85.118.1.10]:56841 "EHLO casper.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752679AbbDARmu (ORCPT ); Wed, 1 Apr 2015 13:42:50 -0400 Date: Wed, 1 Apr 2015 19:42:39 +0200 From: Peter Zijlstra To: Waiman Long Cc: tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, paolo.bonzini@gmail.com, konrad.wilk@oracle.com, boris.ostrovsky@oracle.com, paulmck@linux.vnet.ibm.com, riel@redhat.com, torvalds@linux-foundation.org, raghavendra.kt@linux.vnet.ibm.com, david.vrabel@citrix.com, oleg@redhat.com, scott.norton@hp.com, doug.hatch@hp.com, linux-arch@vger.kernel.org, x86@kernel.org, linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org, xen-devel@lists.xenproject.org, kvm@vger.kernel.org, luto@amacapital.net Subject: Re: [PATCH 8/9] qspinlock: Generic paravirt support Message-ID: <20150401174239.GO24151@twins.programming.kicks-ass.net> References: <20150316131613.720617163@infradead.org> <20150316133112.278511476@infradead.org> <5509E51D.7040909@hp.com> <20150319101242.GM21418@twins.programming.kicks-ass.net> <20150319122536.GD11574@worktop.ger.corp.intel.com> <551C1ACE.4090408@hp.com> <20150401171223.GO23123@twins.programming.kicks-ass.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150401171223.GO23123@twins.programming.kicks-ass.net> 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: 1583 Lines: 40 On Wed, Apr 01, 2015 at 07:12:23PM +0200, Peter Zijlstra wrote: > On Wed, Apr 01, 2015 at 12:20:30PM -0400, Waiman Long wrote: > > After more careful reading, I think the assumption that the presence of an > > unused bucket means there is no match is not true. Consider the scenario: > > > > 1. cpu 0 puts lock1 into hb[0] > > 2. cpu 1 puts lock2 into hb[1] > > 3. cpu 2 clears hb[0] > > 4. cpu 3 looks for lock2 and doesn't find it > > Hmm, yes. The only way I can see that being true is if we assume entries > are never taken out again. > > The wikipedia page could use some clarification here, this is not clear. > > > At this point, I am thinking using back your previous idea of passing the > > queue head information down the queue. > > Having to scan the entire array for a lookup sure sucks, but the wait > loops involved in the other idea can get us in the exact predicament we > were trying to get out, because their forward progress depends on other > CPUs. > > Hohumm.. time to think more I think ;-) So bear with me, I've not really pondered this well so it could be full of holes (again). After the cmpxchg(&l->locked, _Q_LOCKED_VAL, _Q_SLOW_VAL) succeeds the spin_unlock() must do the hash lookup, right? We can make the lookup unhash. If the cmpxchg() fails the unlock will not do the lookup and we must unhash. -- 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/