Subject: Re: [PATCH v3 1/3] init / kthread: add module_long_probe_init() and module_long_probe_exit()

From: Takashi Iwai <[email-masked]>
Date: Mon, 18 Aug 2014 15:20:47 +0200

At Mon, 18 Aug 2014 14:22:17 +0200,
Oleg Nesterov wrote:
> 
> 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().

Oh, right.  So we need a reference in the module exit path in anyway,
and Luis' version might be shorter in the end.

thanks,

Takashi