Skip to content

Commit 5895d78

Browse files
licliugregkh
authored andcommitted
fs: Add 'initramfs_options' to set initramfs mount options
[ Upstream commit 278033a ] When CONFIG_TMPFS is enabled, the initial root filesystem is a tmpfs. By default, a tmpfs mount is limited to using 50% of the available RAM for its content. This can be problematic in memory-constrained environments, particularly during a kdump capture. In a kdump scenario, the capture kernel boots with a limited amount of memory specified by the 'crashkernel' parameter. If the initramfs is large, it may fail to unpack into the tmpfs rootfs due to insufficient space. This is because to get X MB of usable space in tmpfs, 2*X MB of memory must be available for the mount. This leads to an OOM failure during the early boot process, preventing a successful crash dump. This patch introduces a new kernel command-line parameter, initramfs_options, which allows passing specific mount options directly to the rootfs when it is first mounted. This gives users control over the rootfs behavior. For example, a user can now specify initramfs_options=size=75% to allow the tmpfs to use up to 75% of the available memory. This can significantly reduce the memory pressure for kdump. Consider a practical example: To unpack a 48MB initramfs, the tmpfs needs 48MB of usable space. With the default 50% limit, this requires a memory pool of 96MB to be available for the tmpfs mount. The total memory requirement is therefore approximately: 16MB (vmlinuz) + 48MB (loaded initramfs) + 48MB (unpacked kernel) + 96MB (for tmpfs) + 12MB (runtime overhead) ≈ 220MB. By using initramfs_options=size=75%, the memory pool required for the 48MB tmpfs is reduced to 48MB / 0.75 = 64MB. This reduces the total memory requirement by 32MB (96MB - 64MB), allowing the kdump to succeed with a smaller crashkernel size, such as 192MB. An alternative approach of reusing the existing rootflags parameter was considered. However, a new, dedicated initramfs_options parameter was chosen to avoid altering the current behavior of rootflags (which applies to the final root filesystem) and to prevent any potential regressions. Also add documentation for the new kernel parameter "initramfs_options" This approach is inspired by prior discussions and patches on the topic. Ref: https://www.lightofdawn.org/blog/?viewDetailed=00128 Ref: https://landley.net/notes-2015.html#01-01-2015 Ref: https://lkml.org/lkml/2021/6/29/783 Ref: https://www.kernel.org/doc/html/latest/filesystems/ramfs-rootfs-initramfs.html#what-is-rootfs Signed-off-by: Lichen Liu <[email protected]> Link: https://lore.kernel.org/[email protected] Tested-by: Rob Landley <[email protected]> Signed-off-by: Christian Brauner <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent e10c36a commit 5895d78

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

Documentation/admin-guide/kernel-parameters.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5446,6 +5446,9 @@
54465446

54475447
rootflags= [KNL] Set root filesystem mount option string
54485448

5449+
initramfs_options= [KNL]
5450+
Specify mount options for for the initramfs mount.
5451+
54495452
rootfstype= [KNL] Set root filesystem type
54505453

54515454
rootwait [KNL] Wait (indefinitely) for root device to show up.

fs/namespace.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,15 @@ static int __init set_mphash_entries(char *str)
6464
}
6565
__setup("mphash_entries=", set_mphash_entries);
6666

67+
static char * __initdata initramfs_options;
68+
static int __init initramfs_options_setup(char *str)
69+
{
70+
initramfs_options = str;
71+
return 1;
72+
}
73+
74+
__setup("initramfs_options=", initramfs_options_setup);
75+
6776
static u64 event;
6877
static DEFINE_IDA(mnt_id_ida);
6978
static DEFINE_IDA(mnt_group_ida);
@@ -4414,7 +4423,7 @@ static void __init init_mount_tree(void)
44144423
struct mnt_namespace *ns;
44154424
struct path root;
44164425

4417-
mnt = vfs_kern_mount(&rootfs_fs_type, 0, "rootfs", NULL);
4426+
mnt = vfs_kern_mount(&rootfs_fs_type, 0, "rootfs", initramfs_options);
44184427
if (IS_ERR(mnt))
44194428
panic("Can't create rootfs");
44204429

0 commit comments

Comments
 (0)