Created
April 17, 2014 05:13
-
-
Save tuxoko/10954458 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/module/zfs/zio.c b/module/zfs/zio.c | |
index 97f2549..05a8749 100644 | |
--- a/module/zfs/zio.c | |
+++ b/module/zfs/zio.c | |
@@ -263,7 +263,17 @@ zio_buf_alloc(size_t size) | |
size_t c = (size - 1) >> SPA_MINBLOCKSHIFT; | |
ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT); | |
- | |
+#ifdef _KERNEL | |
+ if (size <= 512) { | |
+ static int index = 0; | |
+ unsigned long addr = (unsigned long)vmalloc(4096); | |
+ ASSERT(addr); | |
+ ASSERT((addr & (PAGE_SIZE-1)) == 0); | |
+ index = (index+3)%8; | |
+ memset((void *)addr, 0x5a, PAGE_SIZE); | |
+ return (void *)(addr + 512*index); | |
+ } | |
+#endif | |
return (kmem_cache_alloc(zio_buf_cache[c], KM_PUSHPAGE | KM_NODEBUG)); | |
} | |
@@ -279,7 +289,17 @@ zio_data_buf_alloc(size_t size) | |
size_t c = (size - 1) >> SPA_MINBLOCKSHIFT; | |
ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT); | |
- | |
+#ifdef _KERNEL | |
+ if (size <= 512) { | |
+ static int index = 0; | |
+ unsigned long addr = (unsigned long)vmalloc(4096); | |
+ ASSERT(addr); | |
+ ASSERT((addr & (PAGE_SIZE-1)) == 0); | |
+ index = (index+3)%8; | |
+ memset((void *)addr, 0x5a, PAGE_SIZE); | |
+ return (void *)(addr + 512*index); | |
+ } | |
+#endif | |
return (kmem_cache_alloc(zio_data_buf_cache[c], | |
KM_PUSHPAGE | KM_NODEBUG)); | |
} | |
@@ -290,7 +310,19 @@ zio_buf_free(void *buf, size_t size) | |
size_t c = (size - 1) >> SPA_MINBLOCKSHIFT; | |
ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT); | |
- | |
+#ifdef _KERNEL | |
+ if (size <= 512) { | |
+ unsigned long p; | |
+ unsigned long baddr = (unsigned long)buf; | |
+ unsigned long vaddr = baddr & (~(PAGE_SIZE-1)); | |
+ for (p = vaddr; p < baddr; p++) | |
+ ASSERT(*(char *)p == 0x5a); | |
+ for (p = baddr+512; p < vaddr+PAGE_SIZE; p++) | |
+ ASSERT(*(char *)p == 0x5a); | |
+ vfree((void *)p); | |
+ return; | |
+ } | |
+#endif | |
kmem_cache_free(zio_buf_cache[c], buf); | |
} | |
@@ -300,7 +332,19 @@ zio_data_buf_free(void *buf, size_t size) | |
size_t c = (size - 1) >> SPA_MINBLOCKSHIFT; | |
ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT); | |
- | |
+#ifdef _KERNEL | |
+ if (size <= 512) { | |
+ unsigned long p; | |
+ unsigned long baddr = (unsigned long)buf; | |
+ unsigned long vaddr = baddr & (~(PAGE_SIZE-1)); | |
+ for (p = vaddr; p < baddr; p++) | |
+ ASSERT(*(char *)p == 0x5a); | |
+ for (p = baddr+512; p < vaddr+PAGE_SIZE; p++) | |
+ ASSERT(*(char *)p == 0x5a); | |
+ vfree((void *)p); | |
+ return; | |
+ } | |
+#endif | |
kmem_cache_free(zio_data_buf_cache[c], buf); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment