Message ID | 1612440762-22389-4-git-send-email-xuyang2018.jy@cn.fujitsu.com |
---|---|
State | Superseded |
Headers | show |
Series | [v2,1/5] tst_mallinfo.c: Add a common print helper for mallinfo | expand |
On Thu, Feb 4, 2021 at 8:12 PM Yang Xu <xuyang2018.jy@cn.fujitsu.com> wrote: > According mallinfo man-page, hblkhd member represents > "The number of bytes in blocks currently allocated using mmap(2).". > For allocations greater than or equal to 128K and that can't be satisfied > from > the free list, the memory-allocation functions employ mmap(2) instead of > increasing > the program break using sbrk(2). > > In this case, we test 20k size to use sbrk and 128k size to use mmap. > > Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com> > --- > v1->v2: > 1.Use mallopt(M_MMAP_THRESHOLD, 131072) to avoid dynamic mmap threshold > 2.Use tst_print_malinfo api > runtest/syscalls | 1 + > testcases/kernel/syscalls/mallinfo/.gitignore | 1 + > .../kernel/syscalls/mallinfo/mallinfo02.c | 64 +++++++++++++++++++ > 3 files changed, 66 insertions(+) > create mode 100644 testcases/kernel/syscalls/mallinfo/mallinfo02.c > > diff --git a/runtest/syscalls b/runtest/syscalls > index 753340068..a8fa3f7bf 100644 > --- a/runtest/syscalls > +++ b/runtest/syscalls > @@ -683,6 +683,7 @@ lstat02 lstat02 > lstat02_64 lstat02_64 > > mallinfo01 mallinfo01 > +mallinfo02 mallinfo02 > > mallopt01 mallopt01 > > diff --git a/testcases/kernel/syscalls/mallinfo/.gitignore > b/testcases/kernel/syscalls/mallinfo/.gitignore > index a7e32a637..678ac277e 100644 > --- a/testcases/kernel/syscalls/mallinfo/.gitignore > +++ b/testcases/kernel/syscalls/mallinfo/.gitignore > @@ -1 +1,2 @@ > /mallinfo01 > +/mallinfo02 > diff --git a/testcases/kernel/syscalls/mallinfo/mallinfo02.c > b/testcases/kernel/syscalls/mallinfo/mallinfo02.c > new file mode 100644 > index 000000000..d5bed45a8 > --- /dev/null > +++ b/testcases/kernel/syscalls/mallinfo/mallinfo02.c > @@ -0,0 +1,64 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Copyright (c) 2021 FUJITSU LIMITED. All rights reserved. > + * Author: Yang Xu <xuyang2018.jy@cn.fujitsu.com> > + */ > + > +/*\ > + * [DESCRIPTION] > + * > + * Basic mallinfo() test for malloc() using sbrk or mmap. > + * It size > MMAP_THRESHOLD, it will use mmap. Otherwise, use sbrk. > +\*/ > + > +#include "tst_test.h" > +#include "tst_safe_macros.h" > +#include "tst_mallinfo.h" > + > +#ifdef HAVE_MALLINFO > +void test_mallopt(void) > what about renaming to test_mallinfo(void) ? > +{ > + struct mallinfo info; > + int size; > + char *buf; > + > + buf = SAFE_MALLOC(20480); > + > + info = mallinfo(); > + if (info.uordblks > 20480 && info.hblkhd == 0) { > + tst_res(TPASS, "malloc() uses sbrk when size < 128k"); > + } else { > + tst_res(TFAIL, "malloc() use mmap when size < 128k"); > + tst_print_mallinfo("Test malloc(20480)", &info); > + } > + free(buf); > + > + info = mallinfo(); > + size = MAX(info.fordblks, 131072); > + > + buf = SAFE_MALLOC(size); > + info = mallinfo(); > + if (info.hblkhd > size && info.hblks > 0) { > + tst_res(TPASS, "malloc() uses mmap when size >= 128k"); > + } else { > + tst_res(TFAIL, "malloc uses sbrk when size >= 128k"); > Why not 'TFAIL | TERRNO' ? > + tst_print_mallinfo("Test malloc(1024*128)", &info); > + } > + > + free(buf); > +} > + > +static void setup(void) > +{ > + if (mallopt(M_MMAP_THRESHOLD, 131072) == 0) > + tst_res(TFAIL, "mallopt(M_MMAP_THRESHOLD, 128K) failed"); > Here as well. > +} > + > +static struct tst_test test = { > + .setup = setup, > + .test_all = test_mallopt, > +}; > + > +#else > +TST_TEST_TCONF("system doesn't implement non-POSIX mallinfo()"); > +#endif > -- > 2.23.0 > > > >
Hi Li > > > On Thu, Feb 4, 2021 at 8:12 PM Yang Xu <xuyang2018.jy@cn.fujitsu.com > <mailto:xuyang2018.jy@cn.fujitsu.com>> wrote: > > According mallinfo man-page, hblkhd member represents > "The number of bytes in blocks currently allocated using mmap(2).". > For allocations greater than or equal to 128K and that can't be > satisfied from > the free list, the memory-allocation functions employ mmap(2) > instead of increasing > the program break using sbrk(2). > > In this case, we test 20k size to use sbrk and 128k size to use mmap. > > Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com > <mailto:xuyang2018.jy@cn.fujitsu.com>> > --- > v1->v2: > 1.Use mallopt(M_MMAP_THRESHOLD, 131072) to avoid dynamic mmap threshold > 2.Use tst_print_malinfo api > runtest/syscalls | 1 + > testcases/kernel/syscalls/mallinfo/.gitignore | 1 + > .../kernel/syscalls/mallinfo/mallinfo02.c | 64 +++++++++++++++++++ > 3 files changed, 66 insertions(+) > create mode 100644 testcases/kernel/syscalls/mallinfo/mallinfo02.c > > diff --git a/runtest/syscalls b/runtest/syscalls > index 753340068..a8fa3f7bf 100644 > --- a/runtest/syscalls > +++ b/runtest/syscalls > @@ -683,6 +683,7 @@ lstat02 lstat02 > lstat02_64 lstat02_64 > > mallinfo01 mallinfo01 > +mallinfo02 mallinfo02 > > mallopt01 mallopt01 > > diff --git a/testcases/kernel/syscalls/mallinfo/.gitignore > b/testcases/kernel/syscalls/mallinfo/.gitignore > index a7e32a637..678ac277e 100644 > --- a/testcases/kernel/syscalls/mallinfo/.gitignore > +++ b/testcases/kernel/syscalls/mallinfo/.gitignore > @@ -1 +1,2 @@ > /mallinfo01 > +/mallinfo02 > diff --git a/testcases/kernel/syscalls/mallinfo/mallinfo02.c > b/testcases/kernel/syscalls/mallinfo/mallinfo02.c > new file mode 100644 > index 000000000..d5bed45a8 > --- /dev/null > +++ b/testcases/kernel/syscalls/mallinfo/mallinfo02.c > @@ -0,0 +1,64 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Copyright (c) 2021 FUJITSU LIMITED. All rights reserved. > + * Author: Yang Xu <xuyang2018.jy@cn.fujitsu.com > <mailto:xuyang2018.jy@cn.fujitsu.com>> > + */ > + > +/*\ > + * [DESCRIPTION] > + * > + * Basic mallinfo() test for malloc() using sbrk or mmap. > + * It size > MMAP_THRESHOLD, it will use mmap. Otherwise, use sbrk. > +\*/ > + > +#include "tst_test.h" > +#include "tst_safe_macros.h" > +#include "tst_mallinfo.h" > + > +#ifdef HAVE_MALLINFO > +void test_mallopt(void) > > > what about renaming to test_mallinfo(void) ? Yes, sorry for typo. > > +{ > + struct mallinfo info; > + int size; > + char *buf; > + > + buf = SAFE_MALLOC(20480); > + > + info = mallinfo(); > + if (info.uordblks > 20480 && info.hblkhd == 0) { > + tst_res(TPASS, "malloc() uses sbrk when size < 128k"); > + } else { > + tst_res(TFAIL, "malloc() use mmap when size < 128k"); > + tst_print_mallinfo("Test malloc(20480)", &info); > + } > + free(buf); > + > + info = mallinfo(); > + size = MAX(info.fordblks, 131072); > + > + buf = SAFE_MALLOC(size); > + info = mallinfo(); > + if (info.hblkhd > size && info.hblks > 0) { > + tst_res(TPASS, "malloc() uses mmap when size >= 128k"); > + } else { > + tst_res(TFAIL, "malloc uses sbrk when size >= 128k"); > > > Why not 'TFAIL | TERRNO' ? I don't see mallinfo() will fail and it should always succeed. > > + tst_print_mallinfo("Test malloc(1024*128)", &info); > + } > + > + free(buf); > +} > + > +static void setup(void) > +{ > + if (mallopt(M_MMAP_THRESHOLD, 131072) == 0) > + tst_res(TFAIL, "mallopt(M_MMAP_THRESHOLD, 128K) failed"); > > > Here as well. Look mallopt man-pages, it said " RETURN VALUE On success, mallopt() returns 1. On error, it returns 0. ERRORS On error, errno is not set " That is why I don't use TERRNO. > > +} > + > +static struct tst_test test = { > + .setup = setup, > + .test_all = test_mallopt, > +}; > + > +#else > +TST_TEST_TCONF("system doesn't implement non-POSIX mallinfo()"); > +#endif > -- > 2.23.0 > > > > > > -- > Regards, > Li Wang
Hi Li I have reply this email, but I don't see it on inbox or patchwork, so again > + > +#ifdef HAVE_MALLINFO > +void test_mallopt(void) > > > what about renaming to test_mallinfo(void) ? Yes, sorry for this typo. > > +{ > + struct mallinfo info; > + int size; > + char *buf; > + > + buf = SAFE_MALLOC(20480); > + > + info = mallinfo(); > + if (info.uordblks > 20480 && info.hblkhd == 0) { > + tst_res(TPASS, "malloc() uses sbrk when size < 128k"); > + } else { > + tst_res(TFAIL, "malloc() use mmap when size < 128k"); > + tst_print_mallinfo("Test malloc(20480)", &info); > + } > + free(buf); > + > + info = mallinfo(); > + size = MAX(info.fordblks, 131072); > + > + buf = SAFE_MALLOC(size); > + info = mallinfo(); > + if (info.hblkhd > size && info.hblks > 0) { > + tst_res(TPASS, "malloc() uses mmap when size >= 128k"); > + } else { > + tst_res(TFAIL, "malloc uses sbrk when size >= 128k"); > > > Why not 'TFAIL | TERRNO' ? mallinfo should always succeed. > > + tst_print_mallinfo("Test malloc(1024*128)", &info); > + } > + > + free(buf); > +} > + > +static void setup(void) > +{ > + if (mallopt(M_MMAP_THRESHOLD, 131072) == 0) > + tst_res(TFAIL, "mallopt(M_MMAP_THRESHOLD, 128K) failed"); > > > Here as well. mallopt man-pages said even mallopt fails, return 0 and it doesn't set errno. > > +} > + > +static struct tst_test test = { > + .setup = setup, > + .test_all = test_mallopt, > +}; > + > +#else > +TST_TEST_TCONF("system doesn't implement non-POSIX mallinfo()"); > +#endif > -- > 2.23.0 > > > > > > -- > Regards, > Li Wang
Hi Li I have reply this email, but I don't see it on inbox or patchwork, so again > +#ifdef HAVE_MALLINFO > +void test_mallopt(void) > > > what about renaming to test_mallinfo(void) ? Yes, sorry for this typo. > > +{ > + struct mallinfo info; > + int size; > + char *buf; > + > + buf = SAFE_MALLOC(20480); > + > + info = mallinfo(); > + if (info.uordblks > 20480 && info.hblkhd == 0) { > + tst_res(TPASS, "malloc() uses sbrk when size < 128k"); > + } else { > + tst_res(TFAIL, "malloc() use mmap when size < 128k"); > + tst_print_mallinfo("Test malloc(20480)", &info); > + } > + free(buf); > + > + info = mallinfo(); > + size = MAX(info.fordblks, 131072); > + > + buf = SAFE_MALLOC(size); > + info = mallinfo(); > + if (info.hblkhd > size && info.hblks > 0) { > + tst_res(TPASS, "malloc() uses mmap when size >= 128k"); > + } else { > + tst_res(TFAIL, "malloc uses sbrk when size >= 128k"); > > > Why not 'TFAIL | TERRNO' ? mallinfo should succeed always. > > + tst_print_mallinfo("Test malloc(1024*128)", &info); > + } > + > + free(buf); > +} > + > +static void setup(void) > +{ > + if (mallopt(M_MMAP_THRESHOLD, 131072) == 0) > + tst_res(TFAIL, "mallopt(M_MMAP_THRESHOLD, 128K) failed"); > > > Here as well. > From mallopt man-page, even it fail, it doesn't set errno and only return 0 > +} > + > +static struct tst_test test = { > + .setup = setup, > + .test_all = test_mallopt, > +}; > + > +#else > +TST_TEST_TCONF("system doesn't implement non-POSIX mallinfo()"); > +#endif > -- > 2.23.0 > > > > > > -- > Regards, > Li Wang
Hi Xu,
Yang Xu <xuyang2018.jy@cn.fujitsu.com> wrote:
I have reply this email, but I don't see it on inbox or patchwork, so again
>
Plz stop replying to this, I have received three same emails so far :).
diff --git a/runtest/syscalls b/runtest/syscalls index 753340068..a8fa3f7bf 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -683,6 +683,7 @@ lstat02 lstat02 lstat02_64 lstat02_64 mallinfo01 mallinfo01 +mallinfo02 mallinfo02 mallopt01 mallopt01 diff --git a/testcases/kernel/syscalls/mallinfo/.gitignore b/testcases/kernel/syscalls/mallinfo/.gitignore index a7e32a637..678ac277e 100644 --- a/testcases/kernel/syscalls/mallinfo/.gitignore +++ b/testcases/kernel/syscalls/mallinfo/.gitignore @@ -1 +1,2 @@ /mallinfo01 +/mallinfo02 diff --git a/testcases/kernel/syscalls/mallinfo/mallinfo02.c b/testcases/kernel/syscalls/mallinfo/mallinfo02.c new file mode 100644 index 000000000..d5bed45a8 --- /dev/null +++ b/testcases/kernel/syscalls/mallinfo/mallinfo02.c @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2021 FUJITSU LIMITED. All rights reserved. + * Author: Yang Xu <xuyang2018.jy@cn.fujitsu.com> + */ + +/*\ + * [DESCRIPTION] + * + * Basic mallinfo() test for malloc() using sbrk or mmap. + * It size > MMAP_THRESHOLD, it will use mmap. Otherwise, use sbrk. +\*/ + +#include "tst_test.h" +#include "tst_safe_macros.h" +#include "tst_mallinfo.h" + +#ifdef HAVE_MALLINFO +void test_mallopt(void) +{ + struct mallinfo info; + int size; + char *buf; + + buf = SAFE_MALLOC(20480); + + info = mallinfo(); + if (info.uordblks > 20480 && info.hblkhd == 0) { + tst_res(TPASS, "malloc() uses sbrk when size < 128k"); + } else { + tst_res(TFAIL, "malloc() use mmap when size < 128k"); + tst_print_mallinfo("Test malloc(20480)", &info); + } + free(buf); + + info = mallinfo(); + size = MAX(info.fordblks, 131072); + + buf = SAFE_MALLOC(size); + info = mallinfo(); + if (info.hblkhd > size && info.hblks > 0) { + tst_res(TPASS, "malloc() uses mmap when size >= 128k"); + } else { + tst_res(TFAIL, "malloc uses sbrk when size >= 128k"); + tst_print_mallinfo("Test malloc(1024*128)", &info); + } + + free(buf); +} + +static void setup(void) +{ + if (mallopt(M_MMAP_THRESHOLD, 131072) == 0) + tst_res(TFAIL, "mallopt(M_MMAP_THRESHOLD, 128K) failed"); +} + +static struct tst_test test = { + .setup = setup, + .test_all = test_mallopt, +}; + +#else +TST_TEST_TCONF("system doesn't implement non-POSIX mallinfo()"); +#endif
According mallinfo man-page, hblkhd member represents "The number of bytes in blocks currently allocated using mmap(2).". For allocations greater than or equal to 128K and that can't be satisfied from the free list, the memory-allocation functions employ mmap(2) instead of increasing the program break using sbrk(2). In this case, we test 20k size to use sbrk and 128k size to use mmap. Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com> --- v1->v2: 1.Use mallopt(M_MMAP_THRESHOLD, 131072) to avoid dynamic mmap threshold 2.Use tst_print_malinfo api runtest/syscalls | 1 + testcases/kernel/syscalls/mallinfo/.gitignore | 1 + .../kernel/syscalls/mallinfo/mallinfo02.c | 64 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 testcases/kernel/syscalls/mallinfo/mallinfo02.c