Message ID | 74b7baf4b2b0ff4264b87dac0850eb8ef6aa04ee.1651518694.git.fweimer@redhat.com |
---|---|
State | New |
Headers | show |
Series | Linux: Fall back to mmap if early sbrk fails | expand |
* Florian Weimer via Libc-alpha: > Unlike MMAP_CALL, this avoids a TCB dependency for an errno update > on failure. > > <mmap_internal.h> cannot be included as is on several architectures > due to the definition of page_unit, so introduce a separate header > file for the definition of MMAP_CALL and MMAP_CALL_INTERNAL, > <mmap_call.h>. > --- > sysdeps/unix/sysv/linux/mmap_call.h | 22 +++++++++++++++++++ > sysdeps/unix/sysv/linux/mmap_internal.h | 6 +---- > .../s390/{mmap_internal.h => mmap_call.h} | 14 ++++++------ > 3 files changed, 30 insertions(+), 12 deletions(-) > create mode 100644 sysdeps/unix/sysv/linux/mmap_call.h > rename sysdeps/unix/sysv/linux/s390/{mmap_internal.h => mmap_call.h} (78%) > > diff --git a/sysdeps/unix/sysv/linux/mmap_call.h b/sysdeps/unix/sysv/linux/mmap_call.h > new file mode 100644 > index 0000000000..3547c99e14 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/mmap_call.h > @@ -0,0 +1,22 @@ > +/* Generic definition of MMAP_CALL and MMAP_CALL_INTERNAL. > + Copyright (C) 2017-2022 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 > + <https://www.gnu.org/licenses/>. */ > + > +#define MMAP_CALL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ > + INLINE_SYSCALL_CALL (__nr, __addr, __len, __prot, __flags, __fd, __offset) > +#define MMAP_CALL_INTERNAL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ > + INTERNAL_SYSCALL_CALL (__nr, __addr, __len, __prot, __flags, __fd, __offset) > diff --git a/sysdeps/unix/sysv/linux/mmap_internal.h b/sysdeps/unix/sysv/linux/mmap_internal.h > index 841b731391..aebf97d064 100644 > --- a/sysdeps/unix/sysv/linux/mmap_internal.h > +++ b/sysdeps/unix/sysv/linux/mmap_internal.h > @@ -42,10 +42,6 @@ static uint64_t page_unit; > /* Do not accept offset not multiple of page size. */ > #define MMAP_OFF_LOW_MASK (MMAP2_PAGE_UNIT - 1) > > -/* An architecture may override this. */ > -#ifndef MMAP_CALL > -# define MMAP_CALL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ > - INLINE_SYSCALL_CALL (__nr, __addr, __len, __prot, __flags, __fd, __offset) > -#endif > +#include <mmap_call.h> > > #endif /* MMAP_INTERNAL_LINUX_H */ > diff --git a/sysdeps/unix/sysv/linux/s390/mmap_internal.h b/sysdeps/unix/sysv/linux/s390/mmap_call.h > similarity index 78% > rename from sysdeps/unix/sysv/linux/s390/mmap_internal.h > rename to sysdeps/unix/sysv/linux/s390/mmap_call.h > index cc76ac9735..f169b8bab9 100644 > --- a/sysdeps/unix/sysv/linux/s390/mmap_internal.h > +++ b/sysdeps/unix/sysv/linux/s390/mmap_call.h > @@ -16,9 +16,6 @@ > License along with the GNU C Library; if not, see > <https://www.gnu.org/licenses/>. */ > > -#ifndef MMAP_S390_INTERNAL_H > -# define MMAP_S390_INTERNAL_H > - > #define MMAP_CALL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ > ({ \ > long int __args[6] = { (long int) (__addr), (long int) (__len), \ > @@ -26,7 +23,10 @@ > (long int) (__fd), (long int) (__offset) }; \ > INLINE_SYSCALL_CALL (__nr, __args); \ > }) > - > -#include_next <mmap_internal.h> > - > -#endif > +#define MMAP_CALL_INTERNAL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ > + ({ \ > + long int __args[6] = { (long int) (__addr), (long int) (__len), \ > + (long int) (__prot), (long int) (__flags), \ > + (long int) (__fd), (long int) (__offset) }; \ > + INTERNAL_SYSCALL_CALL (__nr, __args); \ > + }) Stefan, would you be able to review this patch? It's mostly an S390 change, after all. Thanks, Florian
On 03/05/2022 20:30, Florian Weimer wrote: > * Florian Weimer via Libc-alpha: > >> Unlike MMAP_CALL, this avoids a TCB dependency for an errno update >> on failure. >> >> <mmap_internal.h> cannot be included as is on several architectures >> due to the definition of page_unit, so introduce a separate header >> file for the definition of MMAP_CALL and MMAP_CALL_INTERNAL, >> <mmap_call.h>. >> --- >> sysdeps/unix/sysv/linux/mmap_call.h | 22 +++++++++++++++++++ >> sysdeps/unix/sysv/linux/mmap_internal.h | 6 +---- >> .../s390/{mmap_internal.h => mmap_call.h} | 14 ++++++------ >> 3 files changed, 30 insertions(+), 12 deletions(-) >> create mode 100644 sysdeps/unix/sysv/linux/mmap_call.h >> rename sysdeps/unix/sysv/linux/s390/{mmap_internal.h => mmap_call.h} (78%) >> >> diff --git a/sysdeps/unix/sysv/linux/mmap_call.h b/sysdeps/unix/sysv/linux/mmap_call.h >> new file mode 100644 >> index 0000000000..3547c99e14 >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/mmap_call.h >> @@ -0,0 +1,22 @@ >> +/* Generic definition of MMAP_CALL and MMAP_CALL_INTERNAL. >> + Copyright (C) 2017-2022 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 >> + <https://www.gnu.org/licenses/>. */ >> + >> +#define MMAP_CALL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ >> + INLINE_SYSCALL_CALL (__nr, __addr, __len, __prot, __flags, __fd, __offset) >> +#define MMAP_CALL_INTERNAL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ >> + INTERNAL_SYSCALL_CALL (__nr, __addr, __len, __prot, __flags, __fd, __offset) >> diff --git a/sysdeps/unix/sysv/linux/mmap_internal.h b/sysdeps/unix/sysv/linux/mmap_internal.h >> index 841b731391..aebf97d064 100644 >> --- a/sysdeps/unix/sysv/linux/mmap_internal.h >> +++ b/sysdeps/unix/sysv/linux/mmap_internal.h >> @@ -42,10 +42,6 @@ static uint64_t page_unit; >> /* Do not accept offset not multiple of page size. */ >> #define MMAP_OFF_LOW_MASK (MMAP2_PAGE_UNIT - 1) >> >> -/* An architecture may override this. */ >> -#ifndef MMAP_CALL >> -# define MMAP_CALL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ >> - INLINE_SYSCALL_CALL (__nr, __addr, __len, __prot, __flags, __fd, __offset) >> -#endif >> +#include <mmap_call.h> >> >> #endif /* MMAP_INTERNAL_LINUX_H */ >> diff --git a/sysdeps/unix/sysv/linux/s390/mmap_internal.h b/sysdeps/unix/sysv/linux/s390/mmap_call.h >> similarity index 78% >> rename from sysdeps/unix/sysv/linux/s390/mmap_internal.h >> rename to sysdeps/unix/sysv/linux/s390/mmap_call.h >> index cc76ac9735..f169b8bab9 100644 >> --- a/sysdeps/unix/sysv/linux/s390/mmap_internal.h >> +++ b/sysdeps/unix/sysv/linux/s390/mmap_call.h >> @@ -16,9 +16,6 @@ >> License along with the GNU C Library; if not, see >> <https://www.gnu.org/licenses/>. */ >> >> -#ifndef MMAP_S390_INTERNAL_H >> -# define MMAP_S390_INTERNAL_H >> - >> #define MMAP_CALL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ >> ({ \ >> long int __args[6] = { (long int) (__addr), (long int) (__len), \ >> @@ -26,7 +23,10 @@ >> (long int) (__fd), (long int) (__offset) }; \ >> INLINE_SYSCALL_CALL (__nr, __args); \ >> }) >> - >> -#include_next <mmap_internal.h> >> - >> -#endif >> +#define MMAP_CALL_INTERNAL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ >> + ({ \ >> + long int __args[6] = { (long int) (__addr), (long int) (__len), \ >> + (long int) (__prot), (long int) (__flags), \ >> + (long int) (__fd), (long int) (__offset) }; \ >> + INTERNAL_SYSCALL_CALL (__nr, __args); \ >> + }) > > Stefan, would you be able to review this patch? It's mostly an S390 > change, after all. > > Thanks, > Florian > Sure. The patch looks good to me. Moving the definition of MMAP_CALL is just a mechanical change. The definition of MMAP_CALL_INTERNAL is similar and no other architecture than s390x has its own definition of MMAP_CALL. Thanks. Reviewed-by: Stefan Liebler <stli@linux.ibm.com>
diff --git a/sysdeps/unix/sysv/linux/mmap_call.h b/sysdeps/unix/sysv/linux/mmap_call.h new file mode 100644 index 0000000000..3547c99e14 --- /dev/null +++ b/sysdeps/unix/sysv/linux/mmap_call.h @@ -0,0 +1,22 @@ +/* Generic definition of MMAP_CALL and MMAP_CALL_INTERNAL. + Copyright (C) 2017-2022 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 + <https://www.gnu.org/licenses/>. */ + +#define MMAP_CALL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ + INLINE_SYSCALL_CALL (__nr, __addr, __len, __prot, __flags, __fd, __offset) +#define MMAP_CALL_INTERNAL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ + INTERNAL_SYSCALL_CALL (__nr, __addr, __len, __prot, __flags, __fd, __offset) diff --git a/sysdeps/unix/sysv/linux/mmap_internal.h b/sysdeps/unix/sysv/linux/mmap_internal.h index 841b731391..aebf97d064 100644 --- a/sysdeps/unix/sysv/linux/mmap_internal.h +++ b/sysdeps/unix/sysv/linux/mmap_internal.h @@ -42,10 +42,6 @@ static uint64_t page_unit; /* Do not accept offset not multiple of page size. */ #define MMAP_OFF_LOW_MASK (MMAP2_PAGE_UNIT - 1) -/* An architecture may override this. */ -#ifndef MMAP_CALL -# define MMAP_CALL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ - INLINE_SYSCALL_CALL (__nr, __addr, __len, __prot, __flags, __fd, __offset) -#endif +#include <mmap_call.h> #endif /* MMAP_INTERNAL_LINUX_H */ diff --git a/sysdeps/unix/sysv/linux/s390/mmap_internal.h b/sysdeps/unix/sysv/linux/s390/mmap_call.h similarity index 78% rename from sysdeps/unix/sysv/linux/s390/mmap_internal.h rename to sysdeps/unix/sysv/linux/s390/mmap_call.h index cc76ac9735..f169b8bab9 100644 --- a/sysdeps/unix/sysv/linux/s390/mmap_internal.h +++ b/sysdeps/unix/sysv/linux/s390/mmap_call.h @@ -16,9 +16,6 @@ License along with the GNU C Library; if not, see <https://www.gnu.org/licenses/>. */ -#ifndef MMAP_S390_INTERNAL_H -# define MMAP_S390_INTERNAL_H - #define MMAP_CALL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ ({ \ long int __args[6] = { (long int) (__addr), (long int) (__len), \ @@ -26,7 +23,10 @@ (long int) (__fd), (long int) (__offset) }; \ INLINE_SYSCALL_CALL (__nr, __args); \ }) - -#include_next <mmap_internal.h> - -#endif +#define MMAP_CALL_INTERNAL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ + ({ \ + long int __args[6] = { (long int) (__addr), (long int) (__len), \ + (long int) (__prot), (long int) (__flags), \ + (long int) (__fd), (long int) (__offset) }; \ + INTERNAL_SYSCALL_CALL (__nr, __args); \ + })