Messages in this thread Patch in this message | | | Date | Wed, 22 Apr 2015 20:40:42 +0000 (UTC) | From | Mathieu Desnoyers <> | Subject | Re: [PATCH v16] sys_membarrier(): system-wide memory barrier (generic, x86) |
| |
----- Original Message ----- > On Fri, Apr 17, 2015 at 11:06 AM, Mathieu Desnoyers > <mathieu.desnoyers@efficios.com> wrote: > > diff --git a/init/Kconfig b/init/Kconfig > > index f5dbc6d..89bad6a 100644 > > --- a/init/Kconfig > > +++ b/init/Kconfig > > @@ -1559,6 +1559,19 @@ config PCI_QUIRKS > > bugs/quirks. Disable this only if your target machine is > > unaffected by PCI quirks. > > > > +config MEMBARRIER > > + bool "Enable membarrier() system call" if EXPERT > > + default y > > + depends on SMP > > + help > > + Enable the membarrier() system call that allows issuing memory > > + barriers across all running threads, which can be used to > > distribute > > + the cost of user-space memory barriers asymmetrically by > > transforming > > + pairs of memory barriers into pairs consisting of membarrier() > > and a > > + compiler barrier. > > + > > + If unsure, say Y. > > + > > I understand why this syscall makes sense on SMP only, but you are > anyways checking num_online_cpus() and returning if it is only one. Is > this limitation necessary then? How do !SMP systems handle this > syscall? (I am guessing glibc wrapper?)
For !SMP, this system call is not implemented (returns -ENOSYS). Userspace libs are expected to query sysconf(_SC_NPROCESSORS_CONF) and check whether the system supports multiprocessor at all. If only a single processor is supported by the kernel, then userspace can skip the calls to sys_membarrier altogether, because they are not even needed.
Do you think this kind of information belongs in a man page ?
Should we instead just implement the system call in !SMP, and return 0 without any side-effect ? This would be a bit inefficient to let userspace call a system call that has no effect whatsoever.
Thanks,
Mathieu
> ... > > +SYSCALL_DEFINE2(membarrier, int, cmd, int, flags) > > +{ > > + switch (cmd) { > > + case MEMBARRIER_CMD_QUERY: > > + return MEMBARRIER_CMD_BITMASK; > > + case MEMBARRIER_CMD_SHARED: > > + if (num_online_cpus() > 1) > > + synchronize_sched(); > > + return 0; > > + default: > > + return -EINVAL; > > + } > > +} > > > > -- > Pranith >
-- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com
| |