Re: [PATCH v14 for 4.1] sys_membarrier(): system-wide memory barrier (x86)

From: Thomas Gleixner
Date: Tue Apr 14 2015 - 15:35:46 EST


On Tue, 14 Apr 2015, Mathieu Desnoyers wrote:
> Thinking about it a bit more, one reason for doing the QUERY along
> with the exact set of flags queried allow us to do more than just
> returning which flags are supported: it allows us to tell userspace
> whether the combination of flags used is valid or not.
>
> For instance, if we add a MEMBARRIER_PRIVATE flag in a future release
> to issue memory barriers only to other threads from the same process,
> and we add a MEMBARRIER_EXPEDITED which uses IPIs to issue those
> barriers, we could very well have a situation where using
>
> EXPEDITED | PRIVATE would be valid (only sending IPIs to CPUs
> running threads from the same process)
>
> but
>
> EXPEDITED alone would be invalid (-EINVAL), until we figure out
> how to expedite memory barriers to all processors without impacting
> other processes, if at all possible.
>
> Using QUERY with an empty set of flags could however return the set of
> flags supported, which could be a nice feature. Anyway, I think
> the "0" flag should be the basic always correct configuration that
> is always supported, otherwise we'd have -ENOSYS. Therefore, querying
> whether the empty set of flags is supported has little value, other
> than checking for -ENOSYS.
>
> So considering the above, the typical use of this query method from
> library initialization would be:
>
> int supported_flags = sys_membarrier(MEMBARRIER_QUERY);
>
> ... check for -ENOSYS ....
> ... check whether the flags we need are supported ...
>
> if (sys_membarrier(MEMBARRIER_QUERY | flag1 | flag2))
> goto error;
>
> then we are guaranteed that using sys_membarrier(flag1 | flag2)
> will always succeed within the application, without needing to
> handle errors every time it is used. This property is useful
> to implement a synchronize_rcu() that returns "void" and simplify
> error handling within the application.

So how many of these "flags" are you planning to implement and how
many valid combinations are going to exist?

I doubt it's more than a dozen. So I prefer explicit operation modes
for the valid ones rather than having a random pile of "flags".

Thanks,

tglx


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/