livepatch: add sysfs entry "patched" for each klp_object
authorSong Liu <song@kernel.org>
Fri, 2 Sep 2022 20:52:07 +0000 (13:52 -0700)
committerPetr Mladek <pmladek@suse.com>
Fri, 23 Sep 2022 14:06:18 +0000 (16:06 +0200)
Add per klp_object sysfs entry "patched". It makes it easier to debug
typos in the module name.

Signed-off-by: Song Liu <song@kernel.org>
Reviewed-by: Joe Lawrence <joe.lawrence@redhat.com>
[pmladek@suse.com: Updated kernel version when the sysfs file will be introduced]
Reviewed-by: Petr Mladek <pmladek@suse.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
Link: https://lore.kernel.org/r/20220902205208.3117798-2-song@kernel.org
Documentation/ABI/testing/sysfs-kernel-livepatch
kernel/livepatch/core.c

index bea7bd5..a5df9b4 100644 (file)
@@ -55,6 +55,14 @@ Description:
                The object directory contains subdirectories for each function
                that is patched within the object.
 
+What:          /sys/kernel/livepatch/<patch>/<object>/patched
+Date:          August 2022
+KernelVersion: 6.1.0
+Contact:       live-patching@vger.kernel.org
+Description:
+               An attribute which indicates whether the object is currently
+               patched.
+
 What:          /sys/kernel/livepatch/<patch>/<object>/<function,sympos>
 Date:          Nov 2014
 KernelVersion: 3.19.0
index bc475e6..67eb9f9 100644 (file)
@@ -325,6 +325,7 @@ int klp_apply_section_relocs(struct module *pmod, Elf_Shdr *sechdrs,
  * /sys/kernel/livepatch/<patch>/transition
  * /sys/kernel/livepatch/<patch>/force
  * /sys/kernel/livepatch/<patch>/<object>
+ * /sys/kernel/livepatch/<patch>/<object>/patched
  * /sys/kernel/livepatch/<patch>/<object>/<function,sympos>
  */
 static int __klp_disable_patch(struct klp_patch *patch);
@@ -431,6 +432,22 @@ static struct attribute *klp_patch_attrs[] = {
 };
 ATTRIBUTE_GROUPS(klp_patch);
 
+static ssize_t patched_show(struct kobject *kobj,
+                           struct kobj_attribute *attr, char *buf)
+{
+       struct klp_object *obj;
+
+       obj = container_of(kobj, struct klp_object, kobj);
+       return sysfs_emit(buf, "%d\n", obj->patched);
+}
+
+static struct kobj_attribute patched_kobj_attr = __ATTR_RO(patched);
+static struct attribute *klp_object_attrs[] = {
+       &patched_kobj_attr.attr,
+       NULL,
+};
+ATTRIBUTE_GROUPS(klp_object);
+
 static void klp_free_object_dynamic(struct klp_object *obj)
 {
        kfree(obj->name);
@@ -576,6 +593,7 @@ static void klp_kobj_release_object(struct kobject *kobj)
 static struct kobj_type klp_ktype_object = {
        .release = klp_kobj_release_object,
        .sysfs_ops = &kobj_sysfs_ops,
+       .default_groups = klp_object_groups,
 };
 
 static void klp_kobj_release_func(struct kobject *kobj)