[LTP] [PATCH 1/1] mallopt01: Rewrite to new API

Yang Xu xuyang2018.jy@cn.fujitsu.com
Wed Jan 20 04:55:05 CET 2021


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





More information about the ltp mailing list