From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161367AbcFGO74 (ORCPT ); Tue, 7 Jun 2016 10:59:56 -0400 Received: from mx2.suse.de ([195.135.220.15]:36550 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1161316AbcFGO7z (ORCPT ); Tue, 7 Jun 2016 10:59:55 -0400 Date: Tue, 7 Jun 2016 07:59:45 -0700 From: Davidlohr Bueso To: Sebastian Andrzej Siewior Cc: linux-kernel@vger.kernel.org, Peter Zijlstra , tglx@linutronix.de, Manfred Spraul , Andrew Morton Subject: Re: [PATCH v3] ipc/msg: Implement lockless pipelined wakeups Message-ID: <20160607145945.qf5bienv3wnj7jrt@linux-uzut.site> References: <1465233650-12085-1-git-send-email-bigeasy@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline In-Reply-To: <1465233650-12085-1-git-send-email-bigeasy@linutronix.de> User-Agent: Mutt/1.6.1-neo () Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 06 Jun 2016, Sebastian Andrzej Siewior wrote: >-static void expunge_all(struct msg_queue *msq, int res) >+static void expunge_all(struct msg_queue *msq, int res, >+ struct wake_q_head *wake_q) > { > struct msg_receiver *msr, *t; > > list_for_each_entry_safe(msr, t, &msq->q_receivers, r_list) { >- msr->r_msg = NULL; /* initialize expunge ordering */ >- wake_up_process(msr->r_tsk); >- /* >- * Ensure that the wakeup is visible before setting r_msg as >- * the receiving end depends on it: either spinning on a nil, >- * or dealing with -EAGAIN cases. See lockless receive part 1 >- * and 2 in do_msgrcv(). >- */ >+ >+ WRITE_ONCE(msr->r_msg, ERR_PTR(res)); > smp_wmb(); /* barrier (B) */ >- msr->r_msg = ERR_PTR(res); >+ wake_q_add(wake_q, msr->r_tsk); Given that wake_q_add() implies barriers on both sides (cmpxchg), I think we can rely on that instead of the explicit smp_wmb() for barrier B. While a failed call doesn't imply the barriers, we're already in a world of trouble _anyways_ if that's the case. Same for pipelined_send, obviously. Thanks, Davidlohr