From: "Éric Piel" <Eric.Piel@tremplin-utc.net>
To: Sergey Vlasov <vsu@altlinux.ru>
Cc: Christoph Hellwig <hch@lst.de>,
dsdt@gaugusch.at, len.brown@intel.com,
linux-kernel@vger.kernel.org, Linus Torvalds <torvalds@osdl.org>,
trenn@suse.de
Subject: [PATCH] Allow populate_rootfs() to be called early (was: acpi dsts loading and populate_rootfs)
Date: Thu, 21 Feb 2008 20:02:36 +0100 [thread overview]
Message-ID: <47BDCACC.2030302@tremplin-utc.net> (raw)
In-Reply-To: <47B0DD34.4010604@tremplin-utc.net>
12/02/08 00:41, Éric Piel wrote/a écrit:
> 11/02/08 14:47, Sergey Vlasov wrote/a écrit:
>>> Would that seem an acceptable solution? Or what other way exists?
>> Disabling call_usermodehelper() until all core initializers had
>> completed would fix the problem too; will such change be acceptable?
> Yes, that looks like a nice way. Actually, I discovered that for suspend
> and resume, there is exactly the same need, and a special flag is
> already available: usermodehelper_disabled.
>
> So here is a proposal patch leveraging this flag. The rootfs is
> populated early but user land execution is forbidden until we reach a
> sufficient initialization state. I think it even has the bonus of
> doing _explicitly_ what we want (avoid user land execution).
>
> Does this look good? (if so, I can probably make it even cleaner by
> renaming/removing the rootfs_initcall level)
It's been a week and no one has screamed, so I guess the idea looks fine
to everyone :-)
Here is a boot tested patch for integration. In addition to the previous
version, it removes also rootfs_initcall(), and uses fs_initcall_sync().
There should be absolutely no difference in behaviour as there was no
user of fs_initcall_sync() in the kernel.
I'm not sure what should be the best tree to go through. Maybe the ACPI
tree, as all this is needed for CONFIG_ACPI_CUSTOM_DSDT_INITRD...
See you,
Eric
---
For ACPI table override, we need the rootfs available early. So this patch
* removes the kludge calling populate_rootfs early _sometimes_
* leverage the usermodehelper_disabled variable to prevent too early userspace
execution would could lead to oops if the kernel subsystem are not yet initialised
This solves a theoretical bug where someone has both a DSDT table and a
hotplug helper in his or her initramfs.
---
include/asm-generic/vmlinux.lds.h | 1 -
include/linux/init.h | 1 -
init/initramfs.c | 7 -------
init/main.c | 4 ----
kernel/kmod.c | 15 +++++++++++----
5 files changed, 11 insertions(+), 17 deletions(-)
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index f784d2f..19ddbae 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -335,7 +335,6 @@
*(.initcall4s.init) \
*(.initcall5.init) \
*(.initcall5s.init) \
- *(.initcallrootfs.init) \
*(.initcall6.init) \
*(.initcall6s.init) \
*(.initcall7.init) \
diff --git a/include/linux/init.h b/include/linux/init.h
index a404a00..ecd05cd 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -183,7 +183,6 @@ void prepare_namespace(void);
#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)
#define fs_initcall(fn) __define_initcall("5",fn,5)
#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)
-#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)
#define device_initcall(fn) __define_initcall("6",fn,6)
#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)
#define late_initcall(fn) __define_initcall("7",fn,7)
diff --git a/init/initramfs.c b/init/initramfs.c
index c0b1e05..b74e845 100644
--- a/init/initramfs.c
+++ b/init/initramfs.c
@@ -577,10 +577,3 @@ int __init populate_rootfs(void)
}
return 0;
}
-#ifndef CONFIG_ACPI_CUSTOM_DSDT_INITRD
-/*
- * if this option is enabled, populate_rootfs() is called _earlier_ in the
- * boot sequence. This insures that the ACPI initialisation can find the file.
- */
-rootfs_initcall(populate_rootfs);
-#endif
diff --git a/init/main.c b/init/main.c
index 8b19820..703ded0 100644
--- a/init/main.c
+++ b/init/main.c
@@ -102,11 +102,7 @@ static inline void mark_rodata_ro(void) { }
extern void tc_init(void);
#endif
-#ifdef CONFIG_ACPI_CUSTOM_DSDT_INITRD
extern int populate_rootfs(void);
-#else
-static inline void populate_rootfs(void) {}
-#endif
enum system_states system_state;
EXPORT_SYMBOL(system_state);
diff --git a/kernel/kmod.c b/kernel/kmod.c
index bb7df2a..112b261 100644
--- a/kernel/kmod.c
+++ b/kernel/kmod.c
@@ -267,14 +267,23 @@ static void __call_usermodehelper(struct work_struct *work)
}
}
-#ifdef CONFIG_PM
/*
* If set, call_usermodehelper_exec() will exit immediately returning -EBUSY
* (used for preventing user land processes from being created after the user
* land has been frozen during a system-wide hibernation or suspend operation).
+ * It is also used at boot up to avoid calling a user land process before all
+ * the kernel subsystems are initialised (such as pipefs).
*/
-static int usermodehelper_disabled;
+static int usermodehelper_disabled = 1;
+static int __init enable_usermodehelper(void)
+{
+ usermodehelper_disabled = 0;
+ return 0;
+}
+fs_initcall_sync(enable_usermodehelper);
+
+#ifdef CONFIG_PM
/* Number of helpers running */
static atomic_t running_helpers = ATOMIC_INIT(0);
@@ -342,8 +351,6 @@ static void register_pm_notifier_callback(void)
pm_notifier(usermodehelper_pm_callback, 0);
}
#else /* CONFIG_PM */
-#define usermodehelper_disabled 0
-
static inline void helper_lock(void) {}
static inline void helper_unlock(void) {}
static inline void register_pm_notifier_callback(void) {}
next prev parent reply other threads:[~2008-02-21 19:03 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-10 7:12 acpi dsts loading and populate_rootfs Christoph Hellwig
2008-02-10 7:14 ` Christoph Hellwig
2008-02-10 11:58 ` Eric Piel
2008-02-11 13:47 ` Sergey Vlasov
2008-02-11 23:41 ` Éric Piel
2008-02-21 19:02 ` Éric Piel [this message]
2008-02-21 19:04 ` [PATCH] Allow populate_rootfs() to be called early (was: acpi dsts loading and populate_rootfs) Christoph Hellwig
2008-02-21 21:27 ` [PATCH] Allow populate_rootfs() to be called early Éric Piel
2008-02-23 19:40 ` [PATCH] Allow populate_rootfs() to be called early (resent, with sob) Éric Piel
2008-02-12 5:37 ` acpi dsts loading and populate_rootfs Christoph Hellwig
2008-02-21 18:46 ` Éric Piel
2008-02-22 8:51 ` Thomas Renninger
2008-02-22 9:05 ` Thomas Renninger
2008-02-22 9:53 ` Andi Kleen
2008-02-23 19:34 ` [PATCH] Use userland-like functions for reading the ACPI table Éric Piel
2008-02-23 20:45 ` Linus Torvalds
2008-02-24 1:31 ` Christoph Hellwig
2008-02-24 19:02 ` Éric Piel
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=47BDCACC.2030302@tremplin-utc.net \
--to=eric.piel@tremplin-utc.net \
--cc=dsdt@gaugusch.at \
--cc=hch@lst.de \
--cc=len.brown@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@osdl.org \
--cc=trenn@suse.de \
--cc=vsu@altlinux.ru \
/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