]> git.ipfire.org Git - thirdparty/kmod.git/commit
libkmod: Use kernel decompression when available
authorLucas De Marchi <lucas.de.marchi@gmail.com>
Thu, 1 Jun 2023 22:40:01 +0000 (15:40 -0700)
committerLucas De Marchi <lucas.de.marchi@gmail.com>
Tue, 20 Jun 2023 21:39:25 +0000 (14:39 -0700)
commit09c9f8c5df0475d2627d9498e26250592dbfebd6
tree2594d2f7eb0764022751385165fe0b0258e94506
parent30077bf1719eb9625b1c223c144b74285425d581
libkmod: Use kernel decompression when available

With the recent changes to bypass loading the file it's possible to
reduce the work in userspace and delegating it to the kernel. Without
any compression to illustrate:

Before:
read(3, "\177ELF\2\1", 6)               = 6
lseek(3, 0, SEEK_SET)                   = 0
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=238592, ...}, AT_EMPTY_PATH) = 0
mmap(NULL, 238592, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fd85cbd1000
finit_module(3, "", 0)                  = 0
munmap(0x7fd85cbd1000, 238592)          = 0
close(3)                                = 0

After:
read(3, "\177ELF\2\1", 6)               = 6
lseek(3, 0, SEEK_SET)                   = 0
finit_module(3, "", 0)                  = 0
close(3)                                = 0

When using kernel compression now it's also possible to direct libkmod
to take the finit_module() path, avoiding the decompression in userspace
and just delegating it to the kernel.

Before:
read(3, "(\265/\375\244\0", 6)          = 6
lseek(3, 0, SEEK_SET)                   = 0
read(3, "(\265/\375\244", 5)            = 5
mmap(NULL, 135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3fa431e000
read(3, "\0\244\3\0\\y\6", 7)           = 7
mmap(NULL, 372736, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3fa414f000
brk(0x55944c6a1000)                     = 0x55944c6a1000
read(3, "\356|\6G\27U\20 \312\260s\211\335\333\263\326\330\336\273O\211\356\306K\360Z\341\374U6\342\221"..., 53038) = 53038
mremap(0x7f3fa431e000, 135168, 266240, MREMAP_MAYMOVE) = 0x7f3fa410e000
read(3, ",;\3\nqf\311\362\325\211\7\341\375A\355\221\371L\\\5\7\375 \32\246<(\258=K\304"..., 20851) = 20851
mremap(0x7f3fa410e000, 266240, 397312, MREMAP_MAYMOVE) = 0x7f3fa40ad000
read(3, ")\36\250\213", 4)              = 4
read(3, "", 4)                          = 0
munmap(0x7f3fa414f000, 372736)          = 0
init_module(0x7f3fa40ad010, 238592, "") = 0
munmap(0x7f3fa40ad000, 397312)          = 0
close(3)                                = 0

After:
read(3, "(\265/\375\244P", 6)           = 6
lseek(3, 0, SEEK_SET)                   = 0
finit_module(3, "", 0x4 /* MODULE_INIT_??? */) = 0
close(3)                                = 0

Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>
libkmod/libkmod-file.c
libkmod/libkmod-internal.h
libkmod/libkmod-module.c
libkmod/libkmod.c