Message ID | 1502029826-29081-1-git-send-email-adhemerval.zanella@linaro.org |
---|---|
State | Accepted |
Commit | 1f14d0c3ddce47f7021bbc0862fdb207891345dc |
Headers | show |
Ping. On 06/08/2017 11:30, Adhemerval Zanella wrote: > Default semantic for mmap2 syscall is to take the offset in 4096-byte > units. However m68k and ia64 mmap2 implementation take in the > configured pagesize units and for both architecture it can be > different values based on how kernel was built. > > This patch fixes the m68k runtime discover of mmap2 offset unit > and adds the ia64 definition to find it at runtime. > > Checked the basic tst-mmap and tst-mmap-offset on m68k (the system > is configured with 4k, so current code is already passing on this > system) and a sanity check on x86_64-linux-gnu (which should not be > affected by this change). Sergei also states that ia64 loader now > work correctly with this change. > > Adhemerval Zanella <adhemerval.zanella@linaro.org> > Sergei Trofimovich <slyfox@inbox.ru> > > * sysdeps/unix/sysv/linux/m68k/mmap_internal.h (MMAP2_PAGE_SHIFT): > Rename to MMAP2_PAGE_UNIT. > * sysdeps/unix/sysv/linux/mmap.c: Include mmap_internal iff > __OFF_T_MATCHES_OFF64_T is not defined. > * sysdeps/unix/sysv/linux/mmap_internal.h (page_unit): Declare as > uint64_t. > (MMAP2_PAGE_UNIT) [MMAP2_PAGE_UNIT == -1]: Redefine to page_unit. > (page_unit) [MMAP2_PAGE_UNIT != -1]: Remove definition. > --- > ChangeLog | 12 ++++++++++++ > sysdeps/unix/sysv/linux/ia64/mmap_internal.h | 29 ++++++++++++++++++++++++++++ > sysdeps/unix/sysv/linux/m68k/mmap_internal.h | 2 +- > sysdeps/unix/sysv/linux/mmap.c | 2 +- > sysdeps/unix/sysv/linux/mmap_internal.h | 6 +++--- > 5 files changed, 46 insertions(+), 5 deletions(-) > create mode 100644 sysdeps/unix/sysv/linux/ia64/mmap_internal.h > > diff --git a/sysdeps/unix/sysv/linux/ia64/mmap_internal.h b/sysdeps/unix/sysv/linux/ia64/mmap_internal.h > new file mode 100644 > index 0000000..dbaaa3f > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/ia64/mmap_internal.h > @@ -0,0 +1,29 @@ > +/* Common mmap definition for Linux implementation. Linux/ia64 version. > + 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 > + <http://www.gnu.org/licenses/>. */ > + > +#ifndef MMAP_IA64_INTERNAL_LINUX_H > +#define MMAP_IA64_INTERNAL_LINUX_H > + > +/* Linux allows PAGE_SHIFT in range of [12-16] and expect > + mmap2 offset to be provided in based on the configured pagesize. > + Determine the shift dynamically with getpagesize. */ > +#define MMAP2_PAGE_UNIT -1 > + > +#include_next <mmap_internal.h> > + > +#endif > diff --git a/sysdeps/unix/sysv/linux/m68k/mmap_internal.h b/sysdeps/unix/sysv/linux/m68k/mmap_internal.h > index bd8bd38..9fe9d91 100644 > --- a/sysdeps/unix/sysv/linux/m68k/mmap_internal.h > +++ b/sysdeps/unix/sysv/linux/m68k/mmap_internal.h > @@ -22,7 +22,7 @@ > /* ColdFire and Sun 3 kernels have PAGE_SHIFT set to 13 and expect > mmap2 offset to be provided in 8K pages. Determine the shift > dynamically with getpagesize. */ > -#define MMAP2_PAGE_SHIFT -1 > +#define MMAP2_PAGE_UNIT -1 > > #include_next <mmap_internal.h> > > diff --git a/sysdeps/unix/sysv/linux/mmap.c b/sysdeps/unix/sysv/linux/mmap.c > index 98c2f88..59292b6 100644 > --- a/sysdeps/unix/sysv/linux/mmap.c > +++ b/sysdeps/unix/sysv/linux/mmap.c > @@ -21,9 +21,9 @@ > #include <sys/mman.h> > #include <sysdep.h> > #include <stdint.h> > -#include <mmap_internal.h> > > #ifndef __OFF_T_MATCHES_OFF64_T > +# include <mmap_internal.h> > > /* An architecture may override this. */ > # ifndef MMAP_ADJUST_OFFSET > diff --git a/sysdeps/unix/sysv/linux/mmap_internal.h b/sysdeps/unix/sysv/linux/mmap_internal.h > index 499e389..47c0991 100644 > --- a/sysdeps/unix/sysv/linux/mmap_internal.h > +++ b/sysdeps/unix/sysv/linux/mmap_internal.h > @@ -27,13 +27,13 @@ > #endif > > #if MMAP2_PAGE_UNIT == -1 > -static int page_unit; > - > +static uint64_t page_unit; > # define MMAP_CHECK_PAGE_UNIT() \ > if (page_unit == 0) \ > page_unit = __getpagesize (); > +# undef MMAP2_PAGE_UNIT > +# define MMAP2_PAGE_UNIT page_unit > #else > -# define page_unit MMAP2_PAGE_UNIT > # define MMAP_CHECK_PAGE_UNIT() > #endif > >
I will commit this shortly if no one opposes it. On 11/08/2017 16:22, Adhemerval Zanella wrote: > Ping. > > On 06/08/2017 11:30, Adhemerval Zanella wrote: >> Default semantic for mmap2 syscall is to take the offset in 4096-byte >> units. However m68k and ia64 mmap2 implementation take in the >> configured pagesize units and for both architecture it can be >> different values based on how kernel was built. >> >> This patch fixes the m68k runtime discover of mmap2 offset unit >> and adds the ia64 definition to find it at runtime. >> >> Checked the basic tst-mmap and tst-mmap-offset on m68k (the system >> is configured with 4k, so current code is already passing on this >> system) and a sanity check on x86_64-linux-gnu (which should not be >> affected by this change). Sergei also states that ia64 loader now >> work correctly with this change. >> >> Adhemerval Zanella <adhemerval.zanella@linaro.org> >> Sergei Trofimovich <slyfox@inbox.ru> >> >> * sysdeps/unix/sysv/linux/m68k/mmap_internal.h (MMAP2_PAGE_SHIFT): >> Rename to MMAP2_PAGE_UNIT. >> * sysdeps/unix/sysv/linux/mmap.c: Include mmap_internal iff >> __OFF_T_MATCHES_OFF64_T is not defined. >> * sysdeps/unix/sysv/linux/mmap_internal.h (page_unit): Declare as >> uint64_t. >> (MMAP2_PAGE_UNIT) [MMAP2_PAGE_UNIT == -1]: Redefine to page_unit. >> (page_unit) [MMAP2_PAGE_UNIT != -1]: Remove definition. >> --- >> ChangeLog | 12 ++++++++++++ >> sysdeps/unix/sysv/linux/ia64/mmap_internal.h | 29 ++++++++++++++++++++++++++++ >> sysdeps/unix/sysv/linux/m68k/mmap_internal.h | 2 +- >> sysdeps/unix/sysv/linux/mmap.c | 2 +- >> sysdeps/unix/sysv/linux/mmap_internal.h | 6 +++--- >> 5 files changed, 46 insertions(+), 5 deletions(-) >> create mode 100644 sysdeps/unix/sysv/linux/ia64/mmap_internal.h >> >> diff --git a/sysdeps/unix/sysv/linux/ia64/mmap_internal.h b/sysdeps/unix/sysv/linux/ia64/mmap_internal.h >> new file mode 100644 >> index 0000000..dbaaa3f >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/ia64/mmap_internal.h >> @@ -0,0 +1,29 @@ >> +/* Common mmap definition for Linux implementation. Linux/ia64 version. >> + 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 >> + <http://www.gnu.org/licenses/>. */ >> + >> +#ifndef MMAP_IA64_INTERNAL_LINUX_H >> +#define MMAP_IA64_INTERNAL_LINUX_H >> + >> +/* Linux allows PAGE_SHIFT in range of [12-16] and expect >> + mmap2 offset to be provided in based on the configured pagesize. >> + Determine the shift dynamically with getpagesize. */ >> +#define MMAP2_PAGE_UNIT -1 >> + >> +#include_next <mmap_internal.h> >> + >> +#endif >> diff --git a/sysdeps/unix/sysv/linux/m68k/mmap_internal.h b/sysdeps/unix/sysv/linux/m68k/mmap_internal.h >> index bd8bd38..9fe9d91 100644 >> --- a/sysdeps/unix/sysv/linux/m68k/mmap_internal.h >> +++ b/sysdeps/unix/sysv/linux/m68k/mmap_internal.h >> @@ -22,7 +22,7 @@ >> /* ColdFire and Sun 3 kernels have PAGE_SHIFT set to 13 and expect >> mmap2 offset to be provided in 8K pages. Determine the shift >> dynamically with getpagesize. */ >> -#define MMAP2_PAGE_SHIFT -1 >> +#define MMAP2_PAGE_UNIT -1 >> >> #include_next <mmap_internal.h> >> >> diff --git a/sysdeps/unix/sysv/linux/mmap.c b/sysdeps/unix/sysv/linux/mmap.c >> index 98c2f88..59292b6 100644 >> --- a/sysdeps/unix/sysv/linux/mmap.c >> +++ b/sysdeps/unix/sysv/linux/mmap.c >> @@ -21,9 +21,9 @@ >> #include <sys/mman.h> >> #include <sysdep.h> >> #include <stdint.h> >> -#include <mmap_internal.h> >> >> #ifndef __OFF_T_MATCHES_OFF64_T >> +# include <mmap_internal.h> >> >> /* An architecture may override this. */ >> # ifndef MMAP_ADJUST_OFFSET >> diff --git a/sysdeps/unix/sysv/linux/mmap_internal.h b/sysdeps/unix/sysv/linux/mmap_internal.h >> index 499e389..47c0991 100644 >> --- a/sysdeps/unix/sysv/linux/mmap_internal.h >> +++ b/sysdeps/unix/sysv/linux/mmap_internal.h >> @@ -27,13 +27,13 @@ >> #endif >> >> #if MMAP2_PAGE_UNIT == -1 >> -static int page_unit; >> - >> +static uint64_t page_unit; >> # define MMAP_CHECK_PAGE_UNIT() \ >> if (page_unit == 0) \ >> page_unit = __getpagesize (); >> +# undef MMAP2_PAGE_UNIT >> +# define MMAP2_PAGE_UNIT page_unit >> #else >> -# define page_unit MMAP2_PAGE_UNIT >> # define MMAP_CHECK_PAGE_UNIT() >> #endif >> >>
diff --git a/sysdeps/unix/sysv/linux/ia64/mmap_internal.h b/sysdeps/unix/sysv/linux/ia64/mmap_internal.h new file mode 100644 index 0000000..dbaaa3f --- /dev/null +++ b/sysdeps/unix/sysv/linux/ia64/mmap_internal.h @@ -0,0 +1,29 @@ +/* Common mmap definition for Linux implementation. Linux/ia64 version. + 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef MMAP_IA64_INTERNAL_LINUX_H +#define MMAP_IA64_INTERNAL_LINUX_H + +/* Linux allows PAGE_SHIFT in range of [12-16] and expect + mmap2 offset to be provided in based on the configured pagesize. + Determine the shift dynamically with getpagesize. */ +#define MMAP2_PAGE_UNIT -1 + +#include_next <mmap_internal.h> + +#endif diff --git a/sysdeps/unix/sysv/linux/m68k/mmap_internal.h b/sysdeps/unix/sysv/linux/m68k/mmap_internal.h index bd8bd38..9fe9d91 100644 --- a/sysdeps/unix/sysv/linux/m68k/mmap_internal.h +++ b/sysdeps/unix/sysv/linux/m68k/mmap_internal.h @@ -22,7 +22,7 @@ /* ColdFire and Sun 3 kernels have PAGE_SHIFT set to 13 and expect mmap2 offset to be provided in 8K pages. Determine the shift dynamically with getpagesize. */ -#define MMAP2_PAGE_SHIFT -1 +#define MMAP2_PAGE_UNIT -1 #include_next <mmap_internal.h> diff --git a/sysdeps/unix/sysv/linux/mmap.c b/sysdeps/unix/sysv/linux/mmap.c index 98c2f88..59292b6 100644 --- a/sysdeps/unix/sysv/linux/mmap.c +++ b/sysdeps/unix/sysv/linux/mmap.c @@ -21,9 +21,9 @@ #include <sys/mman.h> #include <sysdep.h> #include <stdint.h> -#include <mmap_internal.h> #ifndef __OFF_T_MATCHES_OFF64_T +# include <mmap_internal.h> /* An architecture may override this. */ # ifndef MMAP_ADJUST_OFFSET diff --git a/sysdeps/unix/sysv/linux/mmap_internal.h b/sysdeps/unix/sysv/linux/mmap_internal.h index 499e389..47c0991 100644 --- a/sysdeps/unix/sysv/linux/mmap_internal.h +++ b/sysdeps/unix/sysv/linux/mmap_internal.h @@ -27,13 +27,13 @@ #endif #if MMAP2_PAGE_UNIT == -1 -static int page_unit; - +static uint64_t page_unit; # define MMAP_CHECK_PAGE_UNIT() \ if (page_unit == 0) \ page_unit = __getpagesize (); +# undef MMAP2_PAGE_UNIT +# define MMAP2_PAGE_UNIT page_unit #else -# define page_unit MMAP2_PAGE_UNIT # define MMAP_CHECK_PAGE_UNIT() #endif