From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751923AbaHRNUz (ORCPT ); Mon, 18 Aug 2014 09:20:55 -0400 Received: from cantor2.suse.de ([195.135.220.15]:60460 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751569AbaHRNUx (ORCPT ); Mon, 18 Aug 2014 09:20:53 -0400 Date: Mon, 18 Aug 2014 15:20:47 +0200 Message-ID: From: Takashi Iwai To: Oleg Nesterov Cc: "Luis R. Rodriguez" , "Luis R. Rodriguez" , gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, Tetsuo Handa , Joseph Salisbury , Kay Sievers , One Thousand Gnomes , Tim Gardner , Pierre Fersing , Andrew Morton , Benjamin Poirier , Nagalakshmi Nandigama , Praveen Krishnamoorthy , Sreekanth Reddy , Abhijit Mahajan , Hariprasad S , Santosh Rastapur , MPT-FusionLinux.pdl@avagotech.com, linux-scsi@vger.kernel.org, netdev@vger.kernel.org Subject: Re: [PATCH v3 1/3] init / kthread: add module_long_probe_init() and module_long_probe_exit() In-Reply-To: <20140818122217.GA12707@redhat.com> References: <20140814231028.GQ21930@wotan.suse.de> <20140815143902.GB13222@redhat.com> <20140816025007.GB3347@wotan.suse.de> <20140817122527.GA30546@redhat.com> <20140817124803.GA31996@redhat.com> <20140817125505.GA32429@redhat.com> <20140817174624.GE3347@wotan.suse.de> <20140817182138.GA4411@redhat.com> <20140818122217.GA12707@redhat.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 Emacs/24.3 (x86_64-suse-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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