Skip to content

Commit 3360882

Browse files
committed
Merge tag 'livepatching-for-6.14' of git://git.kernel.org/pub/scm/linux/kernel/git/livepatching/livepatching
Pull livepatching updates from Petr Mladek: - Add a sysfs attribute showing the livepatch ordering - Some code clean up * tag 'livepatching-for-6.14' of git://git.kernel.org/pub/scm/linux/kernel/git/livepatching/livepatching: selftests: livepatch: add test cases of stack_order sysfs interface livepatch: Add stack_order sysfs attribute selftests/livepatch: Replace hardcoded module name with variable in test-callbacks.sh
2 parents 4ca6c02 + 49dcb50 commit 3360882

File tree

4 files changed

+105
-1
lines changed

4 files changed

+105
-1
lines changed

Documentation/ABI/testing/sysfs-kernel-livepatch

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ Description:
5555
An attribute which indicates whether the patch supports
5656
atomic-replace.
5757

58+
What: /sys/kernel/livepatch/<patch>/stack_order
59+
Date: Jan 2025
60+
KernelVersion: 6.14.0
61+
Description:
62+
This attribute specifies the sequence in which live patch modules
63+
are applied to the system. If multiple live patches modify the same
64+
function, the implementation with the biggest 'stack_order' number
65+
is used, unless a transition is currently in progress.
66+
5867
What: /sys/kernel/livepatch/<patch>/<object>
5968
Date: Nov 2014
6069
KernelVersion: 3.19.0

