From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755569AbcFQOmZ (ORCPT ); Fri, 17 Jun 2016 10:42:25 -0400 Received: from mail-yw0-f171.google.com ([209.85.161.171]:34586 "EHLO mail-yw0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751473AbcFQOmY (ORCPT ); Fri, 17 Jun 2016 10:42:24 -0400 Message-ID: <1466174540.3596.16.camel@poochiereds.net> Subject: Re: initialize a mutex into locked state? From: Jeff Layton To: Oleg Drokin , Peter Zijlstra Cc: Mailing List , mingo@redhat.com, arjan@linux.intel.com, "J . Bruce Fields" Date: Fri, 17 Jun 2016 10:42:20 -0400 In-Reply-To: <17E58758-CA23-420D-89B4-50E71F8A6428@linuxhacker.ru> References: <55315ADD-4AE1-4EA4-8291-1B07F659BD99@linuxhacker.ru> <20160617082559.GD30935@twins.programming.kicks-ass.net> <38111D58-C42F-4ED3-BC31-04884795BE38@linuxhacker.ru> <20160617141912.GS30154@twins.programming.kicks-ass.net> <20160617143200.GU30154@twins.programming.kicks-ass.net> <17E58758-CA23-420D-89B4-50E71F8A6428@linuxhacker.ru> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2 (3.18.5.2-1.fc23) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 2016-06-17 at 10:40 -0400, Oleg Drokin wrote: > On Jun 17, 2016, at 10:32 AM, Peter Zijlstra wrote: > > > > > On Fri, Jun 17, 2016 at 10:24:32AM -0400, Oleg Drokin wrote: > > > > > > > > > On Jun 17, 2016, at 10:19 AM, Peter Zijlstra wrote: > > > > > > > > > > > On Fri, Jun 17, 2016 at 10:14:10AM -0400, Oleg Drokin wrote: > > > > > > > > > > > > > > > On Jun 17, 2016, at 4:25 AM, Peter Zijlstra wrote: > > > > > > > > > > > > > > > > > On Wed, Jun 15, 2016 at 02:23:35PM -0400, Oleg Drokin > > > > > > wrote: > > > > > > > > > > > > > > Hello! > > > > > > > > > > > > > > To my surprise I found out that it's not possible to > > > > > > > initialise a mutex into > > > > > > > a locked state. > > > > > > > I discussed it with Arjan and apparently there's no > > > > > > > fundamental reason > > > > > > > not to allow this. > > > > > > There is. A mutex _must_ have an owner. If you can > > > > > > initialize it in > > > > > > locked state, you could do so statically, ie. outside of > > > > > > the context of > > > > > > a task. > > > > > What's wrong with disallowing only static initializers, but > > > > > allowing dynamic ones? > > > > > Then there is a clear owner. > > > > At which point, what wrong with the simple: > > > > > > > > mutex_init(&m); > > > > mutex_lock(&m); > > > > > > > > Sequence? Its obvious, has clear semantics and doesn't extend > > > > the API. > > > The problem is: > > > > > > spin_lock(somelock); > > > structure = some_internal_list_lookup(list); > > > if (structure) > > > goto out; > > > > > > init_new_structure(new_structure); > > > mutex_init(&new_structure->s_mutex); > > > mutex_lock(&new_structure->s_mutex);  // XXX CANNOT DO THIS UNDER > > > SPINLOCK! > > mutex_trylock(&new_structure->s_mutex); > > > > should work, since you know it cannot be acquired yet by anybody > > else, > > since you've not published it yet. > This does work, but suddenly does not look so obvious anymore, does > it? > I got some feedback that doing this is not really preferred. > > Also once __must_check is added to mutex_try_lock() (surprised it's > not yet), > we'll need to also have the useless "but what if it did fail to lock" > path? > Maybe just BUG in that case, and add a comment that says something along the lines of "this should always work since it's not hashed yet" ?   > > > > And a trylock does not sleep, so is perfectly fine under a > > spinlock. > > > > > > > > > > > list_add(list, new_structure->s_list); > > > structure = new_structure; > > > out: > > > spin_unlock(somelock); > > > return structure; > > > -- Jeff Layton