This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Linux: Implement membarrier function



On 28/11/2018 13:05, Florian Weimer wrote:
> This is essentially a repost of last year's patch, rebased to the glibc
> 2.29 symbol version and reflecting the introduction of
> MEMBARRIER_CMD_GLOBAL.
> 
> I'm not including any changes to manual/ here because the set of
> supported operations is evolving rapidly, we could not get consensus for
> the language I proposed the last time, and I do not want to contribute
> to the manual for the time being.

I agree that documentation might be added in a subsequent patch.  The only
issue I have with this patch is how to handle the kernel header, see comments
below.

> 
> Thanks,
> Florian
> 
> 2018-11-28  Florian Weimer  <fweimer@redhat.com>
> 
> 	Linux: Implement membarrier function.
> 	* sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add
> 	sys/membarrier.h.
> 	(tests): Add tst-membarrier.
> 	* sysdeps/unix/sysv/linux/Versions (GLIBC_2.27): Add membarrier.
> 	* sysdeps/unix/sysv/linux/sys/membarrier.h: New file.
> 	* sysdeps/unix/sysv/linux/tst-membarrier.c: Likewise.
> 	* sysdeps/unix/sysv/linux/aarch64/libc.abilist (GLIBC_2.29): Add
> 	membarrier.
> 	* sysdeps/unix/sysv/linux/alpha/libc.abilist (GLIBC_2.29):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/arm/libc.abilist (GLIBC_2.29): Likewise.
> 	* sysdeps/unix/sysv/linux/hppa/libc.abilist (GLIBC_2.29):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/i386/libc.abilist (GLIBC_2.29):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/ia64/libc.abilist (GLIBC_2.29):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist (GLIBC_2.29):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist (GLIBC_2.29):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/microblaze/libc.abilist (GLIBC_2.29):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> 	(GLIBC_2.29): Likewise.
> 	* sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> 	(GLIBC_2.29): Likewise.
> 	* sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> 	(GLIBC_2.29): Likewise.
> 	* sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> 	(GLIBC_2.29): Likewise.
> 	* sysdeps/unix/sysv/linux/nios2/libc.abilist (GLIBC_2.29):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> 	(GLIBC_2.29): Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> 	(GLIBC_2.29): Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
> 	(GLIBC_2.29): Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
> 	(GLIBC_2.29): Likewise.
> 	* sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist (GLIBC_2.29):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist (GLIBC_2.29):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist (GLIBC_2.29):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/sh/libc.abilist (GLIBC_2.29): Likewise.
> 	* sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist (GLIBC_2.29):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist (GLIBC_2.29):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/x86_64/64/libc.abilist (GLIBC_2.29):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist (GLIBC_2.29):
> 	Likewise.
> 
> diff --git a/NEWS b/NEWS
> index 1098be1afb..d5786f4eab 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -35,6 +35,9 @@ Major new features:
>    different directory.  This is a GNU extension and similar to the
>    Solaris function of the same name.
>  
> +* The membarrier function and the <sys/membarrier.h> header file have been
> +  added.
> +
>  Deprecated and removed features, and other changes affecting compatibility:
>  
>  * The glibc.tune tunable namespace has been renamed to glibc.cpu and the

Please make explicit this is a Linux only interface.

> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
> index 362cf3b950..f8c4843ab6 100644
> --- a/sysdeps/unix/sysv/linux/Makefile
> +++ b/sysdeps/unix/sysv/linux/Makefile
> @@ -43,12 +43,13 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \
>  		  bits/siginfo-arch.h bits/siginfo-consts-arch.h \
>  		  bits/procfs.h bits/procfs-id.h bits/procfs-extra.h \
>  		  bits/procfs-prregset.h bits/mman-map-flags-generic.h \
> -		  bits/msq-pad.h bits/sem-pad.h bits/shmlba.h bits/shm-pad.h
> +		  bits/msq-pad.h bits/sem-pad.h bits/shmlba.h bits/shm-pad.h \
> +		  sys/membarrier.h
>  
>  tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
>  	 tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \
>  	 test-errno-linux tst-memfd_create tst-mlock2 tst-pkey \
> -	 tst-rlimit-infinity tst-ofdlocks
> +	 tst-rlimit-infinity tst-ofdlocks tst-membarrier
>  tests-internal += tst-ofdlocks-compat
>  
>  

Ok.

