• Ming Lei's avatar
    ARM: 7730/1: DMA-mapping: mark all !DMA_TO_DEVICE pages in unmapping as clean · b2a234ed
    Ming Lei authored
    It is common for one sg to include many pages, so mark all these
    pages as clean to avoid unnecessary flushing on them in
    set_pte_at() or update_mmu_cache().
    
    The patch might improve loading performance of applciation code a bit.
    
    On the below test code to read file(~1GByte size) from usb mass storage
    disk to buffer created with mmap(PROT_READ | PROT_EXEC) on
    Pandaboard, average ~1% improvement can be observed with the patch on
    10 times test.
    
    unsigned int sum = 0;
    static unsigned long tv_diff(struct timeval *tv1, struct timeval *tv2)
    {
    	return (tv2->tv_sec - tv1->tv_sec) * 1000000 + (tv2->tv_usec - tv1->tv_usec);
    }
    int main(int argc, char *argv[])
    {
    	char *mbuffer;
    	int fd;
    	int i;
    	unsigned long page_size, size;
    	struct stat stat;
    	struct timeval t1, t2;
    
    	page_size = getpagesize();
    	fd = open(argv[1], O_RDONLY);
    	assert(fd >= 0);
    
    	fstat(fd, &stat);
    	size = stat.st_size;
    	printf("%s: file %s, file size %lu, page size %lun", argv[0],
    	        read_filename, size, page_size);
    
    	gettimeofday(&t1, NULL);
    	mbuffer = mmap(NULL, size, PROT_READ | PROT_EXEC, MAP_SHARED, fd, 0);
    	for (i = 0 ; i < size ; i += page_size)
    	        sum += mbuffer[i];
    	munmap(mbuffer, page_size);
    	gettimeofday(&t2, NULL);
    	printf("tread mmaped time: %luusn", tv_diff(&t1, &t2));
    
    	close(fd);
    }
    Acked-by: default avatarNicolas Pitre <nicolas.pitre@linaro.org>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Marek Szyprowski <m.szyprowski@samsung.com>
    Signed-off-by: default avatarMing Lei <ming.lei@canonical.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    b2a234ed
dma-mapping.c 50.6 KB