On 08/18, Takashi Iwai wrote:
#define module_long_probe_init(initfn) \
static int _long_probe_##initfn(void *arg) \
{ \
module_put_and_exit(initfn()); \
return 0; \
} \
static int __init __long_probe_##initfn(void) \
{ \
struct task_struct *__init_thread = \
kthread_create(_long_probe_##initfn, \
NULL, #initfn); \
if (IS_ERR(__init_thread)) \
return PTR_ERR(__init_thread); \
__module_get(THIS_MODULE); \
wake_up_process(__init_thread); \
return 0; \
} \
module_init(__long_probe_##initfn)
... and module_exit() remains identical as the normal version.
Aaaah. This is not true, module_exit() should not call exitfn() if initfn()
fails... So _long_probe_##initfn() needs to save the error code which should
be checked by module_exit().
But, it's really a small difference, and I don't mind much which way
to take, too.
Agreed.
Oleg.