public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Tejun Heo <tj@kernel.org>
To: mingo@elte.hu, rusty@rustcorp.com.au, tglx@linutronix.de,
	x86@kernel.org, linux-kernel@vger.kernel.org, hpa@zytor.com,
	Paul Mundt <lethal@linux-sh.org>,
	rmk@arm.linux.org.uk, starvik@axis.com, ralf@linux-mips.org,
	davem@davemloft.net, cooloney@kernel.org, kyle@mcmartin.ca,
	matthew@wil.cx, grundler@parisc-linux.org, takata@linux-m32r.org,
	benh@kernel.crashing.org, rth@twiddle.net,
	ink@jurassic.park.msu.ru, schwidefsky@de.ibm.com,
	heiko.carstens@de.ibm.com
Subject: test module to verify percpu allocator
Date: Tue, 10 Mar 2009 16:57:28 +0900	[thread overview]
Message-ID: <49B61D68.9090908@kernel.org> (raw)
In-Reply-To: <1236671631-9305-1-git-send-email-tj@kernel.org>

[-- Attachment #1: Type: text/plain, Size: 160 bytes --]

Hello, again.

Attached is the test module to test percpu allocator.  Just build as
an external module and load/unload to perform the test.

Thanks.

-- 
tejun

[-- Attachment #2: test_module.c --]
[-- Type: text/x-csrc, Size: 5161 bytes --]

#include <linux/module.h>
#include <linux/device.h>
#include <linux/sysfs.h>
#include <linux/percpu.h>

static inline void pcpu_dump_chunk_slots(void) {}

struct alloc_cmd {
	size_t size;
	int marker;
};

static const struct alloc_cmd cmds[] = {
	{  256, 0 }, {  256, 1 }, {  256, 0 }, {  256, 1 },
	{  256, 0 }, {  256, 1 }, {  256, 0 }, {  256, 1 },
	{  256, 0 }, {  256, 1 }, {  256, 0 }, {  256, 1 },
	{  256, 0 }, {  256, 1 }, {  256, 0 }, {  256, 1 },
	{  256, 0 }, {  256, 1 }, {  256, 0 }, {  256, 1 },
	{  256, 0 }, {  256, 1 }, {  256, 0 }, {  256, 1 },
	{  256, 0 }, {  256, 1 }, {  256, 0 }, {  256, 1 },
	{  256, 0 }, {  256, 1 }, {  256, 0 }, {  256, 1 },	/* 8k */

	{ 1024, 2 }, { 1024, 2 }, { 1024, 2 }, { 1024, 2 },
	{ 1024, 2 }, { 1024, 2 }, { 1024, 2 }, { 1024, 2 },
	{ 1024, 2 }, { 1024, 2 }, { 1024, 2 }, { 1024, 2 },
	{ 1024, 2 }, { 1024, 2 }, { 1024, 2 }, { 1024, 2 },
	{ 1024, 2 }, { 1024, 2 }, { 1024, 2 }, { 1024, 2 },
	{ 1024, 2 }, { 1024, 2 }, { 1024, 2 }, { 1024, 2 },
	{ 1024, 2 }, { 1024, 2 }, { 1024, 2 }, { 1024, 2 },
	{ 1024, 2 }, { 1024, 2 }, { 1024, 2 }, { 1024, 2 },	/* 32k */

	{ 8192, 3 }, { 8192, 3 }, { 8192, 3 }, { 8192, 3 },
	{ 8192, 3 }, { 8192, 3 }, { 8192, 3 }, { 8192, 3 },
	{ 8192, 3 }, { 8192, 3 }, { 8192, 3 }, { 8192, 3 },
	{ 8192, 3 }, { 8192, 3 }, { 8192, 3 }, { 8192, 3 },
	{ 8192, 3 }, { 8192, 3 }, { 8192, 3 }, { 8192, 3 },
	{ 8192, 3 }, { 8192, 3 }, { 8192, 3 }, { 8192, 3 },
	{ 8192, 3 }, { 8192, 3 }, { 8192, 3 }, { 8192, 3 },
	{ 8192, 3 }, { 8192, 3 }, { 8192, 3 }, { 8192, 3 },	/* 128k */

	{ 0, 0 },	/* free 0s */

	{  128, 4 }, {  128, 4 }, {  128, 4 }, {  128, 4 },
	{  128, 4 }, {  128, 4 }, {  128, 4 }, {  128, 4 },
	{  128, 4 }, {  128, 4 }, {  128, 4 }, {  128, 4 },
	{  128, 4 }, {  128, 4 }, {  128, 4 }, {  128, 4 },
	{  128, 4 }, {  128, 4 }, {  128, 4 }, {  128, 4 },
	{  128, 4 }, {  128, 4 }, {  128, 4 }, {  128, 4 },
	{  128, 4 }, {  128, 4 }, {  128, 4 }, {  128, 4 },
	{  128, 4 }, {  128, 4 }, {  128, 4 }, {  128, 4 },
	{  128, 4 }, {  128, 4 }, {  128, 4 }, {  128, 4 },	/* 4.5k */

	{ 0, 1 },	/* free 1s */

	{ 1024, 5 }, { 1024, 5 }, { 1024, 5 }, { 1024, 5 },	/* 4k */

	{ 0, 5 },	/* free 5s */
	{ 0, 4 },
	{ 0, 3 },
	{ 0, 2 },
};

#define NR_CMDS		ARRAY_SIZE(cmds)

static void *ptrs[NR_CMDS];

static unsigned long seed_val(unsigned int cmdno, unsigned int cpu)
{
	return 0xdeadbeefbeefdeadULL
		+ cmdno + (cmdno << 16) + (cpu << 8) + (cpu << 24);
}

static void fill_area(void *p, size_t size, unsigned int cmdno)
{
	unsigned int cpu;

	for_each_possible_cpu(cpu) {
		unsigned long v = seed_val(cmdno, cpu);
		unsigned long *up = per_cpu_ptr(p, cpu);
		size_t left = size;

		while (left >= sizeof(unsigned long)) {
			*up++ = v++;
			left -= sizeof(unsigned long);
		}
	}
}

static void verify_area(void *p, size_t size, unsigned int cmdno)
{
	unsigned int warns = 5;
	unsigned int cpu;

	for_each_possible_cpu(cpu) {
		unsigned long v = seed_val(cmdno, cpu);
		unsigned long *up = per_cpu_ptr(p, cpu);
		size_t left = size;

		while (left >= sizeof(unsigned long)) {
			if (*up != v && warns-- > 0) {
				printk("MISMATCH: cmdno=%u size=%zu cpu=%u off=%zu p=%p\n",
				       cmdno, size, cpu, size - left, p);
				printk("          [%p]=%lx should be %lx\n",
				       up, *up, v);
			}
			up++; v++;
			left -= sizeof(unsigned long);
		}
	}
}

static void free_cmd(unsigned int cmdno)
{
	if (!ptrs[cmdno])
		return;

	verify_area(ptrs[cmdno], cmds[cmdno].size, cmdno);
	free_percpu(ptrs[cmdno]);
	ptrs[cmdno] = NULL;
}

static void run_test(void)
{
	unsigned int i, j;

	for (i = 0; i < NR_CMDS; i++) {
		const struct alloc_cmd *cmd = &cmds[i];

		if (cmd->size) {
			printk("ALLOC: %zu bytes marker=%d\n",
			       cmd->size, cmd->marker);
			ptrs[i] = __alloc_percpu(cmd->size,
					__alignof__(unsigned long long));
			if (ptrs[i])
				fill_area(ptrs[i], cmd->size, i);
			else
				printk("failed to allocate %zu bytes\n",
				       cmd->size);
			continue;
		}

		printk("FREE: marker=%d\n", cmd->marker);
		pcpu_dump_chunk_slots();
		for (j = 0; j < i; j++)
			if (cmds[j].marker == cmd->marker)
				free_cmd(j);
		printk("FREE: done\n");
		pcpu_dump_chunk_slots();
	}
}

struct stupid_large_alignment_struct {
	int a;
	int b;
	int c;
} __aligned(2048);

struct stupid_large_struct {
	char a[1024];
};

static DEFINE_PER_CPU(struct stupid_large_alignment_struct, blah_blah);
DEFINE_PER_CPU(struct stupid_large_struct, blah_blah2);
DEFINE_PER_CPU(struct stupid_large_struct, blah_blah3);
DEFINE_PER_CPU(struct stupid_large_struct, blah_blah4);
DEFINE_PER_CPU(struct stupid_large_struct, blah_blah5);
DEFINE_PER_CPU(struct stupid_large_struct, blah_blah6);

static int __init test_init(void)
{
	unsigned int cpu;

	printk("XXX test_pcpu:");
	for_each_possible_cpu(cpu)
		printk(" %p", &per_cpu(blah_blah, cpu));
	printk("\n");
	pcpu_dump_chunk_slots();

	run_test();
	return 0;
}

static void __exit test_exit(void)
{
	unsigned int i;

	printk("XXX cleaning up\n");
	pcpu_dump_chunk_slots();

	for (i = 0; i < NR_CMDS; i++)
		free_cmd(i);

	printk("XXX done\n");
	pcpu_dump_chunk_slots();
}

module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");

  parent reply	other threads:[~2009-03-10  7:58 UTC|newest]

Thread overview: 95+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-10  7:53 [GIT RFC] percpu: use dynamic percpu allocator as the default percpu allocator Tejun Heo
2009-03-10  7:53 ` [PATCH 1/5] linker script: define __per_cpu_load on all SMP capable archs Tejun Heo
2009-03-10  7:53 ` [PATCH 2/5] percpu: make x86 addr <-> pcpu ptr conversion macros generic Tejun Heo
2009-03-10  7:53 ` [PATCH 3/5] percpu: more flexibility for @dyn_size of pcpu_setup_first_chunk() Tejun Heo
2009-03-10  7:53 ` [PATCH 4/5] percpu: generalize embedding first chunk setup helper Tejun Heo
2009-03-10  7:53 ` [PATCH 5/5] percpu: use dynamic percpu allocator as the default percpu allocator Tejun Heo
2009-03-10  7:57 ` Tejun Heo [this message]
2009-03-10 10:59 ` [GIT RFC] " David Miller
2009-03-11  6:03   ` Tejun Heo
2009-03-11  5:56 ` [GIT PULL] pull request for safe part Tejun Heo
2009-03-16 18:01 ` [GIT RFC] percpu: use dynamic percpu allocator as the default percpu allocator Martin Schwidefsky
2009-03-20  2:35   ` Tejun Heo
2009-03-24 15:22     ` Tejun Heo
2009-03-25 11:27       ` Martin Schwidefsky
2009-03-25 11:51         ` Tejun Heo
2009-03-25 12:22           ` Ingo Molnar
2009-03-25 12:27             ` Tejun Heo
2009-03-25 12:39               ` Ingo Molnar
2009-03-25 13:13               ` Martin Schwidefsky
2009-03-25 13:21                 ` Tejun Heo
2009-03-25 13:25                   ` Martin Schwidefsky
2009-03-25 13:34                     ` Tejun Heo
2009-03-31 16:54                       ` Martin Schwidefsky
2009-03-31 17:20                         ` Christoph Lameter
2009-03-31 20:18                           ` Martin Schwidefsky
2009-03-31 21:10                             ` Christoph Lameter
2009-04-01  8:01                               ` Martin Schwidefsky
2009-03-31 19:17                         ` Ivan Kokshaysky
2009-03-31 20:19                           ` Martin Schwidefsky
2009-03-31 20:29                             ` Ivan Kokshaysky
2009-04-01  0:07                         ` Tejun Heo
2009-04-01  8:10                           ` Martin Schwidefsky
2009-04-01  8:17                             ` Tejun Heo
2009-04-01  8:32                               ` Martin Schwidefsky
2009-04-01  8:37                                 ` David Miller
2009-04-01  8:47                                   ` Martin Schwidefsky
2009-04-01  8:50                                     ` Tejun Heo
2009-04-01  9:08                                       ` Martin Schwidefsky
2009-04-02  1:54                                         ` Tejun Heo
2009-04-01  8:53                                     ` David Miller
2009-04-01  8:53                                 ` Tejun Heo
2009-04-01 11:07                                   ` Martin Schwidefsky
2009-04-02  1:57                                     ` Tejun Heo
2009-04-02  7:24                                       ` Ivan Kokshaysky
2009-04-02 11:13                                         ` Martin Schwidefsky
2009-04-03  0:31                                           ` Tejun Heo
2009-04-07 16:09                                             ` Ivan Kokshaysky
2009-04-08 20:18                                               ` Tejun Heo
2009-04-09  9:47                                                 ` Ivan Kokshaysky
2009-04-09 11:53                                                   ` Tejun Heo
2009-04-11  1:38                                                     ` Rusty Russell
2009-04-11  1:52                                                       ` Tejun Heo
2009-04-02  0:20                               ` Rusty Russell
2009-03-25 14:00           ` Martin Schwidefsky
2009-03-25 14:14             ` Tejun Heo
2009-03-30 10:07               ` [PATCH UPDATED] " Tejun Heo
2009-03-30 10:42                 ` Martin Schwidefsky
2009-04-01  0:08                   ` Tejun Heo
2009-03-30 11:49                 ` Ingo Molnar
2009-03-30 14:50                   ` Christoph Lameter
2009-03-31 16:12                     ` Christoph Lameter
2009-04-01  0:15                       ` Tejun Heo
2009-04-01 13:49                         ` Christoph Lameter
2009-04-01 15:49                           ` Ingo Molnar
2009-04-01 18:06                             ` Christoph Lameter
2009-04-01 19:01                               ` Ingo Molnar
2009-04-01 19:39                                 ` Linus Torvalds
2009-04-01 20:12                                   ` Matthew Wilcox
2009-04-02  2:13                                     ` Ingo Molnar
2009-04-01 22:32                                   ` Ingo Molnar
2009-04-01 22:57                                     ` Matthew Wilcox
2009-04-02  2:10                                       ` Ingo Molnar
2009-04-02  2:21                                         ` Christoph Lameter
2009-04-02  3:25                                           ` Ingo Molnar
2009-04-02  3:28                                             ` Christoph Lameter
2009-04-02  2:30                                       ` Tejun Heo
2009-04-02  2:18                                     ` Christoph Lameter
2009-04-02  3:42                                       ` Ingo Molnar
2009-04-02 13:53                                         ` Christoph Lameter
2009-04-08 16:26                                           ` Ingo Molnar
2009-04-13 18:18                                             ` Christoph Lameter
2009-04-14 14:04                                               ` Ingo Molnar
2009-04-14 16:48                                                 ` Christoph Lameter
2009-04-14 17:12                                                   ` Ingo Molnar
2009-04-02  2:15                                 ` Christoph Lameter
2009-04-02  4:19                       ` [PATCH 1/2 x86#core/percpu] percpu: don't put the first chunk in reverse-map rbtree Tejun Heo
2009-04-02  4:21                         ` [PATCH 2/2 x86#core/percpu] percpu: remove rbtree and use page->index instead Tejun Heo
2009-04-08 17:03                           ` [tip:core/percpu] " Christoph Lameter
2009-04-08 17:03                         ` [tip:core/percpu] percpu: don't put the first chunk in reverse-map rbtree Tejun Heo
2009-03-31 16:14                     ` [PATCH UPDATED] percpu: use dynamic percpu allocator as the default percpu allocator Christoph Lameter
2009-04-01  0:18                       ` Tejun Heo
2009-03-31  1:34                   ` Rusty Russell
2009-03-31 22:57                     ` David Miller
2009-03-31 23:49                     ` Benjamin Herrenschmidt
2009-04-01  0:19                       ` Tejun Heo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=49B61D68.9090908@kernel.org \
    --to=tj@kernel.org \
    --cc=benh@kernel.crashing.org \
    --cc=cooloney@kernel.org \
    --cc=davem@davemloft.net \
    --cc=grundler@parisc-linux.org \
    --cc=heiko.carstens@de.ibm.com \
    --cc=hpa@zytor.com \
    --cc=ink@jurassic.park.msu.ru \
    --cc=kyle@mcmartin.ca \
    --cc=lethal@linux-sh.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=matthew@wil.cx \
    --cc=mingo@elte.hu \
    --cc=ralf@linux-mips.org \
    --cc=rmk@arm.linux.org.uk \
    --cc=rth@twiddle.net \
    --cc=rusty@rustcorp.com.au \
    --cc=schwidefsky@de.ibm.com \
    --cc=starvik@axis.com \
    --cc=takata@linux-m32r.org \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox