From: "Luis R. Rodriguez" <mcgrof@suse.com>
To: Oleg Nesterov <oleg@redhat.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 19:46:24 +0200 [thread overview]
Message-ID: <20140817174624.GE3347@wotan.suse.de> (raw)
In-Reply-To: <20140817125505.GA32429@redhat.com>
On Sun, Aug 17, 2014 at 02:55:05PM +0200, Oleg Nesterov wrote:
> Damn, sorry for noise ;)
>
> I was going to suggest to introduce module_put_and_exit() to simplify
> this and potentially other users, but it already exists. So this code
> can use it too without additional complications.
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?
Note that technically the issue is not that init is taking long its probe that
takes long but since the driver core runs it immediately after init on buses
that autoprobe probe is also then collaterally of concern, but see the other
reply for that.
Moving this to device.h worked better as you don't have to add extra
lines on drivers to include kthread.h.
diff --git a/include/linux/device.h b/include/linux/device.h
index 43d183a..dc7c0ba7 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -27,6 +27,7 @@
#include <linux/ratelimit.h>
#include <linux/uidgid.h>
#include <linux/gfp.h>
+#include <linux/kthread.h>
#include <asm/device.h>
struct device;
@@ -1227,4 +1228,72 @@ static void __exit __driver##_exit(void) \
} \
module_exit(__driver##_exit);
+#ifndef MODULE
+
+#define module_long_probe_init(x) __initcall(x);
+#define module_long_probe_exit(x) __exitcall(x);
+
+#else
+/*
+ * Linux device drivers must strive to handle driver initialization
+ * within less than 30 seconds, 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 this macro can be used to help annotate
+ * the driver as needing work and prevent userspace init processes
+ * from killing drivers not loading within a specified timeout.
+ *
+ * module probe will return immediately and since we are not waiting
+ * for the kthread to end on init we won't be able to inform userspace
+ * of the result of the full init sequence. Probing should initialize
+ * the device driver, probing for devices should be handled asynchronously
+ * behind the scenes.
+ *
+ * Drivers that use this helper should be considered broken and in need
+ * of some serious love.
+ */
+#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);
+
+#endif /* MODULE */
+
#endif /* _DEVICE_H_ */
next prev parent reply other threads:[~2014-08-17 17:46 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1407882507-325-1-git-send-email-mcgrof@do-not-panic.com>
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 [this message]
2014-08-17 18:21 ` Oleg Nesterov
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-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-14 16:42 ` Casey Leedom
2014-08-14 19:53 ` 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=20140817174624.GE3347@wotan.suse.de \
--to=mcgrof@suse.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=nagalakshmi.nandigama@avagotech.com \
--cc=netdev@vger.kernel.org \
--cc=oleg@redhat.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).