Message ID | 1611654925-8994-1-git-send-email-xuyang2018.jy@cn.fujitsu.com |
---|---|
State | Changes Requested |
Headers | show |
Series | [v1,1/3] syscalls/mallinfo01: Add a basic test for mallinfo | expand |
> diff --git a/testcases/kernel/syscalls/mallinfo/mallinfo01.c b/testcases/kernel/syscalls/mallinfo/mallinfo01.c > new file mode 100644 > index 000000000..1a2a30af1 > --- /dev/null > +++ b/testcases/kernel/syscalls/mallinfo/mallinfo01.c > @@ -0,0 +1,84 @@ > +// 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. Refer to glibc test > + * https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/tst-mallinfo2.c > +\*/ > + > +#include <malloc.h> > + > +#include "tst_test.h" > +#include "tst_safe_macros.h" > + > +#ifdef HAVE_MALLINFO > +static char *buf; > +static struct mallinfo info1; > + > +static void > +print_mallinfo(const char *msg, struct mallinfo *m) > +{ > + tst_res(TINFO, "%s...", msg); > +#define P(f) tst_res(TINFO, "%s: %d", #f, m->f) > + P(arena); > + P(ordblks); > + P(smblks); > + P(hblks); > + P(hblkhd); > + P(usmblks); > + P(fsmblks); > + P(uordblks); > + P(fordblks); > + P(keepcost); > +} > + > +void test_mallinfo(void) > +{ > + struct mallinfo info2; > + int i; > + int total = 0; > + > + for (i = 1; i < 20; i++) { > + buf = SAFE_MALLOC(160 * i); The buf here has to be array and we have to free the buffers at the end of this function, otherwise the malloc() will fail sooner or later when the test_mallinfo() function runs in a loop. > + total += 16 * i; > + } > + > + info2 = mallinfo(); > + print_mallinfo("Test", &info2); > + if (info2.uordblks > info1.uordblks + total) > + tst_res(TPASS, "mallinfo() passed"); > + else > + tst_res(TFAIL, "mallinfo() failed"); > + > + info1 = info2; And then we cannot do this either. > +} > + > +static void setup(void) > +{ > + if (sizeof(info1.arena) != sizeof(int)) > + tst_res(TFAIL, "The member of mallinfo struct is not int"); > + > + info1 = mallinfo(); > + print_mallinfo("Start", &info1); > +} > + > +static void cleanup(void) > +{ > + if (buf) > + free(buf); > +} > + > +static struct tst_test test = { > + .setup = setup, > + .test_all = test_mallinfo, > + .cleanup = cleanup, > +}; > + > +#else > +TST_TEST_TCONF("system doesn't implement non-POSIX mallinfo()"); > +#endif > -- > 2.23.0 > > > > > -- > Mailing list info: https://lists.linux.it/listinfo/ltp
Hi Cyril Sorry for late reply, I am busy with other thing. >> diff --git a/testcases/kernel/syscalls/mallinfo/mallinfo01.c b/testcases/kernel/syscalls/mallinfo/mallinfo01.c >> new file mode 100644 >> index 000000000..1a2a30af1 >> --- /dev/null >> +++ b/testcases/kernel/syscalls/mallinfo/mallinfo01.c >> @@ -0,0 +1,84 @@ >> +// 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. Refer to glibc test >> + * https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/tst-mallinfo2.c >> +\*/ >> + >> +#include<malloc.h> >> + >> +#include "tst_test.h" >> +#include "tst_safe_macros.h" >> + >> +#ifdef HAVE_MALLINFO >> +static char *buf; >> +static struct mallinfo info1; >> + >> +static void >> +print_mallinfo(const char *msg, struct mallinfo *m) >> +{ >> + tst_res(TINFO, "%s...", msg); >> +#define P(f) tst_res(TINFO, "%s: %d", #f, m->f) >> + P(arena); >> + P(ordblks); >> + P(smblks); >> + P(hblks); >> + P(hblkhd); >> + P(usmblks); >> + P(fsmblks); >> + P(uordblks); >> + P(fordblks); >> + P(keepcost); >> +} >> + >> +void test_mallinfo(void) >> +{ >> + struct mallinfo info2; >> + int i; >> + int total = 0; >> + >> + for (i = 1; i< 20; i++) { >> + buf = SAFE_MALLOC(160 * i); > > The buf here has to be array and we have to free the buffers at the end > of this function, otherwise the malloc() will fail sooner or later when > the test_mallinfo() function runs in a loop. Yes. Will do it in v2. > >> + total += 16 * i; It looks glibc test uses wrong multiple for total variable, I will correct it (16=>160). Also, I have sent a patch to glibc. >> + } >> + >> + info2 = mallinfo(); >> + print_mallinfo("Test",&info2); >> + if (info2.uordblks> info1.uordblks + total) >> + tst_res(TPASS, "mallinfo() passed"); >> + else >> + tst_res(TFAIL, "mallinfo() failed"); >> + >> + info1 = info2; > > And then we cannot do this either. Yes, Will do it in v2. > >> +} >> + >> +static void setup(void) >> +{ >> + if (sizeof(info1.arena) != sizeof(int)) >> + tst_res(TFAIL, "The member of mallinfo struct is not int"); >> + >> + info1 = mallinfo(); >> + print_mallinfo("Start",&info1); >> +} >> + >> +static void cleanup(void) >> +{ >> + if (buf) >> + free(buf); >> +} >> + >> +static struct tst_test test = { >> + .setup = setup, >> + .test_all = test_mallinfo, >> + .cleanup = cleanup, >> +}; >> + >> +#else >> +TST_TEST_TCONF("system doesn't implement non-POSIX mallinfo()"); >> +#endif >> -- >> 2.23.0 >> >> >> >> >> -- >> Mailing list info: https://lists.linux.it/listinfo/ltp >
Hi Xu, > +static void > +print_mallinfo(const char *msg, struct mallinfo *m) > What about moving this print_mallinfo() into a mallinfo_common.h file to avoid the duplicated code in each test?
Hi Li > Hi Xu, > > +static void > +print_mallinfo(const char *msg, struct mallinfo *m) > > > What about moving this print_mallinfo() into a mallinfo_common.h file > to avoid the duplicated code in each test? Good suggestion. Will do it. > > -- > Regards, > Li Wang
diff --git a/configure.ac b/configure.ac index 8bdb96300..223900ca1 100644 --- a/configure.ac +++ b/configure.ac @@ -94,6 +94,7 @@ AC_CHECK_FUNCS_ONCE([ \ io_uring_register \ io_uring_enter \ kcmp \ + mallinfo \ mallopt \ mkdirat \ mknodat \ diff --git a/runtest/syscalls b/runtest/syscalls index 576eacf83..d0a9a5145 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -682,6 +682,8 @@ lstat01_64 lstat01_64 lstat02 lstat02 lstat02_64 lstat02_64 +mallinfo01 mallinfo01 + mallopt01 mallopt01 mbind01 mbind01 diff --git a/testcases/kernel/syscalls/mallinfo/.gitignore b/testcases/kernel/syscalls/mallinfo/.gitignore new file mode 100644 index 000000000..a7e32a637 --- /dev/null +++ b/testcases/kernel/syscalls/mallinfo/.gitignore @@ -0,0 +1 @@ +/mallinfo01 diff --git a/testcases/kernel/syscalls/mallinfo/Makefile b/testcases/kernel/syscalls/mallinfo/Makefile new file mode 100644 index 000000000..044619fb8 --- /dev/null +++ b/testcases/kernel/syscalls/mallinfo/Makefile @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (c) International Business Machines Corp., 2001 + +top_srcdir ?= ../../../.. + +include $(top_srcdir)/include/mk/testcases.mk + +include $(top_srcdir)/include/mk/generic_leaf_target.mk diff --git a/testcases/kernel/syscalls/mallinfo/mallinfo01.c b/testcases/kernel/syscalls/mallinfo/mallinfo01.c new file mode 100644 index 000000000..1a2a30af1 --- /dev/null +++ b/testcases/kernel/syscalls/mallinfo/mallinfo01.c @@ -0,0 +1,84 @@ +// 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. Refer to glibc test + * https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/tst-mallinfo2.c +\*/ + +#include <malloc.h> + +#include "tst_test.h" +#include "tst_safe_macros.h" + +#ifdef HAVE_MALLINFO +static char *buf; +static struct mallinfo info1; + +static void +print_mallinfo(const char *msg, struct mallinfo *m) +{ + tst_res(TINFO, "%s...", msg); +#define P(f) tst_res(TINFO, "%s: %d", #f, m->f) + P(arena); + P(ordblks); + P(smblks); + P(hblks); + P(hblkhd); + P(usmblks); + P(fsmblks); + P(uordblks); + P(fordblks); + P(keepcost); +} + +void test_mallinfo(void) +{ + struct mallinfo info2; + int i; + int total = 0; + + for (i = 1; i < 20; i++) { + buf = SAFE_MALLOC(160 * i); + total += 16 * i; + } + + info2 = mallinfo(); + print_mallinfo("Test", &info2); + if (info2.uordblks > info1.uordblks + total) + tst_res(TPASS, "mallinfo() passed"); + else + tst_res(TFAIL, "mallinfo() failed"); + + info1 = info2; +} + +static void setup(void) +{ + if (sizeof(info1.arena) != sizeof(int)) + tst_res(TFAIL, "The member of mallinfo struct is not int"); + + info1 = mallinfo(); + print_mallinfo("Start", &info1); +} + +static void cleanup(void) +{ + if (buf) + free(buf); +} + +static struct tst_test test = { + .setup = setup, + .test_all = test_mallinfo, + .cleanup = cleanup, +}; + +#else +TST_TEST_TCONF("system doesn't implement non-POSIX mallinfo()"); +#endif
Referring to glibc test tst-mallinfo2.c[1], add a test to test mallinfo. Also check mallinfo in autotools. [1]https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/tst-mallinfo2.c Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com> --- configure.ac | 1 + runtest/syscalls | 2 + testcases/kernel/syscalls/mallinfo/.gitignore | 1 + testcases/kernel/syscalls/mallinfo/Makefile | 8 ++ .../kernel/syscalls/mallinfo/mallinfo01.c | 84 +++++++++++++++++++ 5 files changed, 96 insertions(+) create mode 100644 testcases/kernel/syscalls/mallinfo/.gitignore create mode 100644 testcases/kernel/syscalls/mallinfo/Makefile create mode 100644 testcases/kernel/syscalls/mallinfo/mallinfo01.c