> diff --git a/sysdeps/unix/sysv/linux/Versions b/sysdeps/unix/sysv/linux/Versions
> index 336c13b57d..86db06f403 100644
> --- a/sysdeps/unix/sysv/linux/Versions
> +++ b/sysdeps/unix/sysv/linux/Versions
> @@ -171,6 +171,9 @@ libc {
>      mlock2;
>      pkey_alloc; pkey_free; pkey_set; pkey_get; pkey_mprotect;
>    }
> +  GLIBC_2.29 {
> +    membarrier;
> +  }
>    GLIBC_PRIVATE {
>      # functions used in other libraries
>      __syscall_rt_sigqueueinfo;

Ok.

> diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> index e66c741d04..c73c731eec 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> @@ -2138,4 +2138,5 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> index 8df162fe99..c9488b3c18 100644
> --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> @@ -2033,6 +2033,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/arm/libc.abilist b/sysdeps/unix/sysv/linux/arm/libc.abilist
> index 43c804f9dc..2524b6545b 100644
> --- a/sysdeps/unix/sysv/linux/arm/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/libc.abilist
> @@ -123,6 +123,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.4 _Exit F
>  GLIBC_2.4 _IO_2_1_stderr_ D 0xa0

Ok.

> diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> index 88b01c2e75..9baaa34b62 100644
> --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> @@ -1880,6 +1880,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
> index 6d02f31612..1b91873f65 100644
> --- a/sysdeps/unix/sysv/linux/i386/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
> @@ -2045,6 +2045,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> index 4249712611..1b3465c6f4 100644
> --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> @@ -1914,6 +1914,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> index d47b808862..db22eb4a12 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> @@ -124,6 +124,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.4 _Exit F
>  GLIBC_2.4 _IO_2_1_stderr_ D 0x98

Ok.

> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> index d5e38308be..5a93b98e76 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> @@ -1989,6 +1989,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/microblaze/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/libc.abilist
> index 8596b84399..0142b573ca 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/libc.abilist
> @@ -2130,4 +2130,5 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> index 88e0f896d5..a84db6e3f4 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> @@ -1967,6 +1967,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> index aff7462c34..aed9d20fa5 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> @@ -1965,6 +1965,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> index 71d82444aa..d117ad299e 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> @@ -1973,6 +1973,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> index de6c53d293..3598a33eca 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> @@ -1968,6 +1968,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> index e724bab9fb..7ce4aa1841 100644
> --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> @@ -2171,4 +2171,5 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> index e9ecbccb71..50fedd0fab 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> @@ -1993,6 +1993,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> index da83ea6028..86862b6e16 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> @@ -1997,6 +1997,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
Ok.

> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
> index 4535b40d15..57c0e67347 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
> @@ -2228,4 +2228,5 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
> index 65725de4f0..7658e2c2b9 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
> @@ -123,6 +123,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 _Exit F
>  GLIBC_2.3 _IO_2_1_stderr_ D 0xe0

Ok.

> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> index bbb3c4a8e7..f4020e881d 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> @@ -2100,4 +2100,5 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> index e85ac2a178..9476770e5b 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> @@ -2002,6 +2002,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> index d56931022c..ee9a87659f 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> @@ -1908,6 +1908,7 @@ GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
>  GLIBC_2.29 __fentry__ F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/sh/libc.abilist b/sysdeps/unix/sysv/linux/sh/libc.abilist
> index ff939a15c4..c2dd2a5f7e 100644
> --- a/sysdeps/unix/sysv/linux/sh/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/libc.abilist
> @@ -1884,6 +1884,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> index 64fa9e10a5..55c6496b96 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> @@ -1996,6 +1996,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> index db909d1506..a0e7f2f221 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> @@ -1937,6 +1937,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/sys/membarrier.h b/sysdeps/unix/sysv/linux/sys/membarrier.h
> new file mode 100644
> index 0000000000..4c3e6164f7
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/sys/membarrier.h
> @@ -0,0 +1,55 @@
> +/* Memory barriers.
> +   Copyright (C) 2018 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_MEMBARRIER_H
> +#define _SYS_MEMBARRIER_H 1
> +
> +#include <features.h>
> +
> +__BEGIN_DECLS
> +
> +/* Perform a memory barrier on multiple threads.  */
> +int membarrier (int __op, int __flags) __THROW;
> +
> +__END_DECLS
> +
> +/* Obtain the definitions of the MEMBARRIER_CMD_* constants.  */
> +
> +#include <linux/version.h>
> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0)
> +# include <linux/membarrier.h>
> +#else
> +
> +/* Definitions from Linux 4.16 follow.  */
> +
> +enum membarrier_cmd
> +{
> +  MEMBARRIER_CMD_QUERY = 0,
> +  MEMBARRIER_CMD_SHARED = 1,
> +  MEMBARRIER_CMD_GLOBAL = 1,
> +  MEMBARRIER_CMD_GLOBAL_EXPEDITED = 2,
> +  MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED = 4,
> +  MEMBARRIER_CMD_PRIVATE_EXPEDITED = 8,
> +  MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED = 16,
> +  MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE = 32,
> +  MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = 64,
> +};
> +
> +#endif

