Skip to content

Commit 3b72a03

Browse files
licliugregkh
authored andcommitted
fs: Add 'initramfs_options' to set initramfs mount options
[ Upstream commit 278033a225e13ec21900f0a92b8351658f5377f2 ] 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 a021297 commit 3b72a03

2 files changed

Lines changed: 13 additions & 1 deletion

File tree

Documentation/admin-guide/kernel-parameters.txt

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

64306430
rootflags= [KNL] Set root filesystem mount option string
64316431

6432+
initramfs_options= [KNL]
6433+
Specify mount options for for the initramfs mount.
6434+
64326435
rootfstype= [KNL] Set root filesystem type
64336436

64346437
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
@@ -65,6 +65,15 @@ static int __init set_mphash_entries(char *str)
6565
}
6666
__setup("mphash_entries=", set_mphash_entries);
6767

68+
static char * __initdata initramfs_options;
69+
static int __init initramfs_options_setup(char *str)
70+
{
71+
initramfs_options = str;
72+
return 1;
73+
}
74+
75+
__setup("initramfs_options=", initramfs_options_setup);
76+
6877
static u64 event;
6978
static DEFINE_XARRAY_FLAGS(mnt_id_xa, XA_FLAGS_ALLOC);
7079
static DEFINE_IDA(mnt_group_ida);
@@ -6127,7 +6136,7 @@ static void __init init_mount_tree(void)
61276136
struct mnt_namespace *ns;
61286137
struct path root;
61296138

6130-
mnt = vfs_kern_mount(&rootfs_fs_type, 0, "rootfs", NULL);
6139+
mnt = vfs_kern_mount(&rootfs_fs_type, 0, "rootfs", initramfs_options);
61316140
if (IS_ERR(mnt))
61326141
panic("Can't create rootfs");
61336142

0 commit comments

Comments
 (0)