kernel-ark/arch/arm
Ming Lei 81f28946a8 ARM: 7746/1: mm: lazy cache flushing on non-mapped pages
Currently flush_dcache_page() thinks pages as non-mapped if
mapping_mapped(mapping) return false. This approach is very
coase:
	- mmap on part of file may cause all pages backed on
	the file being thought as mmaped

	- file-backed pages aren't mapped into user space actually
	if the memory mmaped on the file isn't accessed

This patch uses page_mapped() to decide if the page has been
mapped.

From the attached test code, I find there is much performance
improvement(>25%) when accessing page caches via read under this
situations, so memcpy benefits a lot from not flushing cache
under this situation.

No.   read time without the patch	No. read time with the patch
================================================================
No. 0, time  22615636 us		No. 0, time  22014717 us
No. 1, time  4387851 us 		No. 1, time  3113184 us
No. 2, time  4276535 us 		No. 2, time  3005244 us
No. 3, time  4259821 us 		No. 3, time  3001565 us
No. 4, time  4263811 us 		No. 4, time  3002748 us
No. 5, time  4258486 us 		No. 5, time  3004104 us
No. 6, time  4253009 us 		No. 6, time  3002188 us
No. 7, time  4262809 us 		No. 7, time  2998196 us
No. 8, time  4264525 us 		No. 8, time  3007255 us
No. 9, time  4267795 us 		No. 9, time  3005094 us

1), No.0. is to read the file from storage device, and others are
to read the file from page caches basically.
2), file size is 512M, and is on ext4 over usb mass storage.
3), the test is done on Pandaboard.

unsigned int  sum = 0;
unsigned long sum_val = 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 *mbuf, fbuf;
	int fd;
	int i;
	unsigned long page_size, size;
	struct stat stat;
	struct timeval t1, t2;
	unsigned char *rbuf = malloc(32 * page_size);

	if (!rbuf) {
		printf("	%sn", "malloc failed");
		exit(-1);
	}

	page_size = getpagesize();
	fd = open(argv[1], O_RDWR);
	assert(fd >= 0);

	fstat(fd, &stat);
	size = stat.st_size;
	printf("%s: file %s, size %lu, page size %lun",
		argv[0],
		argv[1], size, page_size);

	gettimeofday(&t1, NULL);
	mbuf = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
	if (!mbuf) {
		printf("	%sn", "mmap failed");
		exit(-1);
	}

	for (i = 0 ; i < size ; i += (page_size * 32)) {
		int rcnt;
		lseek(fd, i, SEEK_SET);
		rcnt = read(fd, rbuf, page_size * 32);
		if (rcnt != page_size * 32) {
			printf("%s: read faildn", __func__);
			exit(-1);
		}
	}
	free(rbuf);
	munmap(mbuf, size);
	gettimeofday(&t2, NULL);
	printf("tread mmaped time: %luusn", tv_diff(&t1, &t2));

	close(fd);
}

