[LTP] [PATCH 2/6] syscalls/madvise02: Convert to new test API

Cyril Hrubis chrubis@suse.cz
Tue May 17 17:54:13 CEST 2016


Hi!
>  static void check_and_print(int expected_errno)
>  {
>  	if (TEST_RETURN == -1) {
>  		if (TEST_ERRNO == expected_errno)
> -			tst_resm(TPASS | TTERRNO, "failed as expected");
> +			tst_res(TPASS | TTERRNO, "failed as expected");
>  		else
> -			tst_resm(TFAIL | TTERRNO,
> +			tst_res(TFAIL | TTERRNO,
>  				 "failed unexpectedly; expected - %d : %s",
>  				 expected_errno, strerror(expected_errno));
>  	} else {
> -		tst_resm(TFAIL, "madvise succeeded unexpectedly");
> +		tst_res(TFAIL, "madvise succeeded unexpectedly");
>  	}
>  }
>  
> @@ -166,26 +125,26 @@ static void test_addr_einval(void)
>  {
>  	char *file;
>  
> -	file = SAFE_MMAP(cleanup, 0, st.st_size, PROT_READ,
> +	file = SAFE_MMAP(0, st.st_size, PROT_READ,
>  					 MAP_SHARED, fd, 0);
>  
>  	TEST(madvise(file + 100, st.st_size, MADV_NORMAL));
>  	check_and_print(EINVAL);
>  
> -	SAFE_MUNMAP(cleanup, file, st.st_size);
> +	SAFE_MUNMAP(file, st.st_size);
>  }

There is no readson to mmap the and unmap the file for each test, it
should be done once in the setup.

Also the testcases could be easily converted to a aray of structures
describing the test with one verify function taking a pointer to a
testcase describing structure.

>  static void test_advice_einval(void)
>  {
>  	char *file;
>  
> -	file = SAFE_MMAP(cleanup, 0, st.st_size, PROT_READ,
> +	file = SAFE_MMAP(0, st.st_size, PROT_READ,
>  					 MAP_SHARED, fd, 0);
>  
>  	TEST(madvise(file, st.st_size, 1212));
>  	check_and_print(EINVAL);
>  
> -	SAFE_MUNMAP(cleanup, file, st.st_size);
> +	SAFE_MUNMAP(file, st.st_size);
>  }
>  
>  #if !defined(UCLINUX)
> @@ -193,16 +152,16 @@ static void test_lock_einval(void)
>  {
>  	char *file;
>  
> -	file = SAFE_MMAP(cleanup, 0, st.st_size, PROT_READ,
> +	file = SAFE_MMAP(0, st.st_size, PROT_READ,
>  					 MAP_SHARED, fd, 0);
>  
>  	if (mlock(file, st.st_size) < 0)
> -		tst_brkm(TBROK | TERRNO, cleanup, "mlock failed");
> +		tst_brk(TBROK | TERRNO, "mlock failed");
>  
>  	TEST(madvise(file, st.st_size, MADV_DONTNEED));
>  	check_and_print(EINVAL);
>  
> -	SAFE_MUNMAP(cleanup, file, st.st_size);
> +	SAFE_MUNMAP(file, st.st_size);
>  }
>  #endif /* if !defined(UCLINUX) */
>  
> @@ -212,18 +171,18 @@ static void test_mergeable_einval(void)
>  	char *file;
>  
>  	if (access(KSM_SYS_DIR, F_OK) >= 0) {
> -		tst_resm(TCONF, "kernel configured with CONFIG_KSM, "
> +		tst_res(TCONF, "kernel configured with CONFIG_KSM, "
>  				 "skip EINVAL test for MADV_MERGEABLE.");
>  		return;
>  	}
>  
> -	file = SAFE_MMAP(cleanup, 0, st.st_size, PROT_READ,
> -					 MAP_SHARED, fd, 0);
> +	file = SAFE_MMAP(0, st.st_size, PROT_READ,
> +				 MAP_SHARED, fd, 0);
>  
>  	TEST(madvise(file, st.st_size, MADV_MERGEABLE));
>  	check_and_print(EINVAL);
>  
> -	SAFE_MUNMAP(cleanup, file, st.st_size);
> +	SAFE_MUNMAP(file, st.st_size);
>  }
>  #endif
>  
> @@ -233,18 +192,18 @@ static void test_unmergeable_einval(void)
>  	char *file;
>  
>  	if (access(KSM_SYS_DIR, F_OK) >= 0) {
> -		tst_resm(TCONF, "kernel configured with CONFIG_KSM, "
> +		tst_res(TCONF, "kernel configured with CONFIG_KSM, "
>  				 "skip EINVAL test for MADV_UNMERGEABLE.");
>  		return;
>  	}
>  
> -	file = SAFE_MMAP(cleanup, 0, st.st_size, PROT_READ,
> +	file = SAFE_MMAP(0, st.st_size, PROT_READ,
>  					 MAP_SHARED, fd, 0);
>  
>  	TEST(madvise(file, st.st_size, MADV_UNMERGEABLE));
>  	check_and_print(EINVAL);
>  
> -	SAFE_MUNMAP(cleanup, file, st.st_size);
> +	SAFE_MUNMAP(file, st.st_size);
>  }
>  #endif
>  
> @@ -254,10 +213,10 @@ static void test_enomem(void)
>  	char *high;
>  	unsigned long len;
>  
> -	low = SAFE_MMAP(cleanup, 0, st.st_size / 2, PROT_READ,
> +	low = SAFE_MMAP(0, st.st_size / 2, PROT_READ,
>  					MAP_SHARED, fd, 0);
>  
> -	high = SAFE_MMAP(cleanup, 0, st.st_size / 2, PROT_READ,
> +	high = SAFE_MMAP(0, st.st_size / 2, PROT_READ,
>  					 MAP_SHARED, fd, st.st_size / 2);
>  
>  	/* Swap if necessary to make low < high */
> @@ -270,12 +229,12 @@ static void test_enomem(void)
>  
>  	len = (high - low) + pagesize;
>  
> -	SAFE_MUNMAP(cleanup, high, st.st_size / 2);
> +	SAFE_MUNMAP(high, st.st_size / 2);

Well this whole part can be just done in two steps:

* mmap() the file as in the rest of the testcases
* unmap() last page of the mapping
* call madvise as in the rest of the testcases

>  	TEST(madvise(low, len, MADV_NORMAL));
>  	check_and_print(ENOMEM);
>  
> -	SAFE_MUNMAP(cleanup, low, st.st_size / 2);
> +	SAFE_MUNMAP(low, st.st_size / 2);

>  }
>  
>  static void test_ebadf(void)
> @@ -302,9 +261,29 @@ static void test_ebadf(void)
>  	 * prefretch.
>  	 */

The malloc() mess here could be changed to mmap() with MAP_ANOYMOUS.

>  	} else {
> -		tst_resm(TPASS, "madvise succeeded as expected, see "
> +		tst_res(TPASS, "madvise succeeded as expected, see "
>  				"kernel commit 1998cc0 for details.");
>  	}
>  
>  	free(ptr_memory_allocated);
>  }
> +
> +static void verify_madvise(unsigned int i)
> +{
> +	(*test_func[i])();
> +}
> +
> +static void cleanup(void)
> +{
> +	if (fd && close(fd) < 0)
> +		tst_res(TWARN | TERRNO, "close failed");
> +}
> +
> +static struct tst_test test = {
> +	.tid = "madvise02",
> +	.tcnt = ARRAY_SIZE(test_func),
> +	.test = verify_madvise,
> +	.needs_tmpdir = 1,
> +	.setup = setup,
> +	.cleanup = cleanup,
> +};
> -- 
> 1.8.3.1
> 
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp

-- 
Cyril Hrubis
chrubis@suse.cz


More information about the ltp mailing list