コード例 #1
0
static int thread_func(void *data)
{
	thread_running = 1;
	cacheperf();
	thread_running = 0;

	return 0;
}
コード例 #2
0
ファイル: cache_perf.c プロジェクト: 0x7678/SJKernel-gn2
static int perfmain(void)
{
	phys_addr_t dmasrc, dmadst;
	void *srcbuf[MT_MAX];
	void *dstbuf[MT_MAX];
	u32 xfer_size;

	srcbuf[MT_WBWA] = kmalloc(END_SIZE, GFP_KERNEL);
	dstbuf[MT_WBWA] = kmalloc(END_SIZE, GFP_KERNEL);
	srcbuf[MT_NC] = dma_alloc_writecombine(
			NULL, mcpy_size, &dmasrc, GFP_KERNEL);
	dstbuf[MT_NC] = dma_alloc_writecombine(
			NULL, mcpy_size, &dmadst, GFP_KERNEL);
	if (!srcbuf[MT_WBWA] && !srcbuf[MT_NC] &&
			!dstbuf[MT_WBWA] && !dstbuf[MT_NC]) {
		printk(KERN_ERR "Memory allocation error!\n");
		dma_free_coherent(NULL, mcpy_size, srcbuf[MT_NC], dmasrc);
		dma_free_coherent(NULL, mcpy_size, dstbuf[MT_NC], dmadst);
		kfree(srcbuf[MT_WBWA]);
		kfree(dstbuf[MT_WBWA]);
		return 0;
	}

	if (mcpy) {
		printk(KERN_INFO "## Memcpy perf (ns, unit tr size: %dKB)\n",
				mcpy_size/SZ_1K);

		if (mcpy >= MT_SO) {
			printk(KERN_INFO "1. SO type\n");
			srcbuf[MT_SO] = remap_vm(dmasrc, mcpy_size,
					pgprot_noncached(PAGE_KERNEL));
			dstbuf[MT_SO] = remap_vm(dmadst, mcpy_size,
					pgprot_noncached(PAGE_KERNEL));
			xfer_size = START_SIZE;
			while (xfer_size <= END_SIZE) {
				memcpyperf(srcbuf[MT_SO], dstbuf[MT_SO],
					xfer_size, 10);
				xfer_size *= 2;
			}
			vunmap(srcbuf[MT_SO]);
			vunmap(dstbuf[MT_SO]);
		}

		if (mcpy >= MT_NC) {
			printk(KERN_INFO "2. Normal NCNB type\n");
			xfer_size = START_SIZE;
			while (xfer_size <= END_SIZE) {
				memcpyperf(srcbuf[MT_NC], dstbuf[MT_NC],
					xfer_size, 10);
				xfer_size *= 2;
			}
		}

		printk(KERN_INFO "3. Cache memcpy\n");
		printk(KERN_INFO "scramble size:");
		memcpyperf(srcbuf[MT_WBWA], dstbuf[MT_WBWA],
			SCRAMBLE_SIZE, try_cnt);
		memset(dstbuf[MT_WBWA], 0x0, SCRAMBLE_SIZE);

		printk(KERN_INFO "small size:");
		memcpyperf(srcbuf[MT_WBWA], dstbuf[MT_WBWA],
			SMALL_SIZE, try_cnt);
		memset(dstbuf[MT_WBWA], 0x0, SMALL_SIZE);

		printk(KERN_INFO "size (%d ~ %d)\n ", START_SIZE, END_SIZE);
		xfer_size = START_SIZE;
		while (xfer_size <= END_SIZE) {
			memcpyperf(srcbuf[MT_WBWA], dstbuf[MT_WBWA],
				xfer_size, try_cnt);
			xfer_size *= 2;
		}
	}

	if (cm) {
		printk(KERN_INFO "## Memcpy perf (ns)\n");

		printk(KERN_INFO "1. Clean perf\n");
		cacheperf(srcbuf[MT_WBWA], CM_CLEAN);

		printk(KERN_INFO "2. Invalidate perf\n");
		cacheperf(srcbuf[MT_WBWA], CM_INV);

		printk(KERN_INFO "3. Flush perf\n");
		cacheperf(srcbuf[MT_WBWA], CM_FLUSH);

		printk(KERN_INFO "4. Flush all perf\n");
		cacheperf(srcbuf[MT_WBWA], CM_FLUSHALL);
	}

	dma_free_coherent(NULL, mcpy_size, srcbuf[MT_NC], dmasrc);
	dma_free_coherent(NULL, mcpy_size, dstbuf[MT_NC], dmadst);
	kfree(srcbuf[MT_WBWA]);
	kfree(dstbuf[MT_WBWA]);

	return 0;
}