]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
livepatch: Add "replace" sysfs attribute
authorYafang Shao <laoar.shao@gmail.com>
Tue, 25 Jun 2024 15:11:21 +0000 (23:11 +0800)
committerPetr Mladek <pmladek@suse.com>
Tue, 2 Jul 2024 14:56:18 +0000 (16:56 +0200)
There are situations when it might make sense to combine livepatches
with and without the atomic replace on the same system. For example,
the livepatch without the atomic replace might provide a hotfix
or extra tuning.

Managing livepatches on such systems might be challenging. And the
information which of the installed livepatches do not use the atomic
replace would be useful.

Add new sysfs interface 'replace'. It works as follows:

   $ cat /sys/kernel/livepatch/livepatch-non_replace/replace
   0

   $ cat /sys/kernel/livepatch/livepatch-replace/replace
   1

[ commit log improved by Petr ]

Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Acked-by: Miroslav Benes <mbenes@suse.cz>
Link: https://lore.kernel.org/r/20240625151123.2750-2-laoar.shao@gmail.com
Signed-off-by: Petr Mladek <pmladek@suse.com>
Documentation/ABI/testing/sysfs-kernel-livepatch
kernel/livepatch/core.c

index a5df9b4910dc45fc528735004f49a02b20619e6f..3735d868013d01e34b2e3c36eb97a1a8e95cc044 100644 (file)
@@ -47,6 +47,14 @@ Description:
                disabled when the feature is used. See
                Documentation/livepatch/livepatch.rst for more information.
 
+What:          /sys/kernel/livepatch/<patch>/replace
+Date:          Jun 2024
+KernelVersion: 6.11.0
+Contact:       live-patching@vger.kernel.org
+Description:
+               An attribute which indicates whether the patch supports
+               atomic-replace.
+
 What:          /sys/kernel/livepatch/<patch>/<object>
 Date:          Nov 2014
 KernelVersion: 3.19.0
index 52426665eecc1ada13f28a8a0598371f32e1f578..ad28617bfd75efed29dd45e33efa2680cc20bd38 100644 (file)
@@ -346,6 +346,7 @@ int klp_apply_section_relocs(struct module *pmod, Elf_Shdr *sechdrs,
  * /sys/kernel/livepatch/<patch>/enabled
  * /sys/kernel/livepatch/<patch>/transition
  * /sys/kernel/livepatch/<patch>/force
+ * /sys/kernel/livepatch/<patch>/replace
  * /sys/kernel/livepatch/<patch>/<object>
  * /sys/kernel/livepatch/<patch>/<object>/patched
  * /sys/kernel/livepatch/<patch>/<object>/<function,sympos>
@@ -443,13 +444,24 @@ static ssize_t force_store(struct kobject *kobj, struct kobj_attribute *attr,
        return count;
 }
 
+static ssize_t replace_show(struct kobject *kobj,
+                           struct kobj_attribute *attr, char *buf)
+{
+       struct klp_patch *patch;
+
+       patch = container_of(kobj, struct klp_patch, kobj);
+       return sysfs_emit(buf, "%d\n", patch->replace);
+}
+
 static struct kobj_attribute enabled_kobj_attr = __ATTR_RW(enabled);
 static struct kobj_attribute transition_kobj_attr = __ATTR_RO(transition);
 static struct kobj_attribute force_kobj_attr = __ATTR_WO(force);
+static struct kobj_attribute replace_kobj_attr = __ATTR_RO(replace);
 static struct attribute *klp_patch_attrs[] = {
        &enabled_kobj_attr.attr,
        &transition_kobj_attr.attr,
        &force_kobj_attr.attr,
+       &replace_kobj_attr.attr,
        NULL
 };
 ATTRIBUTE_GROUPS(klp_patch);