mirror of
https://github.com/torvalds/linux.git
synced 2026-01-25 07:47:50 +00:00
initramfs: allocate heap buffers together
header_buf, symlink_buf and name_buf all share the same lifecycle so needn't be allocated / freed separately. This change leads to a minor reduction in .text size: before: text data bss dec hex filename 7914 1110 8 9032 2348 init/initramfs.o after: text data bss dec hex filename 7854 1110 8 8972 230c init/initramfs.o A previous iteration of this patch reused a single buffer instead of three, given that buffer use is state-sequential (GotHeader, GotName, GotSymlink). However, the slight decrease in heap use during early boot isn't really worth the extra review complexity. Link: https://lore.kernel.org/all/20241107002044.16477-7-ddiss@suse.de/ Signed-off-by: David Disseldorp <ddiss@suse.de> Link: https://lore.kernel.org/r/20250304061020.9815-6-ddiss@suse.de Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
committed by
Christian Brauner
parent
a8a3bc2e32
commit
7be37c94da
@@ -510,14 +510,19 @@ char * __init unpack_to_rootfs(char *buf, unsigned long len)
|
||||
decompress_fn decompress;
|
||||
const char *compress_name;
|
||||
static __initdata char msg_buf[64];
|
||||
struct {
|
||||
char header[CPIO_HDRLEN];
|
||||
char symlink[PATH_MAX + N_ALIGN(PATH_MAX) + 1];
|
||||
char name[N_ALIGN(PATH_MAX)];
|
||||
} *bufs = kmalloc(sizeof(*bufs), GFP_KERNEL);
|
||||
|
||||
header_buf = kmalloc(CPIO_HDRLEN, GFP_KERNEL);
|
||||
symlink_buf = kmalloc(PATH_MAX + N_ALIGN(PATH_MAX) + 1, GFP_KERNEL);
|
||||
name_buf = kmalloc(N_ALIGN(PATH_MAX), GFP_KERNEL);
|
||||
|
||||
if (!header_buf || !symlink_buf || !name_buf)
|
||||
if (!bufs)
|
||||
panic_show_mem("can't allocate buffers");
|
||||
|
||||
header_buf = bufs->header;
|
||||
symlink_buf = bufs->symlink;
|
||||
name_buf = bufs->name;
|
||||
|
||||
state = Start;
|
||||
this_header = 0;
|
||||
message = NULL;
|
||||
@@ -560,9 +565,7 @@ char * __init unpack_to_rootfs(char *buf, unsigned long len)
|
||||
len -= my_inptr;
|
||||
}
|
||||
dir_utime();
|
||||
kfree(name_buf);
|
||||
kfree(symlink_buf);
|
||||
kfree(header_buf);
|
||||
kfree(bufs);
|
||||
return message;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user