Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757778AbbFQGf0 (ORCPT ); Wed, 17 Jun 2015 02:35:26 -0400 Received: from szxga01-in.huawei.com ([58.251.152.64]:32541 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753207AbbFQGfS (ORCPT ); Wed, 17 Jun 2015 02:35:18 -0400 From: Li Bin To: Josh Poimboeuf , Seth Jennings , Jiri Kosina , Vojtech Pavlik CC: , , , Subject: [PATCH] livepatch: add sysfs interface /sys/kernel/livepatch/state Date: Wed, 17 Jun 2015 14:31:11 +0800 Message-ID: <1434522671-31951-1-git-send-email-huawei.libin@huawei.com> X-Mailer: git-send-email 1.7.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.175.100.166] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3992 Lines: 126 The added sysfs interface /sys/kernel/livepatch/state is read-only, it shows the patches that have been applied, incluing the stack index and the state of each patch. $ cat /sys/kernel/livepatch/state Index Patch State ----------------------------------------------- 1 klp_test1 enabled 2 klp_test2 enabled 3 klp_test3 enabled ----------------------------------------------- $ echo 0 > /sys/kernel/livepatch/klp_test3/enabled $ cat /sys/kernel/livepatch/state Index Patch State ----------------------------------------------- 1 klp_test1 enabled 2 klp_test2 enabled 3 klp_test3 disabled ----------------------------------------------- Signed-off-by: Li Bin --- Documentation/ABI/testing/sysfs-kernel-livepatch | 9 +++++ kernel/livepatch/core.c | 41 +++++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-kernel-livepatch b/Documentation/ABI/testing/sysfs-kernel-livepatch index 5bf42a8..01c64da 100644 --- a/Documentation/ABI/testing/sysfs-kernel-livepatch +++ b/Documentation/ABI/testing/sysfs-kernel-livepatch @@ -8,6 +8,15 @@ Description: The /sys/kernel/livepatch directory contains subdirectories for each loaded live patch module. +What: /sys/kernel/livepatch/state +Date: Jun 2015 +KernelVersion: 4.1.0 +Contact: live-patching@vger.kernel.org +Description: + The state file is read-only and shows the patches that have + been applied, including the patch stack index and state of + each patch. + What: /sys/kernel/livepatch/ Date: Nov 2014 KernelVersion: 3.19.0 diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c index 3f9f1d6..5d004f3 100644 --- a/kernel/livepatch/core.c +++ b/kernel/livepatch/core.c @@ -604,6 +604,7 @@ EXPORT_SYMBOL_GPL(klp_enable_patch); * Sysfs Interface * * /sys/kernel/livepatch + * /sys/kernel/livepatch/state * /sys/kernel/livepatch/ * /sys/kernel/livepatch//enabled * /sys/kernel/livepatch// @@ -1008,6 +1009,36 @@ static struct notifier_block klp_module_nb = { .priority = INT_MIN+1, /* called late but before ftrace notifier */ }; +static ssize_t state_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct klp_patch *patch; + unsigned long size = 0; + int index = 0; + size += snprintf(buf+size, PAGE_SIZE-size-1, "%-5s\t%-26s\t%-8s\n", "Index", "Patch", "State"); + size += snprintf(buf+size, PAGE_SIZE-size-1, "-----------------------------------------------\n"); + mutex_lock(&klp_mutex); + list_for_each_entry(patch, &klp_patches, list) { + size += snprintf(buf+size, PAGE_SIZE-size-1, "%-5d\t%-26s\t%-8s\n", + ++index, patch->mod->name, patch->state ? "enabled" : "disabled"); + } + mutex_unlock(&klp_mutex); + size += snprintf(buf+size, PAGE_SIZE-size-1, "-----------------------------------------------\n"); + + return size; +} +static struct kobj_attribute state_kobj_attr = __ATTR_RO(state); + +static struct attribute *klp_top_attrs[] = { + &state_kobj_attr.attr, + NULL +}; + +static struct kobj_type klp_ktype_top = { + .sysfs_ops = &kobj_sysfs_ops, + .default_attrs = klp_top_attrs, +}; + static int klp_init(void) { int ret; @@ -1022,12 +1053,20 @@ static int klp_init(void) if (ret) return ret; - klp_root_kobj = kobject_create_and_add("livepatch", kernel_kobj); + klp_root_kobj = kzalloc(sizeof(*klp_root_kobj), GFP_KERNEL); if (!klp_root_kobj) { ret = -ENOMEM; goto unregister; } + ret = kobject_init_and_add(klp_root_kobj, &klp_ktype_top, + kernel_kobj, "livepatch"); + if (ret) { + kobject_put(klp_root_kobj); + klp_root_kobj = NULL; + goto unregister; + } + return 0; unregister: -- 1.7.7 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/