From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 94192 invoked by alias); 22 Nov 2017 15:14:40 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 94180 invoked by uid 89); 22 Nov 2017 15:14:40 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.3 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,KB_WAM_FROM_NAME_SINGLEWORD,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qt0-f182.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:references:to:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=RFtAmB6NpR3Xj3VcWPNkujjzz/joa+Q6cMQHcKkP++U=; b=HZ2co97TGLbwjKmqzIWUy98qyd8xEioCQYcljHy+EqYkuf9jOq7Wky9s40l3ObccU/ feuDn4KIzGd4meIdcl+HGfwQcPMMMSM1OeyBZWVqtQMlE/BGZTqHbeF6li4ub/X5V5pf L5FJBAQ4N9JoYnt4L37KKB3EZKWPFBb6BBgHsByj+g5ud35nds6/TQ8h9lhx0rfSQknT UCts0gqaEjPA2emhpdqihnnAxAyJ+32pAWicvL1yxN3qXFUxaNk5wfPjOMOPq98Visjy nTEEbirUBWwasjhEoY0YlQ5Gm5pT04/waTqF4jJgnj9dMtvGb5RU8d734YZQMB54s4Um 4WRQ== X-Gm-Message-State: AJaThX6bmFhBn54BSr35bY7LqVZ5siB8bM6IlDn+cIm23B36ZhV2pmD1 3FfMjCp6tF82bjr0L68JEN99b6B3Zd0= X-Google-Smtp-Source: AGs4zMYOCqYf5L6cn6I/jYM4tzLH7xB1rjxl1FtxziaX5KCUGOGxY7K0zYFHEZDfe5FE4qJ0cUZIJg== X-Received: by 10.200.24.83 with SMTP id n19mr32095406qtk.263.1511363673463; Wed, 22 Nov 2017 07:14:33 -0800 (PST) Subject: Re: [PATCH] Linux: Add memfd_create system call wrapper References: <20171103232445.B2FB241C85DF3@oldenburg.str.redhat.com> <705337f2-e578-eb4f-d5fe-8f19653fcf55@linaro.org> <87y3nbrhos.fsf@mid.deneb.enyo.de> <1ae3b4f9-77eb-a1bc-4ba1-2c6660558ff9@redhat.com> <39478e6e-1411-5bc1-2f9f-821ce7076471@linaro.org> <414dc8b1-08ec-8644-75a3-8de1dfbf2579@pacific.net> To: libc-alpha@sourceware.org From: Adhemerval Zanella Message-ID: Date: Wed, 22 Nov 2017 15:14:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-SW-Source: 2017-11/txt/msg00795.txt.bz2 On 19/11/2017 11:49, Florian Weimer wrote: > On 11/19/2017 02:47 AM, Rical Jasan wrote: >> On 11/18/2017 09:32 AM, Florian Weimer wrote: >>> diff --git a/manual/llio.texi b/manual/llio.texi >>> index 8c7c58c216..625fe49ac1 100644 >>> --- a/manual/llio.texi >>> +++ b/manual/llio.texi >>> @@ -1808,6 +1808,69 @@ the given @var{name} previously created by @code{shm_open}. >>>   On failure @code{errno} is set. >>>   @end deftypefn >>>   +@deftypefn Function int memfd_create (const char *@var{name}, unsigned int flags) >> >> "@var{flags}" >> >> Use @deftypefun, and drop "Function" (shortcut). > > Both fixed. > >>> +@standards{Linux, sys/mman.h} >>> +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} >>> +The @code{memfd_create} function returns a file descriptor which can be >>> +used to create memory mappings using the @code{mmap} function.  It is >>> +similar to the @code{shm_open} function in the sense that these mappings >>> +are not backed by actual files.  However, the descriptor return by >> >> "returned" > > Fixed. > >>> +@code{memfd_create} does not correspond to a named object; the >>> +@var{name} argument is used for informative purposes only.  The >> >> I see in mman-linux.h, "NAME is a name for debugging."  Can we say >> "debugging purposes" here?  As-is, it sounds ignored, and doesn't really >> hint at what type of information one could get from it or how. > > Well, that is exactly what I want to convey: The name is unused and just shows up in /proc in a few places.  I want to make sure that there is no expectation that you get same underlying file if you specify the same name. > >>> +descriptor can be passed between processes (for example, over local >>> +domain sockets), and mappings at the same offset refer to the same >>> +memory, or the descriptor can be used to create alias mappings within >>> +the same process. >> >> The and/or here is odd.  What about: "...the same memory.  The >> descriptor can also be used..." > > Good idea. > >>> +This flag is incompatible with @code{MFD_ALLOW_SEALING}. >>> +@end vtable >>> + >>> +@code{memfd_create} returns a file descriptor on success, and @math{-1} >> >> I think @code for return values is more appropriate. > > I've been using @math for constants.  I like it for these small decimal constants because the typewriter font stands out some much. > > New patch attached.  I think I have addressed all concerns raised regarding the documentation.  Is there anything left to do for the implementation? > > Thanks, > Florian > > memfd_create.patch > > > Subject: [PATCH] Linux: Add memfd_create system call wrapper > To: libc-alpha@sourceware.org > > The system call is somewhat obscure because it is closely related > to file descriptor sealing. However, it is also the recommended > way to create alias mappings, which is why it has more general use. > > No emulation is provided. Except for the name of the > /proc/self/fd links, it would be possible to implement an > approximation using O_TMPFILE and tmpfs, but this does not appear > to be worth the added complexity. > > Reviewed-by: Adhemerval Zanella > Reviewed-by: Christian Brauner > > 2017-11-19 Florian Weimer > > Linux: Add memfd_create system call wrapper > * sysdeps/unix/sysv/linux/Makefile [misc] (tests): Add > tst-memfd_create. > * sysdeps/unix/sysv/linux/bits/mman-linux.h [__USE_GNU] > (MFD_CLOEXEC, MFD_ALLOW_SEALING): Define. > [__USE_GNU] (memfd_create): Declare. > * sysdeps/unix/sysv/linux/Versions (GLIBC_2.27): Add memfd_create. > * sysdeps/unix/sysv/linux/syscalls.list (memfd_create): Add. > * sysdeps/unix/sysv/linux/tst-memfd_create.c: New file. > * sysdeps/unix/sysv/linux/**.abilist: Update. > * manual/llio.texi (Memory-mapped I/O): Document memfd_create. Reviewed-by: Adhemerval Zanella > > diff --git a/NEWS b/NEWS > index 1c5da21327..3d453644d9 100644 > --- a/NEWS > +++ b/NEWS > @@ -35,6 +35,9 @@ Major new features: > are the same interfaces added in version 2.26 for some platforms where > this format is supported but is not the format of long double. > > +* glibc now provides the header file and the memfd_create > + system call. > + > Deprecated and removed features, and other changes affecting compatibility: > > * On GNU/Linux, the obsolete Linux constant PTRACE_SEIZE_DEVEL is no longer > diff --git a/manual/llio.texi b/manual/llio.texi > index 7dd4e0680d..9ecb891713 100644 > --- a/manual/llio.texi > +++ b/manual/llio.texi > @@ -1757,6 +1757,69 @@ the given @var{name} previously created by @code{shm_open}. > On failure @code{errno} is set. > @end deftypefn > > +@deftypefun int memfd_create (const char *@var{name}, unsigned int @var{flags}) > +@standards{Linux, sys/mman.h} > +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} > +The @code{memfd_create} function returns a file descriptor which can be > +used to create memory mappings using the @code{mmap} function. It is > +similar to the @code{shm_open} function in the sense that these mappings > +are not backed by actual files. However, the descriptor returned by > +@code{memfd_create} does not correspond to a named object; the > +@var{name} argument is used for informative purposes only. The > +descriptor can be passed between processes (for example, over local > +domain sockets), and mappings at the same offset refer to the same > +memor. The descriptor can also be used to create alias mappings within > +the same process. > + > +The descriptor initially refers to a zero-length file. Before mappings > +can be created which are backed by memory, the file size needs to be > +increased with the @code{ftruncate} function. @xref{File Size}. > + > +The @var{flags} argument can be a combination of the following flags: > + > +@vtable @code > +@item MFD_CLOEXEC > +@standards{Linux, sys/mman.h} > +The descriptor is created with the @code{O_CLOEXEC} flag. > + > +@item MFD_ALLOW_SEALING > +@standards{Linux, sys/mman.h} > +The descriptor supports the addition of seals using the @code{fcntl} > +function. > + > +@item MFD_HUGETLB > +@standards{Linux, sys/mman.h} > +This requests that mappings created using the returned file descriptor > +use a larger page size. See @code{MAP_HUGETLB} above for details. > + > +This flag is incompatible with @code{MFD_ALLOW_SEALING}. > +@end vtable > + > +@code{memfd_create} returns a file descriptor on success, and @math{-1} > +on failure. > + > +The following @code{errno} error conditions are defined for this > +function: > + > +@table @code > +@item EINVAL > +An invalid combination is specified in @var{flags}, or @var{name} is > +too long. > + > +@item EFAULT > +The @var{name} argument does not point to a string. > + > +@item EMFILE > +The operation would exceed the file descriptor limit for this process. > + > +@item ENFILE > +The operation would exceed the system-wide file descriptor limit. > + > +@item ENOMEM > +There is not enough memory for the operation. > +@end table > +@end deftypefun > + > @node Waiting for I/O > @section Waiting for Input or Output > @cindex waiting for input or output > diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile > index c6675b3aa5..c484d2688a 100644 > --- a/sysdeps/unix/sysv/linux/Makefile > +++ b/sysdeps/unix/sysv/linux/Makefile > @@ -44,7 +44,7 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.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 > + test-errno-linux tst-memfd_create > > # Generate the list of SYS_* macros for the system calls (__NR_* > # macros). The file syscall-names.list contains all possible system > diff --git a/sysdeps/unix/sysv/linux/Versions b/sysdeps/unix/sysv/linux/Versions > index d3dbcde8c9..6f2fe516d7 100644 > --- a/sysdeps/unix/sysv/linux/Versions > +++ b/sysdeps/unix/sysv/linux/Versions > @@ -166,6 +166,9 @@ libc { > GLIBC_2.15 { > process_vm_readv; process_vm_writev; > } > + GLIBC_2.27 { > + memfd_create; > + } > GLIBC_PRIVATE { > # functions used in other libraries > __syscall_rt_sigqueueinfo; > diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist > index ed598aedac..140ca28abc 100644 > --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist > @@ -2106,6 +2106,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.27 strfromf128 F > GLIBC_2.27 strtof128 F > GLIBC_2.27 strtof128_l F > diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist > index 4e57f36bcf..f698e1b2f4 100644 > --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist > +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist > @@ -2017,6 +2017,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.27 strfromf128 F > GLIBC_2.27 strtof128 F > GLIBC_2.27 strtof128_l F > diff --git a/sysdeps/unix/sysv/linux/arm/libc.abilist b/sysdeps/unix/sysv/linux/arm/libc.abilist > index 5b70e1bfc9..8a8af3e3e4 100644 > --- a/sysdeps/unix/sysv/linux/arm/libc.abilist > +++ b/sysdeps/unix/sysv/linux/arm/libc.abilist > @@ -107,6 +107,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.4 GLIBC_2.4 A > GLIBC_2.4 _Exit F > GLIBC_2.4 _IO_2_1_stderr_ D 0xa0 > diff --git a/sysdeps/unix/sysv/linux/bits/mman-linux.h b/sysdeps/unix/sysv/linux/bits/mman-linux.h > index 78c07c890a..1ffa5490af 100644 > --- a/sysdeps/unix/sysv/linux/bits/mman-linux.h > +++ b/sysdeps/unix/sysv/linux/bits/mman-linux.h > @@ -111,3 +111,19 @@ > # define MCL_ONFAULT 4 /* Lock all pages that are > faulted in. */ > #endif > + > +#ifdef __USE_GNU > +/* Flags for memfd_create. */ > +# define MFD_CLOEXEC 1U > +# define MFD_ALLOW_SEALING 2U > +# define MFD_HUGETLB 4U > + > +__BEGIN_DECLS > + > +/* Create a new memory file descriptor. NAME is a name for debugging. > + FLAGS is a combination of the MFD_* constants. */ > +int memfd_create (const char *__name, unsigned int __flags) __THROW; > + > +__END_DECLS > + > +#endif /* __USE_GNU */ > diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist > index 6a2500a8b3..5b81a6cd7d 100644 > --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist > +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist > @@ -1871,6 +1871,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.3 GLIBC_2.3 A > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist > index 9ab4e3642a..51ead9e867 100644 > --- a/sysdeps/unix/sysv/linux/i386/libc.abilist > +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist > @@ -2036,6 +2036,7 @@ GLIBC_2.26 wcstof128_l F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.3 GLIBC_2.3 A > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist > index 81bb623fe8..78b4ee8d40 100644 > --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist > @@ -1900,6 +1900,7 @@ GLIBC_2.26 wcstof128_l F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.3 GLIBC_2.3 A > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist > index 5a33b57390..d9c97779e4 100644 > --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist > +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist > @@ -108,6 +108,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.4 GLIBC_2.4 A > GLIBC_2.4 _Exit F > GLIBC_2.4 _IO_2_1_stderr_ D 0x98 > diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist > index 50a86e74fa..4acbf7eeed 100644 > --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist > +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist > @@ -1985,6 +1985,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.3 GLIBC_2.3 A > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > diff --git a/sysdeps/unix/sysv/linux/microblaze/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/libc.abilist > index 250ef305c3..93f02f08ce 100644 > --- a/sysdeps/unix/sysv/linux/microblaze/libc.abilist > +++ b/sysdeps/unix/sysv/linux/microblaze/libc.abilist > @@ -2106,3 +2106,4 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist > index 87a1dc4ad7..795e85de70 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist > @@ -1960,6 +1960,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.3 GLIBC_2.3 A > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist > index f2b35f250e..dc714057b7 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist > @@ -1958,6 +1958,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.3 GLIBC_2.3 A > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist > index ade654dbea..ce7bc9b175 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist > @@ -1956,6 +1956,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.27 strfromf128 F > GLIBC_2.27 strtof128 F > GLIBC_2.27 strtof128_l F > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist > index 56032c3f82..3fdd85eace 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist > @@ -1951,6 +1951,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.27 strfromf128 F > GLIBC_2.27 strtof128 F > GLIBC_2.27 strtof128_l F > diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist > index c599dd9212..3e0bcb2a5c 100644 > --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist > +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist > @@ -2147,3 +2147,4 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist > index 385409aa6e..375c69d9d1 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist > @@ -1989,6 +1989,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.3 GLIBC_2.3 A > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist > index e99cb454b5..a88172a906 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist > @@ -1994,6 +1994,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.3 GLIBC_2.3 A > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist > index 173672ab5e..fa026a332c 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist > @@ -2201,3 +2201,4 @@ GLIBC_2.26 wcstof128_l F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist > index 8a654436ab..838f395d78 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist > @@ -108,6 +108,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.3 GLIBC_2.3 A > GLIBC_2.3 _Exit F > GLIBC_2.3 _IO_2_1_stderr_ D 0xe0 > diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist > index dbd411ceb1..41b79c496a 100644 > --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist > @@ -1989,6 +1989,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.27 strfromf128 F > GLIBC_2.27 strtof128 F > GLIBC_2.27 strtof128_l F > diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist > index 5617784ca0..68251a0e69 100644 > --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist > @@ -1890,6 +1890,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.27 strfromf128 F > GLIBC_2.27 strtof128 F > GLIBC_2.27 strtof128_l F > diff --git a/sysdeps/unix/sysv/linux/sh/libc.abilist b/sysdeps/unix/sysv/linux/sh/libc.abilist > index 0f840e6e88..bc1aae275e 100644 > --- a/sysdeps/unix/sysv/linux/sh/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sh/libc.abilist > @@ -1875,6 +1875,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.3 GLIBC_2.3 A > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist > index bb7e1042c7..93e6d092ac 100644 > --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist > @@ -1982,6 +1982,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.27 strfromf128 F > GLIBC_2.27 strtof128 F > GLIBC_2.27 strtof128_l F > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist > index 4053b0a51c..b11d6764d4 100644 > --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist > @@ -1919,6 +1919,7 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.27 strfromf128 F > GLIBC_2.27 strtof128 F > GLIBC_2.27 strtof128_l F > diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list > index 8bfb080d80..40c4fbb9ea 100644 > --- a/sysdeps/unix/sysv/linux/syscalls.list > +++ b/sysdeps/unix/sysv/linux/syscalls.list > @@ -109,3 +109,4 @@ setns EXTRA setns i:ii setns > > process_vm_readv EXTRA process_vm_readv i:ipipii process_vm_readv > process_vm_writev EXTRA process_vm_writev i:ipipii process_vm_writev > +memfd_create EXTRA memfd_create i:si memfd_create > diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist > index 38a96d3a02..e9eb4ff7bd 100644 > --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist > @@ -2113,3 +2113,4 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist > index 572b917d7d..8f08e909cd 100644 > --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist > @@ -2113,3 +2113,4 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist > index 38a96d3a02..e9eb4ff7bd 100644 > --- a/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist > +++ b/sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist > @@ -2113,3 +2113,4 @@ GLIBC_2.26 reallocarray F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > diff --git a/sysdeps/unix/sysv/linux/tst-memfd_create.c b/sysdeps/unix/sysv/linux/tst-memfd_create.c > new file mode 100644 > index 0000000000..fd173ff71d > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/tst-memfd_create.c > @@ -0,0 +1,121 @@ > +/* Test for the memfd_create system call. > + Copyright (C) 2017 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 > + . */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +/* Return true if the descriptor has the FD_CLOEXEC flag set. */ > +static bool > +is_cloexec (int fd) > +{ > + int flags = fcntl (fd, F_GETFD); > + TEST_VERIFY (flags >= 0); > + return flags & FD_CLOEXEC; > +} > + > +/* Return the seals set on FD. */ > +static int > +get_seals (int fd) > +{ > + int flags = fcntl (fd, F_GET_SEALS); > + TEST_VERIFY (flags >= 0); > + return flags; > +} > + > +/* Return true if the F_SEAL_SEAL flag is set on the descriptor. */ > +static bool > +is_sealed (int fd) > +{ > + return get_seals (fd) & F_SEAL_SEAL; > +} > + > +static int > +do_test (void) > +{ > + /* Initialized by the first call to memfd_create to 0 (memfd_create > + unsupported) or 1 (memfd_create is implemented in the kernel). > + Subsequent iterations check that the success/failure state is > + consistent. */ > + int supported = -1; > + > + for (int do_cloexec = 0; do_cloexec < 2; ++do_cloexec) > + for (int do_sealing = 0; do_sealing < 2; ++do_sealing) > + { > + int flags = 0; > + if (do_cloexec) > + flags |= MFD_CLOEXEC; > + if (do_sealing) > + flags |= MFD_ALLOW_SEALING; > + if (test_verbose > 0) > + printf ("info: memfd_create with flags=0x%x\n", flags); > + int fd = memfd_create ("tst-memfd_create", flags); > + if (fd < 0) > + { > + if (errno == ENOSYS) > + { > + if (supported < 0) > + { > + printf ("warning: memfd_create is unsupported\n"); > + supported = 0; > + continue; > + } > + TEST_VERIFY (supported == 0); > + continue; > + } > + else > + FAIL_EXIT1 ("memfd_create: %m"); > + } > + if (supported < 0) > + supported = 1; > + TEST_VERIFY (supported > 0); > + > + char *fd_path = xasprintf ("/proc/self/fd/%d", fd); > + char *link = xreadlink (fd_path); > + if (test_verbose > 0) > + printf ("info: memfd link: %s\n", link); > + TEST_VERIFY (strcmp (link, "memfd:tst-memfd_create (deleted)")); > + TEST_VERIFY (is_cloexec (fd) == do_cloexec); > + TEST_VERIFY (is_sealed (fd) == !do_sealing); > + if (do_sealing) > + { > + TEST_VERIFY (fcntl (fd, F_ADD_SEALS, F_SEAL_WRITE) == 0); > + TEST_VERIFY (!is_sealed (fd)); > + TEST_VERIFY (get_seals (fd) & F_SEAL_WRITE); > + TEST_VERIFY (fcntl (fd, F_ADD_SEALS, F_SEAL_SEAL) == 0); > + TEST_VERIFY (is_sealed (fd)); > + } > + xclose (fd); > + free (fd_path); > + free (link); > + } > + > + if (supported == 0) > + return EXIT_UNSUPPORTED; > + return 0; > +} > + > +#include > diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist > index b83d25c2e3..0a4f7797ac 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist > @@ -1877,6 +1877,7 @@ GLIBC_2.26 wcstof128_l F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F > GLIBC_2.3 GLIBC_2.3 A > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist > index cba1d59057..23f6a91429 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist > @@ -2120,3 +2120,4 @@ GLIBC_2.26 wcstof128_l F > GLIBC_2.27 GLIBC_2.27 A > GLIBC_2.27 glob F > GLIBC_2.27 glob64 F > +GLIBC_2.27 memfd_create F >