Message ID | 20221013134728.49609-3-zhaogongyi@huawei.com |
---|---|
State | Changes Requested |
Headers | show |
Series | [v4,1/4] syscalls/madvise04: new test for madvise(MADV_DONTNEED) | expand |
Hello, Zhao Gongyi via ltp <ltp@lists.linux.it> writes: > Check that madvise(2) MADV_DONTNEED operation applied to Huge > TLB pages successfully after kernel version 5.18, and will result > in zero-fill-on-demand pages for anonymous private mappings. > > Signed-off-by: Zhao Gongyi <zhaogongyi@huawei.com> > --- > runtest/syscalls | 1 + > testcases/kernel/syscalls/madvise/.gitignore | 1 + > testcases/kernel/syscalls/madvise/madvise04.c | 62 +++++++++++++++++++ > 3 files changed, 64 insertions(+) > create mode 100644 testcases/kernel/syscalls/madvise/madvise04.c > > diff --git a/runtest/syscalls b/runtest/syscalls > index c81764df4..eb1910cec 100644 > --- a/runtest/syscalls > +++ b/runtest/syscalls > @@ -941,6 +941,7 @@ mincore04 mincore04 > madvise01 madvise01 > madvise02 madvise02 > madvise03 madvise03 > +madvise04 madvise04 > madvise05 madvise05 > madvise06 madvise06 > madvise07 madvise07 > diff --git a/testcases/kernel/syscalls/madvise/.gitignore b/testcases/kernel/syscalls/madvise/.gitignore > index f4bfdfefe..db8ce47c1 100644 > --- a/testcases/kernel/syscalls/madvise/.gitignore > +++ b/testcases/kernel/syscalls/madvise/.gitignore > @@ -1,6 +1,7 @@ > /madvise01 > /madvise02 > /madvise03 > +/madvise04 > /madvise05 > /madvise06 > /madvise07 > diff --git a/testcases/kernel/syscalls/madvise/madvise04.c b/testcases/kernel/syscalls/madvise/madvise04.c > new file mode 100644 > index 000000000..a970fb33e > --- /dev/null > +++ b/testcases/kernel/syscalls/madvise/madvise04.c > @@ -0,0 +1,62 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. > + * Author: Zhao Gongyi <zhaogongyi@huawei.com> > + */ > + > +/*\ > + * [Description] > + * > + * Check that madvise(2) MADV_DONTNEED operation applied to Huge TLB pages > + * successfully after kernel version 5.18, and will result in > + * zero-fill-on-demand pages for anonymous private mappings. > + */ > + > +#include "tst_test.h" > + > +#define MAP_SIZE (8 * 1024) > + > +static char *addr; > +static int mapsz; > + > +static void run(void) > +{ > + TST_EXP_PASS(madvise(addr, mapsz, MADV_DONTNEED)); > + for (int i = 0; i < mapsz; i++) { > + if (addr[i]) { > + tst_res(TFAIL, > + "There are no zero-fill-on-demand pages " > + "for anonymous private mappings"); > + return; > + } > + } > + > + tst_res(TPASS, "There are zero-fill-on-demand pages " > + "for anonymous private mappings"); > +} > + > +static void setup(void) > +{ > + mapsz = tst_get_hugepage_size(); > + addr = SAFE_MMAP(NULL, mapsz, > + PROT_READ | PROT_WRITE, > + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, > + -1, 0); > + memset(addr, 1, mapsz); If we only do memset here then we are only testing the zero-fill feature on the first iteration. > +} > + > +static void cleanup(void) > +{ > + if (addr) > + SAFE_MUNMAP(addr, mapsz); > +} > + > +static struct tst_test test = { > + .test_all = run, > + .setup = setup, > + .cleanup = cleanup, > + .min_kver = "5.18", What happens before 5.18? Could we try applying MADV_DONTNEED and return TCONF instead? > + .needs_root = 1, Why does this need root? > + .hugepages = {1, TST_NEEDS}, > +}; > + > -- > 2.17.1
diff --git a/runtest/syscalls b/runtest/syscalls index c81764df4..eb1910cec 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -941,6 +941,7 @@ mincore04 mincore04 madvise01 madvise01 madvise02 madvise02 madvise03 madvise03 +madvise04 madvise04 madvise05 madvise05 madvise06 madvise06 madvise07 madvise07 diff --git a/testcases/kernel/syscalls/madvise/.gitignore b/testcases/kernel/syscalls/madvise/.gitignore index f4bfdfefe..db8ce47c1 100644 --- a/testcases/kernel/syscalls/madvise/.gitignore +++ b/testcases/kernel/syscalls/madvise/.gitignore @@ -1,6 +1,7 @@ /madvise01 /madvise02 /madvise03 +/madvise04 /madvise05 /madvise06 /madvise07 diff --git a/testcases/kernel/syscalls/madvise/madvise04.c b/testcases/kernel/syscalls/madvise/madvise04.c new file mode 100644 index 000000000..a970fb33e --- /dev/null +++ b/testcases/kernel/syscalls/madvise/madvise04.c @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. + * Author: Zhao Gongyi <zhaogongyi@huawei.com> + */ + +/*\ + * [Description] + * + * Check that madvise(2) MADV_DONTNEED operation applied to Huge TLB pages + * successfully after kernel version 5.18, and will result in + * zero-fill-on-demand pages for anonymous private mappings. + */ + +#include "tst_test.h" + +#define MAP_SIZE (8 * 1024) + +static char *addr; +static int mapsz; + +static void run(void) +{ + TST_EXP_PASS(madvise(addr, mapsz, MADV_DONTNEED)); + for (int i = 0; i < mapsz; i++) { + if (addr[i]) { + tst_res(TFAIL, + "There are no zero-fill-on-demand pages " + "for anonymous private mappings"); + return; + } + } + + tst_res(TPASS, "There are zero-fill-on-demand pages " + "for anonymous private mappings"); +} + +static void setup(void) +{ + mapsz = tst_get_hugepage_size(); + addr = SAFE_MMAP(NULL, mapsz, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, + -1, 0); + memset(addr, 1, mapsz); +} + +static void cleanup(void) +{ + if (addr) + SAFE_MUNMAP(addr, mapsz); +} + +static struct tst_test test = { + .test_all = run, + .setup = setup, + .cleanup = cleanup, + .min_kver = "5.18", + .needs_root = 1, + .hugepages = {1, TST_NEEDS}, +}; +
Check that madvise(2) MADV_DONTNEED operation applied to Huge TLB pages successfully after kernel version 5.18, and will result in zero-fill-on-demand pages for anonymous private mappings. Signed-off-by: Zhao Gongyi <zhaogongyi@huawei.com> --- runtest/syscalls | 1 + testcases/kernel/syscalls/madvise/.gitignore | 1 + testcases/kernel/syscalls/madvise/madvise04.c | 62 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 testcases/kernel/syscalls/madvise/madvise04.c -- 2.17.1