If we are replicating the values, meaning the idea is to keep it sync at least
when we have the minimum supported kernel of 4.16, why just not add a comment
to add linux/membarrier.h once the minimum supported kernel provides this
header and not rely on linux/membarrier.h? 

Also I think the minimum kernel that provides this header is 4.3, however
by using 4.3 as the condition to include the kernel header in add another
issue which is glibc will have different semantic depending of the installed
header. This fallback enum definition is also lacking MEMBARRIER_CMD_SHARED,
and although is provided by kernel headers just for compatibility, it is 
another interface difference it has depending of the installed kernel
header.

Personally I prefer to decouple glibc headers from kernel ones, so I would
go just with define membarrier_cmd (and the flags once its is implemented
by kernel) with the burden of keep them in sync with kernel releases (as
we do for various syscalls and headers).

> +
> +#endif /* _SYS_MEMBARRIER_H */
> diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list
> index e24ea29e35..3deee2bc19 100644
> --- a/sysdeps/unix/sysv/linux/syscalls.list
> +++ b/sysdeps/unix/sysv/linux/syscalls.list
> @@ -112,3 +112,4 @@ process_vm_writev EXTRA	process_vm_writev i:ipipii process_vm_writev
>  memfd_create    EXTRA	memfd_create	i:si    memfd_create
>  pkey_alloc	EXTRA	pkey_alloc	i:ii	pkey_alloc
>  pkey_free	EXTRA	pkey_free	i:i	pkey_free
> +membarrier	EXTRA	membarrier	i:ii	membarrier

Ok.

> diff --git a/sysdeps/unix/sysv/linux/tst-membarrier.c b/sysdeps/unix/sysv/linux/tst-membarrier.c
> new file mode 100644
> index 0000000000..aeaccad578
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/tst-membarrier.c
> @@ -0,0 +1,61 @@
> +/* Tests for the membarrier function.
> +   Copyright (C) 2017 Free Software Foundation, Inc.

Update copyright year.

> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <errno.h>
> +#include <stdio.h>
> +#include <support/check.h>
> +#include <sys/membarrier.h>
> +
> +static int
> +do_test (void)
> +{
> +  int supported = membarrier (MEMBARRIER_CMD_QUERY, 0);
> +  if (supported == -1)
> +    {
> +      if (errno == ENOSYS)
> +        FAIL_UNSUPPORTED ("membarrier system call not implemented");
> +      else
> +        FAIL_EXIT1 ("membarrier: %m");
> +    }
> +
> +  if ((supported & MEMBARRIER_CMD_GLOBAL) == 0)
> +    FAIL_UNSUPPORTED ("global memory barriers not supported");
> +
> +  puts ("info: membarrier is supported on this system");
> +
> +  /* The global barrier is always implemented.  */
> +  TEST_COMPARE (supported & MEMBARRIER_CMD_GLOBAL, MEMBARRIER_CMD_GLOBAL);
> +  TEST_COMPARE (membarrier (MEMBARRIER_CMD_GLOBAL, 0), 0);
> +
> +  /* If the private-expedited barrier is advertised, execute it after
> +     registering the intent.  */
> +  if (supported & MEMBARRIER_CMD_PRIVATE_EXPEDITED)
> +    {
> +      TEST_COMPARE (supported & MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED,
> +                    MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED);
> +      TEST_COMPARE (membarrier (MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0),
> +                    0);
> +      TEST_COMPARE (membarrier (MEMBARRIER_CMD_PRIVATE_EXPEDITED, 0), 0);
> +    }
> +  else
> +    puts ("info: MEMBARRIER_CMD_PRIVATE_EXPEDITED not supported");
> +
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>

Ok.

> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> index 3b175f104b..f097eb86e2 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> @@ -1895,6 +1895,7 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F

Ok.

> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> index 1b57710477..afb1a196fa 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> @@ -2146,4 +2146,5 @@ GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_equal F
>  GLIBC_2.28 thrd_sleep F
>  GLIBC_2.28 thrd_yield F
> +GLIBC_2.29 membarrier F
>  GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
> 

Ok.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]