}
#endif
-static inline struct kmem_cache *binject_create_slab(const char *name,
- size_t obj_size)
+static inline struct kmem_cache *
+binject_create_slab(const char *name, size_t obj_size, unsigned long flags,
+ void (*init_once)(void *))
{
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 26)
- return kmem_cache_create(name, obj_size, 0, 0, NULL);
+ return kmem_cache_create(name, obj_size, 0, flags, NULL);
#else
- return kmem_cache_create(name, obj_size, 0, 0, NULL, NULL);
+ return kmem_cache_create(name, obj_size, 0, flags, init_once, NULL);
#endif
}
bc = kmem_cache_alloc(b_slab, GFP_KERNEL);
if (bc) {
- memset(bc, 0, sizeof(*bc));
- INIT_LIST_HEAD(&bc->list);
bc->bd = bd;
return bc;
}
if (!list_empty(&bd->done_list)) {
bc = list_entry(bd->done_list.next, struct b_cmd, list);
bd->done_cmds--;
- list_del(&bc->list);
+ list_del_init(&bc->list);
}
spin_unlock_irq(&bd->lock);
return bc;
static void b_dev_free_command(struct b_dev *bd, struct b_cmd *bc)
{
+ BUG_ON(!list_empty(&bc->list));
kmem_cache_free(b_slab, bc);
}
misc_deregister(&b_misc_dev);
}
+static void b_cmd_init_once(void *data)
+{
+ struct b_cmd *bc = data;
+
+ INIT_LIST_HEAD(&bc->list);
+}
+
static int __init b_init(void)
{
int ret;
- b_slab = binject_create_slab("binject", sizeof(struct b_cmd));
+ b_slab = binject_create_slab("binject", sizeof(struct b_cmd),
+ SLAB_HWCACHE_ALIGN, b_cmd_init_once);
if (!b_slab) {
printk(KERN_ERR "binject: failed to create cmd slab\n");
return -ENOMEM;