[PATCH] selftests/powerpc/mm: Add a test for virtual address mapping

Anshuman Khandual khandual at linux.vnet.ibm.com
Tue Apr 18 12:53:53 AEST 2017


On 04/17/2017 10:56 AM, Aneesh Kumar K.V wrote:
> Anshuman Khandual <khandual at linux.vnet.ibm.com> writes:
> 
>> This verifies virtual address mapping below and above the
>> 128TB range and makes sure that address returned are within
>> the expected range depending upon the hint passed from the
>> user space.
>>
>> Signed-off-by: Anshuman Khandual <khandual at linux.vnet.ibm.com>
>> ---
>> Tested this on latest ppc-next with Aneesh's yesterday's patch
>> which can be found at https://patchwork.ozlabs.org/patch/749510/
>>
>>  tools/testing/selftests/powerpc/mm/.gitignore |  3 +-
>>  tools/testing/selftests/powerpc/mm/Makefile   |  2 +-
>>  tools/testing/selftests/powerpc/mm/vaddr.c    | 89 +++++++++++++++++++++++++++
>>  3 files changed, 92 insertions(+), 2 deletions(-)
>>  create mode 100644 tools/testing/selftests/powerpc/mm/vaddr.c
>>
>> diff --git a/tools/testing/selftests/powerpc/mm/.gitignore b/tools/testing/selftests/powerpc/mm/.gitignore
>> index e715a3f..af1f31f 100644
>> --- a/tools/testing/selftests/powerpc/mm/.gitignore
>> +++ b/tools/testing/selftests/powerpc/mm/.gitignore
>> @@ -1,4 +1,5 @@
>>  hugetlb_vs_thp_test
>>  subpage_prot
>>  tempfile
>> -prot_sao
>> \ No newline at end of file
>> +prot_sao
>> +vaddr
>> diff --git a/tools/testing/selftests/powerpc/mm/Makefile b/tools/testing/selftests/powerpc/mm/Makefile
>> index 1cffe54..7345db2 100644
>> --- a/tools/testing/selftests/powerpc/mm/Makefile
>> +++ b/tools/testing/selftests/powerpc/mm/Makefile
>> @@ -1,7 +1,7 @@
>>  noarg:
>>  	$(MAKE) -C ../
>>
>> -TEST_GEN_PROGS := hugetlb_vs_thp_test subpage_prot prot_sao
>> +TEST_GEN_PROGS := hugetlb_vs_thp_test subpage_prot prot_sao vaddr
>>  TEST_GEN_FILES := tempfile
>>
>>  include ../../lib.mk
>> diff --git a/tools/testing/selftests/powerpc/mm/vaddr.c b/tools/testing/selftests/powerpc/mm/vaddr.c
>> new file mode 100644
>> index 0000000..d6485e9
>> --- /dev/null
>> +++ b/tools/testing/selftests/powerpc/mm/vaddr.c
>> @@ -0,0 +1,89 @@
>> +/*
>> + * Copyright 2017, Anshuman Khandual, IBM Corp.
>> + * Licensed under GPLv2.
>> + */
>> +
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +#include <string.h>
>> +#include <unistd.h>
>> +#include <errno.h>
>> +#include <numaif.h>
>> +#include <sys/mman.h>
>> +#include <sys/time.h>
>> +#include "utils.h"
>> +
>> +#define PAGE_SIZE        65536UL  /* 64KB */
>> +#define MAP_SIZE_16GB    262144UL /* 16GB  */
> 
> can we make it MMAP_CHUNK_SIZE ?

Sure, will do.

> 
>> +#define NR_SLICES_128TB  8192UL   /* 128TB */
> 
> NR_CHUNK_128TB ?

Sure, will do.

> 
>> +#define NR_SLICES_384TB  24576UL  /* 384TB */
> 
> Can you add more comments around that. Those numbers/names have special
> meaning on powerpc. I guess you are not doing anything related that.
> Hence rename slices to something else or add a comment saying how many
> 16GB slices. 

Sure will rename as CHUNKS instead.

> Also explain why you are taking 16GB as the size.

Sure, will do.

> 
>> +#define ADDR_MARK_128TB  0x800000000000UL /* Beyond 128TB */
>> +
>> +static char *hind_addr(void)
>> +{
>> +	int bits = 48 + rand() % 15;
>> +
>> +	return (char *) (1UL << bits);
>> +}
>> +
>> +static int validate_addr(char *ptr, int high_addr)
>> +{
>> +	unsigned long addr = (unsigned long) ptr;
>> +
>> +	if (high_addr) {
>> +		if (addr < ADDR_MARK_128TB) {
>> +			printf("Bad address %lx\n", addr);
>> +			return 1;
>> +		}
>> +		return 0;
>> +	}
>> +
>> +	if (addr > ADDR_MARK_128TB) {
>> +		printf("Bad address %lx\n", addr);
>> +		return 1;
>> +	}
>> +	return 0;
>> +}
>> +
>> +int vaddr(void)
>> +{
>> +	char *ptr[NR_SLICES_128TB];
>> +	char *hptr[NR_SLICES_384TB];
>> +	char *hint;
>> +	int  i;
>> +
>> +	for (i = 0; i < NR_SLICES_128TB; i++) {
>> +		ptr[i] = mmap(NULL, MAP_SIZE_16GB, PROT_READ | PROT_WRITE,
>> +					MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
>> +
>> +		if (ptr[i] == MAP_FAILED)
>> +			break;
>> +
>> +		if (validate_addr(ptr[i], 0))
>> +			return 1;
>> +	}
>> +
>> +	for (i = 0; i < NR_SLICES_384TB; i++) {
>> +		hint = hind_addr();
> 
> Why add rand() why not a constant value ?

Because it can test hint address range starting from 128TB till 2^64.

> 
>> +		hptr[i] = mmap(hint, MAP_SIZE_16GB, PROT_READ | PROT_WRITE,
>> +					MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
>> +
>> +		if (hptr[i] == MAP_FAILED)
>> +			break;
>> +
>> +		if (validate_addr(hptr[i], 1))
>> +			return 1;
>> +	}
> 
> We can also add check to make sure mmap fail if we passed a hint addr
> below 128TB ? 

After all of the range lower to the 128TB address is mapped ?



More information about the Linuxppc-dev mailing list