From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751383AbeAPSUt (ORCPT + 1 other); Tue, 16 Jan 2018 13:20:49 -0500 Received: from Galois.linutronix.de ([146.0.238.70]:43828 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750990AbeAPSUr (ORCPT ); Tue, 16 Jan 2018 13:20:47 -0500 Date: Tue, 16 Jan 2018 19:20:33 +0100 (CET) From: Thomas Gleixner To: Mathieu Desnoyers cc: Ingo Molnar , Peter Zijlstra , linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, Andy Lutomirski , "Paul E . McKenney" , Boqun Feng , Andrew Hunter , Maged Michael , Avi Kivity , Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , Dave Watson , "H . Peter Anvin" , Andrea Parri , Russell King , Greg Hackmann , Will Deacon , David Sehr , Linus Torvalds , x86@kernel.org Subject: Re: [PATCH for 4.16 04/10] membarrier: provide SHARED_EXPEDITED command (v2) In-Reply-To: <20180115191104.12437-5-mathieu.desnoyers@efficios.com> Message-ID: References: <20180115191104.12437-1-mathieu.desnoyers@efficios.com> <20180115191104.12437-5-mathieu.desnoyers@efficios.com> User-Agent: Alpine 2.20 (DEB 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: On Mon, 15 Jan 2018, Mathieu Desnoyers wrote: > +static int membarrier_shared_expedited(void) > +{ > + int cpu; > + bool fallback = false; > + cpumask_var_t tmpmask; > + > + if (num_online_cpus() == 1) > + return 0; > + > + /* > + * Matches memory barriers around rq->curr modification in > + * scheduler. > + */ > + smp_mb(); /* system call entry is not a mb. */ > + > + /* > + * Expedited membarrier commands guarantee that they won't > + * block, hence the GFP_NOWAIT allocation flag and fallback > + * implementation. > + */ > + if (!zalloc_cpumask_var(&tmpmask, GFP_NOWAIT)) { > + /* Fallback for OOM. */ > + fallback = true; > + } > + > + cpus_read_lock(); > + for_each_online_cpu(cpu) { > + struct task_struct *p; > + > + /* > + * Skipping the current CPU is OK even through we can be > + * migrated at any point. The current CPU, at the point > + * where we read raw_smp_processor_id(), is ensured to > + * be in program order with respect to the caller > + * thread. Therefore, we can skip this CPU from the > + * iteration. > + */ > + if (cpu == raw_smp_processor_id()) > + continue; > + rcu_read_lock(); > + p = task_rcu_dereference(&cpu_rq(cpu)->curr); > + if (p && p->mm && (atomic_read(&p->mm->membarrier_state) & > + MEMBARRIER_STATE_SHARED_EXPEDITED)) { This does not make sense vs. the documentation: > + * @MEMBARRIER_CMD_SHARED_EXPEDITED: > + * Execute a memory barrier on all running threads > + * part of a process which previously registered > + * with MEMBARRIER_CMD_REGISTER_SHARED_EXPEDITED. This should say: > + * Execute a memory barrier on all running threads > + * of all processes which previously registered > + * with MEMBARRIER_CMD_REGISTER_SHARED_EXPEDITED. And I really have to ask whether this should be named _GLOBAL_ instead of _SHARED_. Hmm? Thanks, tglx