kernel/livepatch/core.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@ int klp_apply_section_relocs(struct module *pmod, Elf_Shdr *sechdrs,
347347
* /sys/kernel/livepatch/<patch>/transition
348348
* /sys/kernel/livepatch/<patch>/force
349349
* /sys/kernel/livepatch/<patch>/replace
350+
* /sys/kernel/livepatch/<patch>/stack_order
350351
* /sys/kernel/livepatch/<patch>/<object>
351352
* /sys/kernel/livepatch/<patch>/<object>/patched
352353
* /sys/kernel/livepatch/<patch>/<object>/<function,sympos>
@@ -452,15 +453,38 @@ static ssize_t replace_show(struct kobject *kobj,
452453
return sysfs_emit(buf, "%d\n", patch->replace);
453454
}
454455

456+
static ssize_t stack_order_show(struct kobject *kobj,
457+
struct kobj_attribute *attr, char *buf)
458+
{
459+
struct klp_patch *patch, *this_patch;
460+
int stack_order = 0;
461+
462+
this_patch = container_of(kobj, struct klp_patch, kobj);
463+
464+
mutex_lock(&klp_mutex);
465+
466+
klp_for_each_patch(patch) {
467+
stack_order++;
468+
if (patch == this_patch)
469+
break;
470+
}
471+
472+
mutex_unlock(&klp_mutex);
473+
474+
return sysfs_emit(buf, "%d\n", stack_order);
475+
}
476+
455477
static struct kobj_attribute enabled_kobj_attr = __ATTR_RW(enabled);
456478
static struct kobj_attribute transition_kobj_attr = __ATTR_RO(transition);
457479
static struct kobj_attribute force_kobj_attr = __ATTR_WO(force);
458480
static struct kobj_attribute replace_kobj_attr = __ATTR_RO(replace);
481+
static struct kobj_attribute stack_order_kobj_attr = __ATTR_RO(stack_order);
459482
static struct attribute *klp_patch_attrs[] = {
460483
&enabled_kobj_attr.attr,
461484
&transition_kobj_attr.attr,
462485
&force_kobj_attr.attr,
463486
&replace_kobj_attr.attr,
487+
&stack_order_kobj_attr.attr,
464488
NULL
465489
};
466490
ATTRIBUTE_GROUPS(klp_patch);

tools/testing/selftests/livepatch/test-callbacks.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ $MOD_TARGET: ${MOD_TARGET}_init
259259
% insmod test_modules/$MOD_LIVEPATCH.ko pre_patch_ret=-19
260260
livepatch: enabling patch '$MOD_LIVEPATCH'
261261
livepatch: '$MOD_LIVEPATCH': initializing patching transition
262-
test_klp_callbacks_demo: pre_patch_callback: vmlinux
262+
$MOD_LIVEPATCH: pre_patch_callback: vmlinux
263263
livepatch: pre-patch callback failed for object 'vmlinux'
264264
livepatch: failed to enable patch '$MOD_LIVEPATCH'
265265
livepatch: '$MOD_LIVEPATCH': canceling patching transition, going to unpatch

tools/testing/selftests/livepatch/test-sysfs.sh

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
. $(dirname $0)/functions.sh
66

77
MOD_LIVEPATCH=test_klp_livepatch
8+
MOD_LIVEPATCH2=test_klp_callbacks_demo
9+
MOD_LIVEPATCH3=test_klp_syscall
810

911
setup_config
1012

@@ -19,6 +21,8 @@ check_sysfs_rights "$MOD_LIVEPATCH" "enabled" "-rw-r--r--"
1921
check_sysfs_value "$MOD_LIVEPATCH" "enabled" "1"
2022
check_sysfs_rights "$MOD_LIVEPATCH" "force" "--w-------"
2123
check_sysfs_rights "$MOD_LIVEPATCH" "replace" "-r--r--r--"
24+
check_sysfs_rights "$MOD_LIVEPATCH" "stack_order" "-r--r--r--"
25+
check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1"
2226
check_sysfs_rights "$MOD_LIVEPATCH" "transition" "-r--r--r--"
2327
check_sysfs_value "$MOD_LIVEPATCH" "transition" "0"
2428
check_sysfs_rights "$MOD_LIVEPATCH" "vmlinux/patched" "-r--r--r--"
@@ -131,4 +135,71 @@ livepatch: '$MOD_LIVEPATCH': completing unpatching transition
131135
livepatch: '$MOD_LIVEPATCH': unpatching complete
132136
% rmmod $MOD_LIVEPATCH"
133137

138+
start_test "sysfs test stack_order value"
139+
140+
load_lp $MOD_LIVEPATCH
141+
142+
check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1"
143+
144+
load_lp $MOD_LIVEPATCH2
145+
146+
check_sysfs_value "$MOD_LIVEPATCH2" "stack_order" "2"
147+
148+
load_lp $MOD_LIVEPATCH3
149+
150+
check_sysfs_value "$MOD_LIVEPATCH3" "stack_order" "3"
151+
152+
disable_lp $MOD_LIVEPATCH2
153+
unload_lp $MOD_LIVEPATCH2
154+
155+
check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1"
156+
check_sysfs_value "$MOD_LIVEPATCH3" "stack_order" "2"
157+
158+
disable_lp $MOD_LIVEPATCH3
159+
unload_lp $MOD_LIVEPATCH3
160+
161+
disable_lp $MOD_LIVEPATCH
162+
unload_lp $MOD_LIVEPATCH
163+
164+
check_result "% insmod test_modules/$MOD_LIVEPATCH.ko
165+
livepatch: enabling patch '$MOD_LIVEPATCH'
166+
livepatch: '$MOD_LIVEPATCH': initializing patching transition
167+
livepatch: '$MOD_LIVEPATCH': starting patching transition
168+
livepatch: '$MOD_LIVEPATCH': completing patching transition
169+
livepatch: '$MOD_LIVEPATCH': patching complete
170+
% insmod test_modules/$MOD_LIVEPATCH2.ko
171+
livepatch: enabling patch '$MOD_LIVEPATCH2'
172+
livepatch: '$MOD_LIVEPATCH2': initializing patching transition
173+
$MOD_LIVEPATCH2: pre_patch_callback: vmlinux
174+
livepatch: '$MOD_LIVEPATCH2': starting patching transition
175+
livepatch: '$MOD_LIVEPATCH2': completing patching transition
176+
$MOD_LIVEPATCH2: post_patch_callback: vmlinux
177+
livepatch: '$MOD_LIVEPATCH2': patching complete
178+
% insmod test_modules/$MOD_LIVEPATCH3.ko
179+
livepatch: enabling patch '$MOD_LIVEPATCH3'
180+
livepatch: '$MOD_LIVEPATCH3': initializing patching transition
181+
livepatch: '$MOD_LIVEPATCH3': starting patching transition
182+
livepatch: '$MOD_LIVEPATCH3': completing patching transition
183+
livepatch: '$MOD_LIVEPATCH3': patching complete
184+
% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH2/enabled
185+
livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition
186+
$MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux
187+
livepatch: '$MOD_LIVEPATCH2': starting unpatching transition
188+
livepatch: '$MOD_LIVEPATCH2': completing unpatching transition
189+
$MOD_LIVEPATCH2: post_unpatch_callback: vmlinux
190+
livepatch: '$MOD_LIVEPATCH2': unpatching complete
191+
% rmmod $MOD_LIVEPATCH2
192+
% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH3/enabled
193+
livepatch: '$MOD_LIVEPATCH3': initializing unpatching transition
194+
livepatch: '$MOD_LIVEPATCH3': starting unpatching transition
195+
livepatch: '$MOD_LIVEPATCH3': completing unpatching transition
196+
livepatch: '$MOD_LIVEPATCH3': unpatching complete
197+
% rmmod $MOD_LIVEPATCH3
198+
% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH/enabled
199+
livepatch: '$MOD_LIVEPATCH': initializing unpatching transition
200+
livepatch: '$MOD_LIVEPATCH': starting unpatching transition
201+
livepatch: '$MOD_LIVEPATCH': completing unpatching transition
202+
livepatch: '$MOD_LIVEPATCH': unpatching complete
203+
% rmmod $MOD_LIVEPATCH"
204+
134205
exit 0

0 commit comments

Comments
 (0)