Skip to content

Commit ea5377e

Browse files
committed
Merge branch 'for-6.11/sysfs-patch-replace' into for-linus
2 parents 6189481 + 9205269 commit ea5377e

File tree

3 files changed

+70
-3
lines changed

3 files changed

+70
-3
lines changed

Documentation/ABI/testing/sysfs-kernel-livepatch

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ Description:
4747
disabled when the feature is used. See
4848
Documentation/livepatch/livepatch.rst for more information.
4949

50+
What: /sys/kernel/livepatch/<patch>/replace
51+
Date: Jun 2024
52+
KernelVersion: 6.11.0
53+
Contact: live-patching@vger.kernel.org
54+
Description:
55+
An attribute which indicates whether the patch supports
56+
atomic-replace.
57+
5058
What: /sys/kernel/livepatch/<patch>/<object>
5159
Date: Nov 2014
5260
KernelVersion: 3.19.0

kernel/livepatch/core.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@ int klp_apply_section_relocs(struct module *pmod, Elf_Shdr *sechdrs,
346346
* /sys/kernel/livepatch/<patch>/enabled
347347
* /sys/kernel/livepatch/<patch>/transition
348348
* /sys/kernel/livepatch/<patch>/force
349+
* /sys/kernel/livepatch/<patch>/replace
349350
* /sys/kernel/livepatch/<patch>/<object>
350351
* /sys/kernel/livepatch/<patch>/<object>/patched
351352
* /sys/kernel/livepatch/<patch>/<object>/<function,sympos>
@@ -401,7 +402,7 @@ static ssize_t enabled_show(struct kobject *kobj,
401402
struct klp_patch *patch;
402403

403404
patch = container_of(kobj, struct klp_patch, kobj);
404-
return snprintf(buf, PAGE_SIZE-1, "%d\n", patch->enabled);
405+
return sysfs_emit(buf, "%d\n", patch->enabled);
405406
}
406407

407408
static ssize_t transition_show(struct kobject *kobj,
@@ -410,8 +411,7 @@ static ssize_t transition_show(struct kobject *kobj,
410411
struct klp_patch *patch;
411412

412413
patch = container_of(kobj, struct klp_patch, kobj);
413-
return snprintf(buf, PAGE_SIZE-1, "%d\n",
414-
patch == klp_transition_patch);
414+
return sysfs_emit(buf, "%d\n", patch == klp_transition_patch);
415415
}
416416

417417
static ssize_t force_store(struct kobject *kobj, struct kobj_attribute *attr,
@@ -443,13 +443,24 @@ static ssize_t force_store(struct kobject *kobj, struct kobj_attribute *attr,
443443
return count;
444444
}
445445

446+
static ssize_t replace_show(struct kobject *kobj,
447+
struct kobj_attribute *attr, char *buf)
448+
{
449+
struct klp_patch *patch;
450+
451+
patch = container_of(kobj, struct klp_patch, kobj);
452+
return sysfs_emit(buf, "%d\n", patch->replace);
453+
}
454+
446455
static struct kobj_attribute enabled_kobj_attr = __ATTR_RW(enabled);
447456
static struct kobj_attribute transition_kobj_attr = __ATTR_RO(transition);
448457
static struct kobj_attribute force_kobj_attr = __ATTR_WO(force);
458+
static struct kobj_attribute replace_kobj_attr = __ATTR_RO(replace);
449459
static struct attribute *klp_patch_attrs[] = {
450460
&enabled_kobj_attr.attr,
451461
&transition_kobj_attr.attr,
452462
&force_kobj_attr.attr,
463+
&replace_kobj_attr.attr,
453464
NULL
454465
};
455466
ATTRIBUTE_GROUPS(klp_patch);

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ check_sysfs_rights "$MOD_LIVEPATCH" "" "drwxr-xr-x"
1818
check_sysfs_rights "$MOD_LIVEPATCH" "enabled" "-rw-r--r--"
1919
check_sysfs_value "$MOD_LIVEPATCH" "enabled" "1"
2020
check_sysfs_rights "$MOD_LIVEPATCH" "force" "--w-------"
21+
check_sysfs_rights "$MOD_LIVEPATCH" "replace" "-r--r--r--"
2122
check_sysfs_rights "$MOD_LIVEPATCH" "transition" "-r--r--r--"
2223
check_sysfs_value "$MOD_LIVEPATCH" "transition" "0"
2324
check_sysfs_rights "$MOD_LIVEPATCH" "vmlinux/patched" "-r--r--r--"
@@ -83,4 +84,51 @@ test_klp_callbacks_demo: post_unpatch_callback: vmlinux
8384
livepatch: 'test_klp_callbacks_demo': unpatching complete
8485
% rmmod test_klp_callbacks_demo"
8586

87+
start_test "sysfs test replace enabled"
88+
89+
MOD_LIVEPATCH=test_klp_atomic_replace
90+
load_lp $MOD_LIVEPATCH replace=1
91+
92+
check_sysfs_rights "$MOD_LIVEPATCH" "replace" "-r--r--r--"
93+
check_sysfs_value "$MOD_LIVEPATCH" "replace" "1"
94+
95+
disable_lp $MOD_LIVEPATCH
96+
unload_lp $MOD_LIVEPATCH
97+
98+
check_result "% insmod test_modules/$MOD_LIVEPATCH.ko replace=1
99+
livepatch: enabling patch '$MOD_LIVEPATCH'
100+
livepatch: '$MOD_LIVEPATCH': initializing patching transition
101+
livepatch: '$MOD_LIVEPATCH': starting patching transition
102+
livepatch: '$MOD_LIVEPATCH': completing patching transition
103+
livepatch: '$MOD_LIVEPATCH': patching complete
104+
% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled
105+
livepatch: '$MOD_LIVEPATCH': initializing unpatching transition
106+
livepatch: '$MOD_LIVEPATCH': starting unpatching transition
107+
livepatch: '$MOD_LIVEPATCH': completing unpatching transition
108+
livepatch: '$MOD_LIVEPATCH': unpatching complete
109+
% rmmod $MOD_LIVEPATCH"
110+
111+
start_test "sysfs test replace disabled"
112+
113+
load_lp $MOD_LIVEPATCH replace=0
114+
115+
check_sysfs_rights "$MOD_LIVEPATCH" "replace" "-r--r--r--"
116+
check_sysfs_value "$MOD_LIVEPATCH" "replace" "0"
117+
118+
disable_lp $MOD_LIVEPATCH
119+
unload_lp $MOD_LIVEPATCH
120+
121+
check_result "% insmod test_modules/$MOD_LIVEPATCH.ko replace=0
122+
livepatch: enabling patch '$MOD_LIVEPATCH'
123+
livepatch: '$MOD_LIVEPATCH': initializing patching transition
124+
livepatch: '$MOD_LIVEPATCH': starting patching transition
125+
livepatch: '$MOD_LIVEPATCH': completing patching transition
126+
livepatch: '$MOD_LIVEPATCH': patching complete
127+
% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled
128+
livepatch: '$MOD_LIVEPATCH': initializing unpatching transition
129+
livepatch: '$MOD_LIVEPATCH': starting unpatching transition
130+
livepatch: '$MOD_LIVEPATCH': completing unpatching transition
131+
livepatch: '$MOD_LIVEPATCH': unpatching complete
132+
% rmmod $MOD_LIVEPATCH"
133+
86134
exit 0

0 commit comments

Comments
 (0)