From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751411AbcGPB1Y (ORCPT ); Fri, 15 Jul 2016 21:27:24 -0400 Received: from mx2.suse.de ([195.135.220.15]:50104 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751217AbcGPB1W (ORCPT ); Fri, 15 Jul 2016 21:27:22 -0400 Date: Fri, 15 Jul 2016 18:27:12 -0700 From: Davidlohr Bueso To: Manfred Spraul Cc: "H. Peter Anvin" , Peter Zijlstra , Andrew Morton , LKML , Thomas Gleixner , Ingo Molnar , 1vier1@web.de, felixh@informatik.uni-bremen.de, stable@vger.kernel.org Subject: Re: [PATCH 1/2] ipc/sem.c: Fix complex_count vs. simple op race Message-ID: <20160716012712.GB2271@linux-80c1.suse> References: <1468386412-3608-1-git-send-email-manfred@colorfullife.com> <1468386412-3608-2-git-send-email-manfred@colorfullife.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline In-Reply-To: <1468386412-3608-2-git-send-email-manfred@colorfullife.com> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 13 Jul 2016, Manfred Spraul wrote: >-static void sem_wait_array(struct sem_array *sma) >+static void complexmode_enter(struct sem_array *sma) > { > int i; > struct sem *sem; > >- if (sma->complex_count) { >- /* The thread that increased sma->complex_count waited on >- * all sem->lock locks. Thus we don't need to wait again. >- */ >+ if (sma->complex_mode) { >+ /* We are already in complex_mode. Nothing to do */ > return; > } >+ WRITE_ONCE(sma->complex_mode, true); So we can actually save those READ/WRITE_ONCE calls for complex_mode as it's a bool and therefore tearing is not an issue. >+ >+ /* We need a full barrier: >+ * The write to complex_mode must be visible >+ * before we read the first sem->lock spinlock state. >+ */ >+ smp_mb(); smp_store_mb()? > /* >@@ -300,56 +338,40 @@ static inline int sem_lock(struct sem_array *sma, struct sembuf *sops, > /* Complex operation - acquire a full lock */ > ipc_lock_object(&sma->sem_perm); > >- /* And wait until all simple ops that are processed >- * right now have dropped their locks. >- */ >- sem_wait_array(sma); >+ /* Prevent parallel simple ops */ >+ complexmode_enter(sma); > return -1; nit and unrelated: we should probably use some better label here than a raw -1 (although I don't see it changing, just for nicer reading), ie: SEM_OBJECT_LOCKED Thanks, Davidlohr