Cc: Michel Lespinasse <walken@google.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Nicolas Pitre <nicolas.pitre@linaro.org>
Reviewed-by: Will Deacon <will.deacon@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Ming Lei <ming.lei@canonical.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2013-06-05 23:37:32 +01:00
..
boot ARM: 7716/1: bcm281xx: Add L2 support for Rev A2 chips 2013-05-15 19:39:27 +01:00
common ARM: arm-soc: late cleanups 2013-05-07 11:22:14 -07:00
configs Omap fixes for things that were discovered during the merge window: 2013-05-09 13:13:57 -07:00
crypto
include ARM: 7728/1: mm: Use phys_addr_t properly for ioremap functions 2013-05-23 00:09:44 +01:00
kernel ARM: 7669/1: keep __my_cpu_offset consistent with generic one 2013-05-15 19:35:52 +01:00
kvm Merge tag 'kvm-3.10-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm 2013-05-05 14:47:31 -07:00
lib
mach-at91 ARM: arm-soc: late cleanups 2013-05-07 11:22:14 -07:00
mach-bcm ARM: platform specific firmware interfaces for 3.10 2013-05-04 12:33:36 -07:00
mach-bcm2835
mach-clps711x
mach-cns3xxx ARM: arm-soc multiplatform updates for 3.10 2013-05-02 09:38:16 -07:00
mach-davinci ARM: arm-soc device tree changes, part 2 2013-05-07 11:06:17 -07:00
mach-dove arm: mach-dove: convert to use mvebu-mbus driver 2013-04-15 14:06:27 +00:00
mach-ebsa110 ARM: 7728/1: mm: Use phys_addr_t properly for ioremap functions 2013-05-23 00:09:44 +01:00
mach-ep93xx
mach-exynos ARM: EXYNOS5: Fix kernel dump in AFTR idle mode 2013-05-09 13:22:22 -07:00
mach-footbridge
mach-gemini ARM: arm-soc cleanup for 3.10 2013-05-02 09:03:55 -07:00
mach-highbank ARM: arm-soc: late cleanups 2013-05-07 11:22:14 -07:00
mach-imx ARM: 7728/1: mm: Use phys_addr_t properly for ioremap functions 2013-05-23 00:09:44 +01:00
mach-integrator ARM: arm-soc: late cleanups 2013-05-07 11:22:14 -07:00
mach-iop13xx ARM: 7728/1: mm: Use phys_addr_t properly for ioremap functions 2013-05-23 00:09:44 +01:00
mach-iop32x
mach-iop33x
mach-ixp4xx ARM: 7728/1: mm: Use phys_addr_t properly for ioremap functions 2013-05-23 00:09:44 +01:00
mach-kirkwood ARM: arm-soc platform updates for 3.10, part 3 2013-05-07 11:02:18 -07:00
mach-ks8695
mach-lpc32xx
mach-mmp ARM: arm-soc board specific changes for 3.10, part 1 2013-05-04 12:34:30 -07:00
mach-msm ARM: 7728/1: mm: Use phys_addr_t properly for ioremap functions 2013-05-23 00:09:44 +01:00
mach-mv78xx0 arm: mach-mv78xx0: convert to use the mvebu-mbus driver 2013-04-15 14:06:39 +00:00
mach-mvebu ARM: arm-soc: late cleanups 2013-05-07 11:22:14 -07:00
mach-mxs ARM: arm-soc device tree changes, part 2 2013-05-07 11:06:17 -07:00
mach-netx
mach-nomadik clocksource: nomadik-mtu: fix up clocksource/timer 2013-04-26 17:10:46 -07:00
mach-omap1 ARM: OMAP1: DMA: fix error handling in omap1_system_dma_init() 2013-05-08 16:48:02 -07:00
mach-omap2 Omap fixes for things that were discovered during the merge window: 2013-05-09 13:13:57 -07:00
mach-orion5x ARM: arm-soc platform updates for 3.10, part 3 2013-05-07 11:02:18 -07:00
mach-picoxcell
mach-prima2 Merge branch 'late/fixes' into fixes 2013-05-09 13:05:15 -07:00
mach-pxa - Lots of cleanups from Artem, including deletion of some obsolete drivers 2013-05-09 10:15:46 -07:00
mach-realview Merge branch 'for-linus' of git://git.linaro.org/people/rmk/linux-arm 2013-05-03 09:13:19 -07:00
mach-rpc
mach-s3c24xx ARM: arm-soc driver changes for 3.10 2013-05-04 12:31:18 -07:00
mach-s3c64xx For 3.10 we have a few new MFD drivers for: 2013-05-05 17:36:20 -07:00
mach-s5p64x0 Merge branch 'samsung/exynos-multiplatform' into next/drivers 2013-04-19 16:50:56 +02:00
mach-s5pc100 ARM: arm-soc driver changes for 3.10 2013-05-04 12:31:18 -07:00
mach-s5pv210 ARM: arm-soc driver changes for 3.10 2013-05-04 12:31:18 -07:00
mach-sa1100 cpufreq: sa11x0: move cpufreq driver to drivers/cpufreq 2013-04-10 13:19:24 +02:00
mach-shark arm: Use generic idle loop 2013-04-08 17:39:24 +02:00
mach-shmobile ARM: arm-soc: late cleanups 2013-05-07 11:22:14 -07:00
mach-socfpga Merge branch 'gic/cleanup' into next/soc 2013-04-28 15:06:56 -07:00
mach-spear Merge branch 'late/fixes' into fixes 2013-05-09 13:05:15 -07:00
mach-sunxi ARM: sunxi: Rework the restart code 2013-04-08 21:43:08 +02:00
mach-tegra Merge branch 'late/fixes' into fixes 2013-05-09 13:05:15 -07:00
mach-u300 ARM: u300: fix ages old copy/paste bug 2013-04-26 17:07:38 -07:00
mach-ux500 ARM: ux500: Rid ignored return value of regulator_enable() compiler warning 2013-05-09 13:10:10 -07:00
mach-versatile ARM: versatile: use OF init for sp804 timer 2013-04-11 15:11:21 -05:00
mach-vexpress Moves xenvm to mach-virt. 2013-05-07 15:11:43 -07:00
mach-virt Moves xenvm to mach-virt. 2013-05-07 15:11:43 -07:00
mach-vt8500 irqchip: vt8500: Convert arch-vt8500 to new irqchip infrastructure 2013-04-12 22:43:24 -07:00
mach-w90x900 arm: Use generic idle loop 2013-04-08 17:39:24 +02:00
mach-zynq ARM: arm-soc platform updates for 3.10, part 3 2013-05-07 11:02:18 -07:00
mm ARM: 7746/1: mm: lazy cache flushing on non-mapped pages 2013-06-05 23:37:32 +01:00
net
nwfpe
oprofile
plat-iop
plat-omap ARM: arm-soc device tree changes, part 2 2013-05-07 11:06:17 -07:00
plat-orion Removal of GENERIC_GPIO for v3.10 2013-05-09 09:59:16 -07:00
plat-pxa
plat-samsung ARM: late Exynos multiplatform changes 2013-05-07 11:28:42 -07:00
plat-versatile
tools
vfp
xen xen/arm: remove duplicated include from enlighten.c 2013-04-27 14:57:17 +00:00
Kconfig Merge branch 'late/fixes' into fixes 2013-05-09 13:05:15 -07:00
Kconfig-nommu
Kconfig.debug ARM: arm-soc platform updates for 3.10, part 3 2013-05-07 11:02:18 -07:00
Makefile ARM: arm-soc multiplatform updates for 3.10 2013-05-02 09:38:16 -07:00