From: Petr Mladek <pmladek@suse.com>
To: Jiri Kosina <jikos@kernel.org>,
Josh Poimboeuf <jpoimboe@redhat.com>,
Miroslav Benes <mbenes@suse.cz>
Cc: Jason Baron <jbaron@akamai.com>,
Joe Lawrence <joe.lawrence@redhat.com>,
Evgenii Shatokhin <eshatokhin@virtuozzo.com>,
live-patching@vger.kernel.org, linux-kernel@vger.kernel.org,
Petr Mladek <pmladek@suse.com>, Jessica Yu <jeyu@kernel.org>
Subject: [PATCH v14 06/11] livepatch: Use lists to manage patches, objects and functions
Date: Thu, 29 Nov 2018 10:44:26 +0100 [thread overview]
Message-ID: <20181129094431.7801-7-pmladek@suse.com> (raw)
In-Reply-To: <20181129094431.7801-1-pmladek@suse.com>
From: Jason Baron <jbaron@akamai.com>
Currently klp_patch contains a pointer to a statically allocated array of
struct klp_object and struct klp_objects contains a pointer to a statically
allocated array of klp_func. In order to allow for the dynamic allocation
of objects and functions, link klp_patch, klp_object, and klp_func together
via linked lists. This allows us to more easily allocate new objects and
functions, while having the iterator be a simple linked list walk.
The static structures are added to the lists early. It allows to add
the dynamically allocated objects before klp_init_object() and
klp_init_func() calls. Therefore it reduces the further changes
to the code.
This patch does not change the existing behavior.
Signed-off-by: Jason Baron <jbaron@akamai.com>
[pmladek@suse.com: Initialize lists before init calls]
Signed-off-by: Petr Mladek <pmladek@suse.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Jessica Yu <jeyu@kernel.org>
Cc: Jiri Kosina <jikos@kernel.org>
Cc: Miroslav Benes <mbenes@suse.cz>
---
include/linux/livepatch.h | 19 +++++++++++++++++--
kernel/livepatch/core.c | 9 +++++++--
2 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/include/linux/livepatch.h b/include/linux/livepatch.h
index 1366dbb159ab..662e4cf664b8 100644
--- a/include/linux/livepatch.h
+++ b/include/linux/livepatch.h
@@ -24,6 +24,7 @@
#include <linux/module.h>
#include <linux/ftrace.h>
#include <linux/completion.h>
+#include <linux/list.h>
#if IS_ENABLED(CONFIG_LIVEPATCH)
@@ -42,6 +43,7 @@
* can be found (optional)
* @old_func: pointer to the function being patched
* @kobj: kobject for sysfs resources
+ * @node: list node for klp_object func_list
* @stack_node: list node for klp_ops func_stack list
* @old_size: size of the old function
* @new_size: size of the new function
@@ -80,6 +82,7 @@ struct klp_func {
/* internal */
void *old_func;
struct kobject kobj;
+ struct list_head node;
struct list_head stack_node;
unsigned long old_size, new_size;
bool kobj_alive;
@@ -117,6 +120,8 @@ struct klp_callbacks {
* @funcs: function entries for functions to be patched in the object
* @callbacks: functions to be executed pre/post (un)patching
* @kobj: kobject for sysfs resources
+ * @func_list: dynamic list of the function entries
+ * @node: list node for klp_patch obj_list
* @mod: kernel module associated with the patched object
* (NULL for vmlinux)
* @kobj_alive: @kobj has been added and needs freeing
@@ -130,6 +135,8 @@ struct klp_object {
/* internal */
struct kobject kobj;
+ struct list_head func_list;
+ struct list_head node;
struct module *mod;
bool kobj_alive;
bool patched;
@@ -141,6 +148,7 @@ struct klp_object {
* @objs: object entries for kernel objects to be patched
* @list: list node for global list of registered patches
* @kobj: kobject for sysfs resources
+ * @obj_list: dynamic list of the object entries
* @kobj_alive: @kobj has been added and needs freeing
* @enabled: the patch is enabled (but operation may be incomplete)
* @forced: was involved in a forced transition
@@ -155,6 +163,7 @@ struct klp_patch {
/* internal */
struct list_head list;
struct kobject kobj;
+ struct list_head obj_list;
bool kobj_alive;
bool enabled;
bool forced;
@@ -162,14 +171,20 @@ struct klp_patch {
struct completion finish;
};
-#define klp_for_each_object(patch, obj) \
+#define klp_for_each_object_static(patch, obj) \
for (obj = patch->objs; obj->funcs || obj->name; obj++)
-#define klp_for_each_func(obj, func) \
+#define klp_for_each_object(patch, obj) \
+ list_for_each_entry(obj, &patch->obj_list, node)
+
+#define klp_for_each_func_static(obj, func) \
for (func = obj->funcs; \
func->old_name || func->new_func || func->old_sympos; \
func++)
+#define klp_for_each_func(obj, func) \
+ list_for_each_entry(func, &obj->func_list, node)
+
int klp_enable_patch(struct klp_patch *);
void arch_klp_init_object_loaded(struct klp_patch *patch,
diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c
index e01dfa3b58d2..c48f34272473 100644
--- a/kernel/livepatch/core.c
+++ b/kernel/livepatch/core.c
@@ -662,20 +662,25 @@ static int klp_init_patch_before_free(struct klp_patch *patch)
return -EINVAL;
INIT_LIST_HEAD(&patch->list);
+ INIT_LIST_HEAD(&patch->obj_list);
patch->kobj_alive = false;
patch->enabled = false;
patch->forced = false;
INIT_WORK(&patch->free_work, klp_free_patch_work_fn);
init_completion(&patch->finish);
- klp_for_each_object(patch, obj) {
+ klp_for_each_object_static(patch, obj) {
if (!obj->funcs)
return -EINVAL;
+ INIT_LIST_HEAD(&obj->func_list);
obj->kobj_alive = false;
+ list_add_tail(&obj->node, &patch->obj_list);
- klp_for_each_func(obj, func)
+ klp_for_each_func_static(obj, func) {
func->kobj_alive = false;
+ list_add_tail(&func->node, &obj->func_list);
+ }
}
if (!try_module_get(patch->mod))
--
2.13.7
next prev parent reply other threads:[~2018-11-29 9:45 UTC|newest]
Thread overview: 77+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-29 9:44 [PATCH v14 00/11] livepatch: Atomic replace feature Petr Mladek
2018-11-29 9:44 ` [PATCH v14 01/11] livepatch: Change unsigned long old_addr -> void *old_func in struct klp_func Petr Mladek
2018-12-03 13:24 ` Miroslav Benes
2018-12-05 18:45 ` Joe Lawrence
2018-12-06 11:08 ` Alice Ferrazzi
2018-11-29 9:44 ` [PATCH v14 02/11] livepatch: Shuffle klp_enable_patch()/klp_disable_patch() code Petr Mladek
2018-12-03 13:36 ` Miroslav Benes
2018-12-05 18:45 ` Joe Lawrence
2018-11-29 9:44 ` [PATCH v14 03/11] livepatch: Consolidate klp_free functions Petr Mladek
2018-12-03 14:59 ` Miroslav Benes
2018-12-04 14:00 ` Petr Mladek
2018-12-13 22:35 ` Josh Poimboeuf
2018-12-14 9:37 ` Miroslav Benes
2018-12-05 19:02 ` Joe Lawrence
2018-12-06 8:15 ` Petr Mladek
2018-12-06 14:23 ` Joe Lawrence
2018-12-13 22:10 ` Josh Poimboeuf
2018-12-14 9:32 ` Petr Mladek
2018-12-14 14:23 ` Josh Poimboeuf
2018-11-29 9:44 ` [PATCH v14 04/11] livepatch: Refuse to unload only livepatches available during a forced transition Petr Mladek
2018-12-03 15:29 ` Miroslav Benes
2018-12-06 8:46 ` Petr Mladek
2018-12-06 9:18 ` Miroslav Benes
2018-12-05 19:05 ` Joe Lawrence
2018-12-13 22:17 ` Josh Poimboeuf
2018-11-29 9:44 ` [PATCH v14 05/11] livepatch: Simplify API by removing registration step Petr Mladek
2018-12-04 12:54 ` Miroslav Benes
2018-12-04 14:47 ` Petr Mladek
2018-12-04 15:32 ` Miroslav Benes
2018-12-05 19:32 ` Joe Lawrence
2018-12-06 8:28 ` Petr Mladek
2018-12-06 9:23 ` Miroslav Benes
2018-12-06 10:14 ` Petr Mladek
2018-12-06 14:36 ` Joe Lawrence
2018-12-13 22:29 ` Josh Poimboeuf
2018-12-14 9:40 ` Petr Mladek
2018-12-14 14:24 ` Josh Poimboeuf
2019-01-03 11:47 ` Petr Mladek
2018-12-13 22:46 ` Josh Poimboeuf
2018-12-14 10:02 ` Petr Mladek
2018-12-14 14:27 ` Josh Poimboeuf
2018-11-29 9:44 ` Petr Mladek [this message]
2018-12-04 14:13 ` [PATCH v14 06/11] livepatch: Use lists to manage patches, objects and functions Miroslav Benes
2018-12-05 19:34 ` Joe Lawrence
2018-11-29 9:44 ` [PATCH v14 07/11] livepatch: Add atomic replace Petr Mladek
2018-12-04 15:27 ` Miroslav Benes
2018-12-05 19:37 ` Joe Lawrence
2018-12-13 22:55 ` Josh Poimboeuf
2018-12-17 15:27 ` Petr Mladek
2019-01-03 12:47 ` Petr Mladek
2019-01-03 13:37 ` Josh Poimboeuf
2018-11-29 9:44 ` [PATCH v14 08/11] livepatch: Remove Nop structures when unused Petr Mladek
2018-12-04 16:08 ` Miroslav Benes
2018-12-05 20:17 ` Joe Lawrence
2018-12-13 23:00 ` Josh Poimboeuf
2018-12-17 15:54 ` Petr Mladek
2018-12-17 16:11 ` Josh Poimboeuf
2018-11-29 9:44 ` [PATCH v14 09/11] livepatch: Atomic replace and cumulative patches documentation Petr Mladek
2018-12-04 16:12 ` Miroslav Benes
2018-12-05 20:20 ` Joe Lawrence
2018-11-29 9:44 ` [PATCH v14 10/11] livepatch: Remove ordering and refuse loading conflicting patches Petr Mladek
2018-12-05 10:27 ` Miroslav Benes
2018-12-05 20:24 ` Joe Lawrence
2018-12-13 23:06 ` Josh Poimboeuf
2018-12-17 16:07 ` Petr Mladek
2018-12-17 16:27 ` Josh Poimboeuf
2018-12-18 8:51 ` Petr Mladek
2018-11-29 9:44 ` [PATCH v14 11/11] selftests/livepatch: introduce tests Petr Mladek
2018-12-05 11:38 ` Miroslav Benes
2018-12-05 20:27 ` Joe Lawrence
2018-12-08 16:54 ` Alice Ferrazzi
2018-12-05 20:49 ` [PATCH v14 00/11] livepatch: Atomic replace feature Joe Lawrence
2018-12-06 7:54 ` Petr Mladek
2018-12-06 9:32 ` Miroslav Benes
2018-12-06 10:15 ` Petr Mladek
2018-12-06 12:37 ` Petr Mladek
2018-12-06 14:29 ` Joe Lawrence
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181129094431.7801-7-pmladek@suse.com \
--to=pmladek@suse.com \
--cc=eshatokhin@virtuozzo.com \
--cc=jbaron@akamai.com \
--cc=jeyu@kernel.org \
--cc=jikos@kernel.org \
--cc=joe.lawrence@redhat.com \
--cc=jpoimboe@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=live-patching@vger.kernel.org \
--cc=mbenes@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.