Skip to content

Instantly share code, notes, and snippets.

@tuxoko
Created April 17, 2014 05:13
Show Gist options
  • Save tuxoko/10954458 to your computer and use it in GitHub Desktop.
Save tuxoko/10954458 to your computer and use it in GitHub Desktop.
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