Skip to content

Commit 3dae09d

Browse files
wardenjohnpmladek
authored andcommitted
livepatch: Add stack_order sysfs attribute
Add "stack_order" sysfs attribute which holds the order in which a live patch module was loaded into the system. A user can then determine an active live patched version of a function. cat /sys/kernel/livepatch/livepatch_1/stack_order -> 1 means that livepatch_1 is the first live patch applied cat /sys/kernel/livepatch/livepatch_module/stack_order -> N means that livepatch_module is the Nth live patch applied Suggested-by: Petr Mladek <pmladek@suse.com> Suggested-by: Miroslav Benes <mbenes@suse.cz> Suggested-by: Josh Poimboeuf <jpoimboe@kernel.org> Signed-off-by: Wardenjohn <zhangwarden@gmail.com> Acked-by: Josh Poimboeuf <jpoimboe@kernel.org> Reviewed-by: Petr Mladek <pmladek@suse.com> Tested-by: Petr Mladek <pmladek@suse.com> Reviewed-by: Miroslav Benes <mbenes@suse.cz> Link: https://lore.kernel.org/r/20241008014856.3729-2-zhangwarden@gmail.com [pmladek@suse.com: Updated kernel version and date in the ABI documentation.] Signed-off-by: Petr Mladek <pmladek@suse.com>
1 parent aa44f41 commit 3dae09d

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
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);

0 commit comments

Comments
 (0)