diff options
author | behlendo <behlendo@7e1ea52c-4ff2-0310-8f11-9dd32ca42a1c> | 2008-03-14 19:04:41 +0000 |
---|---|---|
committer | behlendo <behlendo@7e1ea52c-4ff2-0310-8f11-9dd32ca42a1c> | 2008-03-14 19:04:41 +0000 |
commit | 79b31f3601af530f64b3f2ae87233b3fa5271df1 (patch) | |
tree | afbbd0dda73ebc2a2b5d7b1c04c6504f53f2d863 /modules | |
parent | af828292e585781b2e186f47074a3e1a3baa5094 (diff) |
Fix KMEM_DEBUG support (enable by default)
Add vmem_alloc/vmem_free support (and test case)
Add missing time functions
git-svn-id: https://outreach.scidac.gov/svn/spl/trunk@46 7e1ea52c-4ff2-0310-8f11-9dd32ca42a1c
Diffstat (limited to 'modules')
-rw-r--r-- | modules/spl/spl-kmem.c | 7 | ||||
-rw-r--r-- | modules/spl/spl-time.c | 28 | ||||
-rw-r--r-- | modules/splat/splat-kmem.c | 45 |
3 files changed, 77 insertions, 3 deletions
diff --git a/modules/spl/spl-kmem.c b/modules/spl/spl-kmem.c index 6442d5824..d3cb2c93a 100644 --- a/modules/spl/spl-kmem.c +++ b/modules/spl/spl-kmem.c @@ -7,6 +7,13 @@ /* Shim layer memory accounting */ atomic_t kmem_alloc_used; unsigned int kmem_alloc_max; +atomic_t vmem_alloc_used; +unsigned int vmem_alloc_max; + +EXPORT_SYMBOL(kmem_alloc_used); +EXPORT_SYMBOL(kmem_alloc_max); +EXPORT_SYMBOL(vmem_alloc_used); +EXPORT_SYMBOL(vmem_alloc_max); #endif /* diff --git a/modules/spl/spl-time.c b/modules/spl/spl-time.c index f0ec4c5a0..64b7f9912 100644 --- a/modules/spl/spl-time.c +++ b/modules/spl/spl-time.c @@ -7,5 +7,31 @@ __gethrestime(timestruc_t *ts) { getnstimeofday((struct timespec *)ts); } - EXPORT_SYMBOL(__gethrestime); + +int +__clock_gettime(clock_type_t type, timespec_t *tp) +{ + /* Only support CLOCK_REALTIME+__CLOCK_REALTIME0 for now */ + BUG_ON(!((type == CLOCK_REALTIME) || (type == __CLOCK_REALTIME0))); + + getnstimeofday(tp); + return 0; +} +EXPORT_SYMBOL(__clock_gettime); + +/* This function may not be as fast as using monotonic_clock() but it + * should be much more portable, if performance becomes as issue we can + * look at using monotonic_clock() for x86_64 and x86 arches. + */ +hrtime_t +__gethrtime(void) { + timespec_t tv; + hrtime_t rc; + + do_posix_clock_monotonic_gettime(&tv); + rc = (NSEC_PER_SEC * (hrtime_t)tv.tv_sec) + (hrtime_t)tv.tv_nsec; + + return rc; +} +EXPORT_SYMBOL(__gethrtime); diff --git a/modules/splat/splat-kmem.c b/modules/splat/splat-kmem.c index 4b798df38..7115ca42c 100644 --- a/modules/splat/splat-kmem.c +++ b/modules/splat/splat-kmem.c @@ -20,7 +20,13 @@ #define SPLAT_KMEM_TEST4_NAME "slab_reap" #define SPLAT_KMEM_TEST4_DESC "Slab reaping test" +#define SPLAT_KMEM_TEST5_ID 0x0105 +#define SPLAT_KMEM_TEST5_NAME "vmem_alloc" +#define SPLAT_KMEM_TEST5_DESC "Memory allocation test (vmem_alloc)" + #define SPLAT_KMEM_ALLOC_COUNT 10 +#define SPLAT_VMEM_ALLOC_COUNT 10 + /* XXX - This test may fail under tight memory conditions */ static int splat_kmem_test1(struct file *file, void *arg) @@ -29,7 +35,7 @@ splat_kmem_test1(struct file *file, void *arg) int size = PAGE_SIZE; int i, count, rc = 0; - while ((!rc) && (size < (PAGE_SIZE * 16))) { + while ((!rc) && (size <= (PAGE_SIZE * 32))) { count = 0; for (i = 0; i < SPLAT_KMEM_ALLOC_COUNT; i++) { @@ -61,7 +67,7 @@ splat_kmem_test2(struct file *file, void *arg) int size = PAGE_SIZE; int i, j, count, rc = 0; - while ((!rc) && (size < (PAGE_SIZE * 16))) { + while ((!rc) && (size <= (PAGE_SIZE * 32))) { count = 0; for (i = 0; i < SPLAT_KMEM_ALLOC_COUNT; i++) { @@ -317,6 +323,38 @@ splat_kmem_test4(struct file *file, void *arg) return rc; } +static int +splat_kmem_test5(struct file *file, void *arg) +{ + void *ptr[SPLAT_VMEM_ALLOC_COUNT]; + int size = PAGE_SIZE; + int i, count, rc = 0; + + while ((!rc) && (size <= (PAGE_SIZE * 1024))) { + count = 0; + + for (i = 0; i < SPLAT_VMEM_ALLOC_COUNT; i++) { + ptr[i] = vmem_alloc(size, KM_SLEEP); + if (ptr[i]) + count++; + } + + for (i = 0; i < SPLAT_VMEM_ALLOC_COUNT; i++) + if (ptr[i]) + vmem_free(ptr[i], size); + + splat_vprint(file, SPLAT_KMEM_TEST5_NAME, + "%d byte allocations, %d/%d successful\n", + size, count, SPLAT_VMEM_ALLOC_COUNT); + if (count != SPLAT_VMEM_ALLOC_COUNT) + rc = -ENOMEM; + + size *= 2; + } + + return rc; +} + splat_subsystem_t * splat_kmem_init(void) { @@ -342,6 +380,8 @@ splat_kmem_init(void) SPLAT_KMEM_TEST3_ID, splat_kmem_test3); SPLAT_TEST_INIT(sub, SPLAT_KMEM_TEST4_NAME, SPLAT_KMEM_TEST4_DESC, SPLAT_KMEM_TEST4_ID, splat_kmem_test4); + SPLAT_TEST_INIT(sub, SPLAT_KMEM_TEST5_NAME, SPLAT_KMEM_TEST5_DESC, + SPLAT_KMEM_TEST5_ID, splat_kmem_test5); return sub; } @@ -350,6 +390,7 @@ void splat_kmem_fini(splat_subsystem_t *sub) { ASSERT(sub); + SPLAT_TEST_FINI(sub, SPLAT_KMEM_TEST5_ID); SPLAT_TEST_FINI(sub, SPLAT_KMEM_TEST4_ID); SPLAT_TEST_FINI(sub, SPLAT_KMEM_TEST3_ID); SPLAT_TEST_FINI(sub, SPLAT_KMEM_TEST2_ID); |