Message ID | 20221201122844.142062-3-tsahu@linux.ibm.com |
---|---|
State | Changes Requested |
Headers | show |
Series | Hugetlb:Migrating the libhugetlbfs tests | expand |
Hello, Tarun Sahu <tsahu@linux.ibm.com> writes: > Migrating the libhugetlbfs/testcases/huge_at_4GB_normal_below.c test > > Test Description: Designed to pick up a bug on ppc64 where > touches_hugepage_high_range() falsely reported true for ranges reaching > below 4GB > > Signed-off-by: Tarun Sahu <tsahu@linux.ibm.com> > --- > runtest/hugetlb | 1 + > testcases/kernel/mem/.gitignore | 1 + > .../kernel/mem/hugetlb/hugemmap/hugemmap13.c | 122 ++++++++++++++++++ > 3 files changed, 124 insertions(+) > create mode 100644 testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c > > diff --git a/runtest/hugetlb b/runtest/hugetlb > index 4c16e1e7c..2029ee4b3 100644 > --- a/runtest/hugetlb > +++ b/runtest/hugetlb > @@ -14,6 +14,7 @@ hugemmap09 hugemmap09 > hugemmap10 hugemmap10 > hugemmap11 hugemmap11 > hugemmap12 hugemmap12 > +hugemmap13 hugemmap13 > hugemmap05_1 hugemmap05 -m > hugemmap05_2 hugemmap05 -s > hugemmap05_3 hugemmap05 -s -m > diff --git a/testcases/kernel/mem/.gitignore b/testcases/kernel/mem/.gitignore > index adea760c7..5955ed613 100644 > --- a/testcases/kernel/mem/.gitignore > +++ b/testcases/kernel/mem/.gitignore > @@ -13,6 +13,7 @@ > /hugetlb/hugemmap/hugemmap10 > /hugetlb/hugemmap/hugemmap11 > /hugetlb/hugemmap/hugemmap12 > +/hugetlb/hugemmap/hugemmap13 > /hugetlb/hugeshmat/hugeshmat01 > /hugetlb/hugeshmat/hugeshmat02 > /hugetlb/hugeshmat/hugeshmat03 > diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c > new file mode 100644 > index 000000000..84a84e074 > --- /dev/null > +++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c > @@ -0,0 +1,122 @@ > +// SPDX-License-Identifier: LGPL-2.1-or-later > +/* > + * Copyright (C) 2005-2006 David Gibson & Adam Litke, IBM Corporation. > + * Author: David Gibson & Adam Litke > + */ > + > +/*\ > + * [Description] > + * > + * Designed to pick up a bug on ppc64 where touches_hugepage_high_range() > + * falsely reported true for ranges reaching below 4GB Hhmm seems like the macro no longer exists. This isn't a great test description. This appers to be the fix for the bug mentioned: https://lkml.org/lkml/2005/11/23/540 Maybe we could add to this that the test creates a hugepage just above the 32bit memory space and a normal page below it. That on old kernels this would trigger a bug caused by an off-by-one error.
Hi Richard, Thanks for reviewing it. On Dec 05 2022, Richard Palethorpe wrote: > Hello, > > Tarun Sahu <tsahu@linux.ibm.com> writes: > > > Migrating the libhugetlbfs/testcases/huge_at_4GB_normal_below.c test > > > > Test Description: Designed to pick up a bug on ppc64 where > > touches_hugepage_high_range() falsely reported true for ranges reaching > > below 4GB > > > > Signed-off-by: Tarun Sahu <tsahu@linux.ibm.com> > > --- > > runtest/hugetlb | 1 + > > testcases/kernel/mem/.gitignore | 1 + > > .../kernel/mem/hugetlb/hugemmap/hugemmap13.c | 122 ++++++++++++++++++ > > 3 files changed, 124 insertions(+) > > create mode 100644 testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c > > > > diff --git a/runtest/hugetlb b/runtest/hugetlb > > index 4c16e1e7c..2029ee4b3 100644 > > --- a/runtest/hugetlb > > +++ b/runtest/hugetlb > > @@ -14,6 +14,7 @@ hugemmap09 hugemmap09 > > hugemmap10 hugemmap10 > > hugemmap11 hugemmap11 > > hugemmap12 hugemmap12 > > +hugemmap13 hugemmap13 > > hugemmap05_1 hugemmap05 -m > > hugemmap05_2 hugemmap05 -s > > hugemmap05_3 hugemmap05 -s -m > > diff --git a/testcases/kernel/mem/.gitignore b/testcases/kernel/mem/.gitignore > > index adea760c7..5955ed613 100644 > > --- a/testcases/kernel/mem/.gitignore > > +++ b/testcases/kernel/mem/.gitignore > > @@ -13,6 +13,7 @@ > > /hugetlb/hugemmap/hugemmap10 > > /hugetlb/hugemmap/hugemmap11 > > /hugetlb/hugemmap/hugemmap12 > > +/hugetlb/hugemmap/hugemmap13 > > /hugetlb/hugeshmat/hugeshmat01 > > /hugetlb/hugeshmat/hugeshmat02 > > /hugetlb/hugeshmat/hugeshmat03 > > diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c > > new file mode 100644 > > index 000000000..84a84e074 > > --- /dev/null > > +++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c > > @@ -0,0 +1,122 @@ > > +// SPDX-License-Identifier: LGPL-2.1-or-later > > +/* > > + * Copyright (C) 2005-2006 David Gibson & Adam Litke, IBM Corporation. > > + * Author: David Gibson & Adam Litke > > + */ > > + > > +/*\ > > + * [Description] > > + * > > + * Designed to pick up a bug on ppc64 where touches_hugepage_high_range() > > + * falsely reported true for ranges reaching below 4GB > > Hhmm seems like the macro no longer exists. This isn't a great test > description. > > This appers to be the fix for the bug mentioned: > https://lkml.org/lkml/2005/11/23/540 > > Maybe we could add to this that the test creates a hugepage just above > the 32bit memory space and a normal page below it. That on old kernels > this would trigger a bug caused by an off-by-one error. > Yeah Agree, Will update it in v2. > -- > Thank you, > Richard. > > -- > Mailing list info: https://lists.linux.it/listinfo/ltp
diff --git a/runtest/hugetlb b/runtest/hugetlb index 4c16e1e7c..2029ee4b3 100644 --- a/runtest/hugetlb +++ b/runtest/hugetlb @@ -14,6 +14,7 @@ hugemmap09 hugemmap09 hugemmap10 hugemmap10 hugemmap11 hugemmap11 hugemmap12 hugemmap12 +hugemmap13 hugemmap13 hugemmap05_1 hugemmap05 -m hugemmap05_2 hugemmap05 -s hugemmap05_3 hugemmap05 -s -m diff --git a/testcases/kernel/mem/.gitignore b/testcases/kernel/mem/.gitignore index adea760c7..5955ed613 100644 --- a/testcases/kernel/mem/.gitignore +++ b/testcases/kernel/mem/.gitignore @@ -13,6 +13,7 @@ /hugetlb/hugemmap/hugemmap10 /hugetlb/hugemmap/hugemmap11 /hugetlb/hugemmap/hugemmap12 +/hugetlb/hugemmap/hugemmap13 /hugetlb/hugeshmat/hugeshmat01 /hugetlb/hugeshmat/hugeshmat02 /hugetlb/hugeshmat/hugeshmat03 diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c new file mode 100644 index 000000000..84a84e074 --- /dev/null +++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/* + * Copyright (C) 2005-2006 David Gibson & Adam Litke, IBM Corporation. + * Author: David Gibson & Adam Litke + */ + +/*\ + * [Description] + * + * Designed to pick up a bug on ppc64 where touches_hugepage_high_range() + * falsely reported true for ranges reaching below 4GB + * + * WARNING: The offsets and addresses used within are specifically + * calculated to trigger the bug as it existed. Don't mess with them + * unless you *really* know what you're doing. + */ + +#define _GNU_SOURCE +#include <stdio.h> +#include <sys/mount.h> +#include <limits.h> +#include <sys/param.h> +#include <sys/types.h> + +#include "hugetlb.h" + +#define FOURGB (1UL << 32) +#define MNTPOINT "hugetlbfs/" +static int fd = -1; +static unsigned long hpage_size; +static int page_size; + +static void run_test(void) +{ + void *p, *q = NULL; + unsigned long lowaddr; + unsigned long below_start; + unsigned long above_end; + + p = mmap((void *)FOURGB, hpage_size, PROT_READ|PROT_WRITE, + MAP_SHARED | MAP_FIXED, fd, 0); + if (p == MAP_FAILED) { + /* slice 0 (high) spans from 4G-1T */ + below_start = FOURGB; + above_end = 1024L*1024*1024*1024; + + if (range_is_mapped(below_start, above_end) == 1) { + tst_res(TINFO|TERRNO, "region 4G-IT is not free & " + "mmap() failed expected"); + tst_res(TPASS, "Successful but inconclusive"); + } else + tst_res(TFAIL|TERRNO, "mmap() huge failed unexpected"); + goto cleanup; + } + if (p != (void *)FOURGB) { + tst_res(TFAIL, "Wrong address with MAP_FIXED huge"); + goto cleanup; + } + + tst_res(TINFO, "Mapped hugetlb at %p", p); + + memset(p, 0, hpage_size); + + /* Test just below 4GB to check for off-by-one errors */ + lowaddr = FOURGB - page_size; + q = mmap((void *)lowaddr, page_size, PROT_READ|PROT_WRITE, + MAP_SHARED|MAP_FIXED|MAP_ANONYMOUS, 0, 0); + if (q == MAP_FAILED) { + below_start = FOURGB - page_size; + above_end = FOURGB; + + if (range_is_mapped(below_start, above_end) == 1) { + tst_res(TINFO|TERRNO, "region (4G-page)-4G is not free & " + "mmap() failed expected"); + tst_res(TPASS, "Successful but inconclusive"); + } else + tst_res(TFAIL|TERRNO, "mmap() normal failed unexpected"); + goto cleanup; + } + if (q != (void *)lowaddr) { + tst_res(TFAIL, "Wrong address with MAP_FIXED normal"); + goto cleanup; + } + + memset(q, 0, page_size); + tst_res(TPASS, "Successful"); + +cleanup: + if (p && p != MAP_FAILED) + SAFE_MUNMAP(p, hpage_size); + if (q && q != MAP_FAILED) + SAFE_MUNMAP(q, page_size); +} + +static void setup(void) +{ + page_size = getpagesize(); + hpage_size = SAFE_READ_MEMINFO("Hugepagesize:")*1024; + + if (sizeof(void *) <= 4) + tst_brk(TCONF, "Machine must be >32 bit"); + if (hpage_size > FOURGB) + tst_brk(TCONF, "Huge page size is too large"); + fd = tst_creat_unlinked(MNTPOINT, 0); +} + +static void cleanup(void) +{ + if (fd > 0) + SAFE_CLOSE(fd); +} + +static struct tst_test test = { + .needs_root = 1, + .mntpoint = MNTPOINT, + .needs_hugetlbfs = 1, + .needs_tmpdir = 1, + .setup = setup, + .cleanup = cleanup, + .test_all = run_test, + .hugepages = {2, TST_NEEDS}, +};
Migrating the libhugetlbfs/testcases/huge_at_4GB_normal_below.c test Test Description: Designed to pick up a bug on ppc64 where touches_hugepage_high_range() falsely reported true for ranges reaching below 4GB Signed-off-by: Tarun Sahu <tsahu@linux.ibm.com> --- runtest/hugetlb | 1 + testcases/kernel/mem/.gitignore | 1 + .../kernel/mem/hugetlb/hugemmap/hugemmap13.c | 122 ++++++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c