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");
next prev 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