#include #include #include #include static void reftst_release(struct kref *ref) { printk(KERN_INFO "released %p\n", ref); } static void reftst_static_simple_test(void) { struct kref test; printk(KERN_INFO "RefTest - Static\n"); kref_init(&test); kref_get(&test); kref_put(&test, reftst_release); kref_put(&test, reftst_release); } static void reftst_static_watermark_test(void) { struct kref test; printk(KERN_INFO "RefTest - Watermark test\n"); kref_init(&test); kref_set(&test, 0x6b6b6b6b); kref_put(&test, reftst_release); } struct reftst_struct { u8 redzone[32]; /* or just 8 */ struct kref ref; u8 redzone2[32]; }; static void reftst_static_poison_test(void) { struct reftst_struct *test = kzalloc(sizeof(*test), GFP_KERNEL); if (!test) return; printk(KERN_INFO "RefTest - slXb poison test\n"); kref_init(&test->ref); kfree(test); /* this is illegal, "test" is already freed... so it could oops here */ kref_put(&test->ref, reftst_release); } static int __init reftst_init(void) { printk(KERN_INFO "RefTest\n"); reftst_static_simple_test(); reftst_static_watermark_test(); reftst_static_poison_test(); return 0; } static void __exit reftst_exit(void) { } module_init(reftst_init); module_exit(reftst_exit); MODULE_LICENSE("GPL");