* [LTP] [PATCH 1/1] mallopt01: Rewrite to new API @ 2021-01-19 13:24 Petr Vorel 2021-01-20 3:55 ` Yang Xu 2021-01-25 12:17 ` Petr Vorel 0 siblings, 2 replies; 4+ messages in thread From: Petr Vorel @ 2021-01-19 13:24 UTC (permalink / raw) To: ltp From: Petr Vorel <petr.vorel@gmail.com> Detect non-POSIX mallopt() support with autotools. NOTE: mallopt() is supported in glibc and uClibc. Signed-off-by: Petr Vorel <petr.vorel@gmail.com> Signed-off-by: Petr Vorel <pvorel@suse.cz> --- configure.ac | 1 + testcases/kernel/syscalls/mallopt/mallopt01.c | 158 ++++++------------ 2 files changed, 51 insertions(+), 108 deletions(-) diff --git a/configure.ac b/configure.ac index e44e25cc6..17ef76c1a 100644 --- a/configure.ac +++ b/configure.ac @@ -94,6 +94,7 @@ AC_CHECK_FUNCS_ONCE([ \ io_uring_register \ io_uring_enter \ kcmp \ + mallopt \ mkdirat \ mknodat \ modify_ldt \ diff --git a/testcases/kernel/syscalls/mallopt/mallopt01.c b/testcases/kernel/syscalls/mallopt/mallopt01.c index 14e26dd81..f6999bd52 100644 --- a/testcases/kernel/syscalls/mallopt/mallopt01.c +++ b/testcases/kernel/syscalls/mallopt/mallopt01.c @@ -1,155 +1,97 @@ +// SPDX-License-Identifier: GPL-2.0-or-later /* - * - * Copyright (c) International Business Machines Corp., 2002 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Copyright (c) Linux Test Project, 2003-2021 + * Copyright (c) International Business Machines Corp., 2002 + * 01/02/2003 Port to LTP <avenkat@us.ibm.com> + * 06/30/2001 Port to Linux <nsharoff@us.ibm.com> */ -/* 01/02/2003 Port to LTP avenkat@us.ibm.com*/ -/* 06/30/2001 Port to Linux nsharoff@us.ibm.com */ - -/* - * NAME - * mallopt - * - * CALLS - * malloc(3x), mallopt(3x), mallinfo(3x). - * - * ALGORITHM - * Set options, malloc memory, and check resource ussage. +/*\ + * [DESCRIPTION] * - * RESTRICTIONS - */ + * Basic mallinfo() and mallopt() testing (M_MXFAST, M_NLBLKS). +\*/ -#ifdef CONFIG_COLDFIRE -#define __MALLOC_STANDARD__ -#endif -#include <errno.h> -/* - * NOTE: struct mallinfo is only exported via malloc.h (not stdlib.h), even - * though it's an obsolete header for malloc(3). - * - * Inconsistencies rock. - */ #include <malloc.h> -#include <stdio.h> - -#include "test.h" -#include "safe_macros.h" - -#define FAILED 0 -#define PASSED 1 -#define MAX_FAST_SIZE (80 * sizeof(size_t) / 4) -int local_flag = PASSED; +#include "tst_test.h" +#include "tst_safe_macros.h" -char *TCID = "mallopt01"; -int block_number; -FILE *temp; -int TST_TOTAL = 6; -extern int tst_COUNT; /* Test Case counter for tst_routines */ +#ifdef HAVE_MALLOPT -void printinfo(); +#define MAX_FAST_SIZE (80 * sizeof(size_t) / 4) -#if defined(__GLIBC__) struct mallinfo info; -int main(int argc, char *argv[]) +void print_mallinfo(void) { - char *buf; - - tst_parse_opts(argc, argv, NULL, NULL); - - tst_tmpdir(); + tst_res(TINFO, "mallinfo structure:"); + tst_res(TINFO, "mallinfo.arena = %d", info.arena); + tst_res(TINFO, "mallinfo.ordblks = %d", info.ordblks); + tst_res(TINFO, "mallinfo.smblks = %d", info.smblks); + tst_res(TINFO, "mallinfo.hblkhd = %d", info.hblkhd); + tst_res(TINFO, "mallinfo.hblks = %d", info.hblks); + tst_res(TINFO, "mallinfo.usmblks = %d", info.usmblks); + tst_res(TINFO, "mallinfo.fsmblks = %d", info.fsmblks); + tst_res(TINFO, "mallinfo.uordblks = %d", info.uordblks); + tst_res(TINFO, "mallinfo.fordblks = %d", info.fordblks); + tst_res(TINFO, "mallinfo.keepcost = %d", info.keepcost); +} - buf = SAFE_MALLOC(NULL, 20480); +void test_mallopt(void) +{ + char *buf; - /* - * Check space usage. - */ + buf = SAFE_MALLOC(20480); info = mallinfo(); if (info.uordblks < 20480) { - printinfo(); - tst_resm(TFAIL, "mallinfo failed: uordblks < 20K"); + print_mallinfo(); + tst_res(TFAIL, "mallinfo() failed: uordblks < 20K"); } if (info.smblks != 0) { - printinfo(); - tst_resm(TFAIL, "mallinfo failed: smblks != 0"); + print_mallinfo(); + tst_res(TFAIL, "mallinfo() failed: smblks != 0"); } if (info.uordblks >= 20480 && info.smblks == 0) - tst_resm(TPASS, "mallinfo() succeeded"); - free(buf); + tst_res(TPASS, "mallinfo() succeeded"); - /* - * Test mallopt's M_MXFAST and M_NLBLKS cmds. - */ + free(buf); if (mallopt(M_MXFAST, MAX_FAST_SIZE) == 0) - tst_resm(TFAIL, "mallopt(M_MXFAST, %d) failed", (int)MAX_FAST_SIZE); + tst_res(TFAIL, "mallopt(M_MXFAST, %d) failed", (int)MAX_FAST_SIZE); else - tst_resm(TPASS, "mallopt(M_MXFAST, %d) succeeded", (int)MAX_FAST_SIZE); + tst_res(TPASS, "mallopt(M_MXFAST, %d) succeeded", (int)MAX_FAST_SIZE); if (mallopt(M_NLBLKS, 50) == 0) - tst_resm(TFAIL, "mallopt(M_NLBLKS, 50) failed"); + tst_res(TFAIL, "mallopt(M_NLBLKS, 50) failed"); else - tst_resm(TPASS, "mallopt(M_NLBLKS, 50) succeeded"); + tst_res(TPASS, "mallopt(M_NLBLKS, 50) succeeded"); if ((buf = malloc(1024)) == NULL) { - tst_resm(TFAIL, "malloc(1024) failed"); + tst_res(TFAIL, "malloc(1024) failed"); } else { - tst_resm(TPASS, "malloc(1024) succeeded"); + tst_res(TPASS, "malloc(1024) succeeded"); free(buf); } if (mallopt(M_MXFAST, 0) == 0) - tst_resm(TFAIL, "mallopt(M_MXFAST, 0) failed"); + tst_res(TFAIL, "mallopt(M_MXFAST, 0) failed"); else - tst_resm(TPASS, "mallopt(M_MXFAST, 0) succeeded"); + tst_res(TPASS, "mallopt(M_MXFAST, 0) succeeded"); if ((buf = malloc(1024)) == NULL) { - tst_resm(TFAIL, "malloc(1024) failed"); + tst_res(TFAIL, "malloc(1024) failed"); } else { - tst_resm(TPASS, "malloc(1024) succeeded"); + tst_res(TPASS, "malloc(1024) succeeded"); free(buf); } - - unlink("core"); - tst_rmdir(); - tst_exit(); } -void printinfo(void) -{ - - fprintf(stderr, "mallinfo structure:\n"); - fprintf(stderr, "mallinfo.arena = %d\n", info.arena); - fprintf(stderr, "mallinfo.ordblks = %d\n", info.ordblks); - fprintf(stderr, "mallinfo.smblks = %d\n", info.smblks); - fprintf(stderr, "mallinfo.hblkhd = %d\n", info.hblkhd); - fprintf(stderr, "mallinfo.hblks = %d\n", info.hblks); - fprintf(stderr, "mallinfo.usmblks = %d\n", info.usmblks); - fprintf(stderr, "mallinfo.fsmblks = %d\n", info.fsmblks); - fprintf(stderr, "mallinfo.uordblks = %d\n", info.uordblks); - fprintf(stderr, "mallinfo.fordblks = %d\n", info.fordblks); - fprintf(stderr, "mallinfo.keepcost = %d\n", info.keepcost); -} +static struct tst_test test = { + .test_all = test_mallopt, +}; #else -int main(void) -{ - tst_brkm(TCONF, NULL, "mallopt defined only for glibc"); -} +TST_TEST_TCONF("system doesn't implement non-POSIX mallopt()"); #endif -- 2.30.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [LTP] [PATCH 1/1] mallopt01: Rewrite to new API 2021-01-19 13:24 [LTP] [PATCH 1/1] mallopt01: Rewrite to new API Petr Vorel @ 2021-01-20 3:55 ` Yang Xu 2021-01-21 15:03 ` Petr Vorel 2021-01-25 12:17 ` Petr Vorel 1 sibling, 1 reply; 4+ messages in thread From: Yang Xu @ 2021-01-20 3:55 UTC (permalink / raw) To: ltp Hi Petr > From: Petr Vorel<petr.vorel@gmail.com> > > Detect non-POSIX mallopt() support with autotools. > > NOTE: mallopt() is supported in glibc and uClibc. > > Signed-off-by: Petr Vorel<petr.vorel@gmail.com> > Signed-off-by: Petr Vorel<pvorel@suse.cz> > --- > configure.ac | 1 + > testcases/kernel/syscalls/mallopt/mallopt01.c | 158 ++++++------------ > 2 files changed, 51 insertions(+), 108 deletions(-) > > diff --git a/configure.ac b/configure.ac > index e44e25cc6..17ef76c1a 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -94,6 +94,7 @@ AC_CHECK_FUNCS_ONCE([ \ > io_uring_register \ > io_uring_enter \ > kcmp \ > + mallopt \ If glibc/ulibc supports mallopt, it also should support mallinfo. So only check mallopt, I think it is ok. I guess musl libc doesn't support it, is it right? > mkdirat \ > mknodat \ > modify_ldt \ > diff --git a/testcases/kernel/syscalls/mallopt/mallopt01.c b/testcases/kernel/syscalls/mallopt/mallopt01.c > index 14e26dd81..f6999bd52 100644 > --- a/testcases/kernel/syscalls/mallopt/mallopt01.c > +++ b/testcases/kernel/syscalls/mallopt/mallopt01.c > @@ -1,155 +1,97 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > /* > - * > - * Copyright (c) International Business Machines Corp., 2002 > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License as published by > - * the Free Software Foundation; either version 2 of the License, or > - * (at your option) any later version. > - * > - * This program 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 General Public License for more details. > - * > - * You should have received a copy of the GNU General Public License > - * along with this program; if not, write to the Free Software > - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > + * Copyright (c) Linux Test Project, 2003-2021 > + * Copyright (c) International Business Machines Corp., 2002 > + * 01/02/2003 Port to LTP <avenkat@us.ibm.com> > + * 06/30/2001 Port to Linux<nsharoff@us.ibm.com> > */ > > -/* 01/02/2003 Port to LTP avenkat@us.ibm.com*/ > -/* 06/30/2001 Port to Linux nsharoff@us.ibm.com */ > - > -/* > - * NAME > - * mallopt > - * > - * CALLS > - * malloc(3x), mallopt(3x), mallinfo(3x). > - * > - * ALGORITHM > - * Set options, malloc memory, and check resource ussage. > +/*\ > + * [DESCRIPTION] > * > - * RESTRICTIONS > - */ > + * Basic mallinfo() and mallopt() testing (M_MXFAST, M_NLBLKS). > +\*/ I see glibc code, it said "Only one of these (M_MXFAST) is used in this malloc. The others (M_NLBLKS, M_GRAIN, M_KEEP) don't apply, so setting them has no effect. But this malloc also supports four other options in mallopt. " Also, I don't see M_NLBLKS handle in __libc_mallopt. I think that is why man-pages said "The SVID defined options M_MXFAST, M_NLBLKS, M_GRAIN, and M_KEEP, but only the first of these is implemented in glibc." I guess we can remove useless M_NLBLKS test. > > -#ifdef CONFIG_COLDFIRE > -#define __MALLOC_STANDARD__ > -#endif > -#include<errno.h> > -/* > - * NOTE: struct mallinfo is only exported via malloc.h (not stdlib.h), even > - * though it's an obsolete header for malloc(3). > - * > - * Inconsistencies rock. > - */ > #include<malloc.h> > -#include<stdio.h> > - > -#include "test.h" > -#include "safe_macros.h" > - > -#define FAILED 0 > -#define PASSED 1 > -#define MAX_FAST_SIZE (80 * sizeof(size_t) / 4) > > -int local_flag = PASSED; > +#include "tst_test.h" > +#include "tst_safe_macros.h" > > -char *TCID = "mallopt01"; > -int block_number; > -FILE *temp; > -int TST_TOTAL = 6; > -extern int tst_COUNT; /* Test Case counter for tst_routines */ > +#ifdef HAVE_MALLOPT > > -void printinfo(); > +#define MAX_FAST_SIZE (80 * sizeof(size_t) / 4) > > -#if defined(__GLIBC__) > struct mallinfo info; > > -int main(int argc, char *argv[]) > +void print_mallinfo(void) > { > - char *buf; > - > - tst_parse_opts(argc, argv, NULL, NULL); > - > - tst_tmpdir(); > + tst_res(TINFO, "mallinfo structure:"); > + tst_res(TINFO, "mallinfo.arena = %d", info.arena); > + tst_res(TINFO, "mallinfo.ordblks = %d", info.ordblks); > + tst_res(TINFO, "mallinfo.smblks = %d", info.smblks); > + tst_res(TINFO, "mallinfo.hblkhd = %d", info.hblkhd); > + tst_res(TINFO, "mallinfo.hblks = %d", info.hblks); > + tst_res(TINFO, "mallinfo.usmblks = %d", info.usmblks); > + tst_res(TINFO, "mallinfo.fsmblks = %d", info.fsmblks); > + tst_res(TINFO, "mallinfo.uordblks = %d", info.uordblks); > + tst_res(TINFO, "mallinfo.fordblks = %d", info.fordblks); > + tst_res(TINFO, "mallinfo.keepcost = %d", info.keepcost); > +} > > - buf = SAFE_MALLOC(NULL, 20480); > +void test_mallopt(void) > +{ > + char *buf; > > - /* > - * Check space usage. > - */ > + buf = SAFE_MALLOC(20480); > > info = mallinfo(); The lastest mallinfo man-pages said " However, the older function, mallinfo(), is deprecated since the type used for the fields is too small". The mallinfo2 structure used size_t data type instead of int data type in mallinfo struct. Maybe we can add a new test for it. > if (info.uordblks< 20480) { > - printinfo(); > - tst_resm(TFAIL, "mallinfo failed: uordblks< 20K"); > + print_mallinfo(); > + tst_res(TFAIL, "mallinfo() failed: uordblks< 20K"); > } > if (info.smblks != 0) { > - printinfo(); > - tst_resm(TFAIL, "mallinfo failed: smblks != 0"); > + print_mallinfo(); > + tst_res(TFAIL, "mallinfo() failed: smblks != 0"); > } > if (info.uordblks>= 20480&& info.smblks == 0) > - tst_resm(TPASS, "mallinfo() succeeded"); > - free(buf); > + tst_res(TPASS, "mallinfo() succeeded"); > > - /* > - * Test mallopt's M_MXFAST and M_NLBLKS cmds. > - */ > + free(buf); > > if (mallopt(M_MXFAST, MAX_FAST_SIZE) == 0) > - tst_resm(TFAIL, "mallopt(M_MXFAST, %d) failed", (int)MAX_FAST_SIZE); > + tst_res(TFAIL, "mallopt(M_MXFAST, %d) failed", (int)MAX_FAST_SIZE); > else > - tst_resm(TPASS, "mallopt(M_MXFAST, %d) succeeded", (int)MAX_FAST_SIZE); > + tst_res(TPASS, "mallopt(M_MXFAST, %d) succeeded", (int)MAX_FAST_SIZE); > > if (mallopt(M_NLBLKS, 50) == 0) > - tst_resm(TFAIL, "mallopt(M_NLBLKS, 50) failed"); > + tst_res(TFAIL, "mallopt(M_NLBLKS, 50) failed"); > else > - tst_resm(TPASS, "mallopt(M_NLBLKS, 50) succeeded"); > + tst_res(TPASS, "mallopt(M_NLBLKS, 50) succeeded"); > > if ((buf = malloc(1024)) == NULL) { > - tst_resm(TFAIL, "malloc(1024) failed"); > + tst_res(TFAIL, "malloc(1024) failed"); > } else { > - tst_resm(TPASS, "malloc(1024) succeeded"); > + tst_res(TPASS, "malloc(1024) succeeded"); > free(buf); > } > > if (mallopt(M_MXFAST, 0) == 0) > - tst_resm(TFAIL, "mallopt(M_MXFAST, 0) failed"); > + tst_res(TFAIL, "mallopt(M_MXFAST, 0) failed"); > else > - tst_resm(TPASS, "mallopt(M_MXFAST, 0) succeeded"); > + tst_res(TPASS, "mallopt(M_MXFAST, 0) succeeded"); > > if ((buf = malloc(1024)) == NULL) { > - tst_resm(TFAIL, "malloc(1024) failed"); > + tst_res(TFAIL, "malloc(1024) failed"); > } else { > - tst_resm(TPASS, "malloc(1024) succeeded"); > + tst_res(TPASS, "malloc(1024) succeeded"); > free(buf); > } > - > - unlink("core"); > - tst_rmdir(); > - tst_exit(); > } > > -void printinfo(void) > -{ > - > - fprintf(stderr, "mallinfo structure:\n"); > - fprintf(stderr, "mallinfo.arena = %d\n", info.arena); > - fprintf(stderr, "mallinfo.ordblks = %d\n", info.ordblks); > - fprintf(stderr, "mallinfo.smblks = %d\n", info.smblks); > - fprintf(stderr, "mallinfo.hblkhd = %d\n", info.hblkhd); > - fprintf(stderr, "mallinfo.hblks = %d\n", info.hblks); > - fprintf(stderr, "mallinfo.usmblks = %d\n", info.usmblks); > - fprintf(stderr, "mallinfo.fsmblks = %d\n", info.fsmblks); > - fprintf(stderr, "mallinfo.uordblks = %d\n", info.uordblks); > - fprintf(stderr, "mallinfo.fordblks = %d\n", info.fordblks); > - fprintf(stderr, "mallinfo.keepcost = %d\n", info.keepcost); > -} > +static struct tst_test test = { > + .test_all = test_mallopt, > +}; > > #else > -int main(void) > -{ > - tst_brkm(TCONF, NULL, "mallopt defined only for glibc"); > -} > +TST_TEST_TCONF("system doesn't implement non-POSIX mallopt()"); > #endif ^ permalink raw reply [flat|nested] 4+ messages in thread
* [LTP] [PATCH 1/1] mallopt01: Rewrite to new API 2021-01-20 3:55 ` Yang Xu @ 2021-01-21 15:03 ` Petr Vorel 0 siblings, 0 replies; 4+ messages in thread From: Petr Vorel @ 2021-01-21 15:03 UTC (permalink / raw) To: ltp Hi Xu, thanks for your review and more search in man page than I did! ... > > diff --git a/configure.ac b/configure.ac > > index e44e25cc6..17ef76c1a 100644 > > --- a/configure.ac > > +++ b/configure.ac > > @@ -94,6 +94,7 @@ AC_CHECK_FUNCS_ONCE([ \ > > io_uring_register \ > > io_uring_enter \ > > kcmp \ > > + mallopt \ > If glibc/ulibc supports mallopt, it also should support mallinfo. So only > check mallopt, I think it is ok. Yes. These are glibc specific and uclibc tries to be API compatible with glibc. > I guess musl libc doesn't support it, is it right? Correct, musl don't support it, neither binder. > > diff --git a/testcases/kernel/syscalls/mallopt/mallopt01.c b/testcases/kernel/syscalls/mallopt/mallopt01.c ... > > -/* > > - * NAME > > - * mallopt > > - * > > - * CALLS > > - * malloc(3x), mallopt(3x), mallinfo(3x). > > - * > > - * ALGORITHM > > - * Set options, malloc memory, and check resource ussage. > > +/*\ > > + * [DESCRIPTION] > > * > > - * RESTRICTIONS > > - */ > > + * Basic mallinfo() and mallopt() testing (M_MXFAST, M_NLBLKS). > > +\*/ > I see glibc code, it said "Only one of these (M_MXFAST) is used > in this malloc. The others (M_NLBLKS, M_GRAIN, M_KEEP) don't apply, > so setting them has no effect. But this malloc also supports four > other options in mallopt. " > Also, I don't see M_NLBLKS handle in __libc_mallopt. > I think that is why man-pages said "The SVID defined > options M_MXFAST, M_NLBLKS, M_GRAIN, and M_KEEP, but only the first of these > is implemented in glibc." > I guess we can remove useless M_NLBLKS test. Good catch! Agree. And it's also not supported on uclibc. ... > > info = mallinfo(); > The lastest mallinfo man-pages said " However, the older function, > mallinfo(), is deprecated since the type used for the fields is too small". > The mallinfo2 structure used size_t data type instead of int data type in > mallinfo struct. Maybe we can add a new test for it. +1. mallinfo2() was added few months ago to glibc by Martin Liska, released in 2.33. Kind regards, Petr ^ permalink raw reply [flat|nested] 4+ messages in thread
* [LTP] [PATCH 1/1] mallopt01: Rewrite to new API 2021-01-19 13:24 [LTP] [PATCH 1/1] mallopt01: Rewrite to new API Petr Vorel 2021-01-20 3:55 ` Yang Xu @ 2021-01-25 12:17 ` Petr Vorel 1 sibling, 0 replies; 4+ messages in thread From: Petr Vorel @ 2021-01-25 12:17 UTC (permalink / raw) To: ltp Hi Xu, thanks for your review, merged. Ticket for mallinfo2(): https://github.com/linux-test-project/ltp/issues/778 Kind regards, Petr ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-01-25 12:17 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-01-19 13:24 [LTP] [PATCH 1/1] mallopt01: Rewrite to new API Petr Vorel 2021-01-20 3:55 ` Yang Xu 2021-01-21 15:03 ` Petr Vorel 2021-01-25 12:17 ` Petr Vorel
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.