From: Oleg Nesterov <oleg@redhat.com>
To: "Luis R. Rodriguez" <mcgrof@suse.com>
Cc: Takashi Iwai <tiwai@suse.de>,
"Luis R. Rodriguez" <mcgrof@do-not-panic.com>,
gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org,
Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>,
Joseph Salisbury <joseph.salisbury@canonical.com>,
Kay Sievers <kay@vrfy.org>,
One Thousand Gnomes <gnomes@lxorguk.ukuu.org.uk>,
Tim Gardner <tim.gardner@canonical.com>,
Pierre Fersing <pierre-fersing@pierref.org>,
Andrew Morton <akpm@linux-foundation.org>,
Benjamin Poirier <bpoirier@suse.de>,
Nagalakshmi Nandigama <nagalakshmi.nandigama@avagotech.com>,
Praveen Krishnamoorthy <praveen.krishnamoorthy@avagotech.com>,
Sreekanth Reddy <sreekanth.reddy@avagotech.com>,
Abhijit Mahajan <abhijit.mahajan@avagotech.com>,
Hariprasad S <hariprasad@chelsio.com>,
Santosh Rastapur <santosh@chelsio.com>,
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()
Date: Sun, 17 Aug 2014 20:21:38 +0200 [thread overview]
Message-ID: <20140817182138.GA4411@redhat.com> (raw)
In-Reply-To: <20140817174624.GE3347@wotan.suse.de>
On 08/17, Luis R. Rodriguez wrote:
>
> In the last iteration that I have stress tested for corner cases I just
> get_task_struct() on the init and then put_task_struct() at the exit, is that
> fine too or are there reasons to prefer the module stuff?
I am fine either way.
I like the Takashi's idea because if sys_delete_module() is called before
initfn() completes it will return -EBUSY and not hang in TASK_UNINTERRUPTIBLE
state. But this is not necessarily good, so I leave this to you and Takashi.
> +/*
> + * Linux device drivers must strive to handle driver initialization
> + * within less than 30 seconds,
Well, perhaps the comment should name the reason ;)
> if device probing takes longer
> + * for whatever reason asynchronous probing of devices / loading
> + * firmware should be used. If a driver takes longer than 30 second
> + * on the initialization path
Or if the initialization code can't handle the errors properly (say,
mptsas can't handle the errors caused by SIGKILL).
> + * Drivers that use this helper should be considered broken and in need
> + * of some serious love.
> + */
Yes.
> +#define module_long_probe_init(initfn) \
> + static struct task_struct *__init_thread; \
> + static int _long_probe_##initfn(void *arg) \
> + { \
> + return initfn(); \
> + } \
> + static inline __init int __long_probe_##initfn(void) \
> + { \
> + __init_thread = kthread_create(_long_probe_##initfn,\
> + NULL, \
> + #initfn); \
> + if (IS_ERR(__init_thread)) \
> + return PTR_ERR(__init_thread); \
> + /* \
> + * callback won't check kthread_should_stop() \
> + * before bailing, so we need to protect it \
> + * before running it. \
> + */ \
> + get_task_struct(__init_thread); \
> + wake_up_process(__init_thread); \
> + return 0; \
> + } \
> + module_init(__long_probe_##initfn);
> +
> +/* To be used by modules that require module_long_probe_init() */
> +#define module_long_probe_exit(exitfn) \
> + static inline void __long_probe_##exitfn(void) \
> + { \
> + int err; \
> + /* \
> + * exitfn() will not be run if the driver's \
> + * real probe which is run on the kthread \
> + * failed for whatever reason, this will \
> + * wait for it to end. \
> + */ \
> + err = kthread_stop(__init_thread); \
> + if (!err) \
> + exitfn(); \
> + put_task_struct(__init_thread); \
> + } \
> + module_exit(__long_probe_##exitfn);
Both inline's look misleading, gcc will generate the code out-of-line
anyway. But this is cosmetic. And for cosmetic reasons, since the 1st
macro uses __init, the 2nd one should probably use __exit.
I believe this version is correct.
Oleg.
next prev parent reply other threads:[~2014-08-17 18:21 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-12 22:28 [PATCH v3 0/3] module loading: add module_long_probe_init() Luis R. Rodriguez
2014-08-12 22:28 ` [PATCH v3 1/3] init / kthread: add module_long_probe_init() and module_long_probe_exit() Luis R. Rodriguez
2014-08-12 22:59 ` Tetsuo Handa
2014-08-13 1:03 ` Greg KH
2014-08-13 17:51 ` Oleg Nesterov
2014-08-14 23:10 ` Luis R. Rodriguez
2014-08-15 14:39 ` Oleg Nesterov
2014-08-16 2:50 ` Luis R. Rodriguez
2014-08-17 6:59 ` Takashi Iwai
2014-08-17 12:25 ` Oleg Nesterov
2014-08-17 12:48 ` Oleg Nesterov
2014-08-17 12:55 ` Oleg Nesterov
2014-08-17 17:46 ` Luis R. Rodriguez
2014-08-17 18:21 ` Oleg Nesterov [this message]
2014-08-18 8:52 ` Takashi Iwai
2014-08-18 12:22 ` Oleg Nesterov
2014-08-18 13:20 ` Takashi Iwai
2014-08-18 15:19 ` Oleg Nesterov
2014-08-19 4:11 ` Luis R. Rodriguez
2014-08-19 4:11 ` Luis R. Rodriguez
2014-08-12 22:28 ` [PATCH v3 2/3] cxgb4: use module_long_probe_init() Luis R. Rodriguez
2014-08-13 23:33 ` Anish Bhatt
2014-08-13 23:33 ` Anish Bhatt
2014-08-14 16:42 ` Casey Leedom
2014-08-14 16:42 ` Casey Leedom
2014-08-14 19:53 ` Luis R. Rodriguez
2014-08-14 19:53 ` Luis R. Rodriguez
2014-08-15 0:14 ` Luis R. Rodriguez
2014-08-15 0:14 ` Luis R. Rodriguez
2014-08-15 7:12 ` gregkh
[not found] ` <53EE4E24.9020104@chelsio.com>
2014-08-17 5:02 ` Luis R. Rodriguez
2014-08-12 22:28 ` [PATCH v3 3/3] mptsas: " Luis R. Rodriguez
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140817182138.GA4411@redhat.com \
--to=oleg@redhat.com \
--cc=MPT-FusionLinux.pdl@avagotech.com \
--cc=abhijit.mahajan@avagotech.com \
--cc=akpm@linux-foundation.org \
--cc=bpoirier@suse.de \
--cc=gnomes@lxorguk.ukuu.org.uk \
--cc=gregkh@linuxfoundation.org \
--cc=hariprasad@chelsio.com \
--cc=joseph.salisbury@canonical.com \
--cc=kay@vrfy.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=mcgrof@do-not-panic.com \
--cc=mcgrof@suse.com \
--cc=nagalakshmi.nandigama@avagotech.com \
--cc=netdev@vger.kernel.org \
--cc=penguin-kernel@I-love.SAKURA.ne.jp \
--cc=pierre-fersing@pierref.org \
--cc=praveen.krishnamoorthy@avagotech.com \
--cc=santosh@chelsio.com \
--cc=sreekanth.reddy@avagotech.com \
--cc=tim.gardner@canonical.com \
--cc=tiwai@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.