Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1761455AbZAHSOZ (ORCPT ); Thu, 8 Jan 2009 13:14:25 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754425AbZAHSOM (ORCPT ); Thu, 8 Jan 2009 13:14:12 -0500 Received: from hrndva-omtalb.mail.rr.com ([71.74.56.122]:62970 "EHLO hrndva-omtalb.mail.rr.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753637AbZAHSOK (ORCPT ); Thu, 8 Jan 2009 13:14:10 -0500 Date: Thu, 8 Jan 2009 13:14:08 -0500 (EST) From: Steven Rostedt X-X-Sender: rostedt@gandalf.stny.rr.com To: Linus Torvalds cc: Chris Mason , Peter Zijlstra , Ingo Molnar , paulmck@linux.vnet.ibm.com, Gregory Haskins , Matthew Wilcox , Andi Kleen , Andrew Morton , Linux Kernel Mailing List , linux-fsdevel , linux-btrfs , Thomas Gleixner , Nick Piggin , Peter Morreale , Sven Dietrich Subject: Re: [PATCH -v7][RFC]: mutex: implement adaptive spinning In-Reply-To: Message-ID: References: <1231347442.11687.344.camel@twins> <1231365115.11687.361.camel@twins> <1231366716.11687.377.camel@twins> <1231408718.11687.400.camel@twins> <20090108141808.GC11629@elte.hu> <1231426014.11687.456.camel@twins> <1231434515.14304.27.camel@think.oraclecorp.com> User-Agent: Alpine 1.10 (DEB 962 2008-03-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1555 Lines: 46 On Thu, 8 Jan 2009, Steven Rostedt wrote: > > In fact, you might not even need a process C: all you need is for B to be > > on the same runqueue as A, and having enough load on the other CPU's that > > A never gets migrated away. So "C" might be in user space. You're right about not needing process C. > > > > I dunno. There are probably variations on the above. > > Ouch! I think you are on to something: > > for (;;) { > struct thread_info *owner; > > old_val = atomic_cmpxchg(&lock->count, 1, 0); > if (old_val == 1) { > lock_acquired(&lock->dep_map, ip); > mutex_set_owner(lock); > return 0; > } > > if (old_val < 0 && !list_empty(&lock->wait_list)) > break; > > /* See who owns it, and spin on him if anybody */ > owner = ACCESS_ONCE(lock->owner); > > The owner was preempted before assigning lock->owner (as you stated). If it was the current process that preempted the owner and these are RT tasks pinned to the same CPU and the owner is of lower priority than the spinner, we have a deadlock! Hmm, I do not think the need_sched here will even fix that :-/ -- Steve -- 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/