[dpdk-dev] [PATCH v6 3/4] test: add test case to validate VFIO DMA map/unmap

David Christensen drc at linux.vnet.ibm.com
Tue Jan 5 20:33:20 CET 2021


Hey Nithin,

>> +static int
>> +test_memory_vfio_dma_map(void)
>> +{
>> +	uint64_t sz1, sz2, sz = 2 * rte_mem_page_size();
>> +	uint64_t unmap1, unmap2;
>> +	uint8_t *alloc_mem;
>> +	uint8_t *mem;
>> +	int ret;
>> +
>> +	/* Allocate twice size of requirement from heap to align later */
>> +	alloc_mem = malloc(sz * 2);
>> +	if (!alloc_mem) {
>> +		printf("Skipping test as unable to alloc %"PRIx64"B from heap\n",
>> +		       sz * 2);
>> +		return 1;
>> +	}
>> +
>> +	/* Force page allocation */
>> +	memset(alloc_mem, 0, sz * 2);
>> +
>> +	mem = RTE_PTR_ALIGN(alloc_mem, rte_mem_page_size());
>> +
>> +	/* map the whole region */
>> +	ret = rte_vfio_container_dma_map(RTE_VFIO_DEFAULT_CONTAINER_FD,
>> +					 (uintptr_t)mem, (rte_iova_t)mem, sz);

I'm not sure how to resolve this patch for POWER systems.  The patch 
currently fails with the error:

EAL:   cannot map vaddr for IOMMU, error 22 (Invalid argument)

The problem is that the size argument (page size of 64KB * 2) is smaller 
than the page size set when the DMA window is created (2MB or 1GB 
depending on system configuration for hugepages), resulting in the 
EINVAL error.  When I tried bumping the sz value up to 2 * 1GB the test 
also failed because the VA address was well outside the DMA window set 
when scanning memseg lists.

Allocating heap memory dynamically through the EAL works since it's 
allocated in hugepage size segments and the EAL attempts to keep VA 
memory addresses contiguous, therefore within the defined DMA window. 
But the downside is that the memory is DMA mapped behind the scenes in 
vfio_mem_event_callback().

Not sure how to get around this without duplicating a lot of the heap 
management code in your test.  Maybe others have a suggestion.

Dave


More information about the dev mailing list