The module auto-unload might seem like a nice optimization, but it encourages inconsistent behaviour. And behaviour that is different from all other normal modules.
rbtree_test.c and percpu_test.c returns -EAGAIN from module_init() on successful completion. Normal module return 0 on success but returning -EAGAIN perform auto module unloading which seem like a nice optimization but it brings inconsistent behaviour as well. I face the similar problem in my previous patch, "Paul Gortmaker" gives nice review comment on module auto-unloading brings inconsistent behaviour. Imagine something as simple as this: for i in $LIST ; do modprobe $i lsmod | grep -q $i if [ $? != 0 ]; then echo Module $i is not present! ; fi done OK, not ideal code, ignoring the modprobe return -- but what it reports is true -- rbtree_test.c and percpu_test.c test module (if it passed) will NOT be present. All other modules from linux/lib/* follow the same semantics that module_init() returns 0 on successful completion & let external entity like rmmod do the module unloading task. Signed-off-by: Pravin Shedge <pravin.shedge4li...@gmail.com> --- lib/percpu_test.c | 3 ++- lib/rbtree_test.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/percpu_test.c b/lib/percpu_test.c index 0b5d14d..57a637b 100644 --- a/lib/percpu_test.c +++ b/lib/percpu_test.c @@ -123,7 +123,8 @@ static int __init percpu_test_init(void) preempt_enable(); pr_info("percpu test done\n"); - return -EAGAIN; /* Fail will directly unload the module */ + + return 0; } static void __exit percpu_test_exit(void) diff --git a/lib/rbtree_test.c b/lib/rbtree_test.c index 7d36c1e..5c52112 100644 --- a/lib/rbtree_test.c +++ b/lib/rbtree_test.c @@ -394,7 +394,7 @@ static int __init rbtree_test_init(void) kfree(nodes); - return -EAGAIN; /* Fail will directly unload the module */ + return 0; } static void __exit rbtree_test_exit(void) -- 2.7.4