Re: [PATCH] livepatch: support for repatching a function
From: Miroslav Benes
Date: Tue Jan 20 2015 - 04:56:51 EST
On Fri, 9 Jan 2015, Josh Poimboeuf wrote:
> Add support for patching a function multiple times. If multiple patches
> affect a function, the function in the most recently enabled patch
> "wins". This enables a cumulative patch upgrade path, where each patch
> is a superset of previous patches.
>
> This requires restructuring the data a little bit. With the current
> design, where each klp_func struct has its own ftrace_ops, we'd have to
> unregister the old ops and then register the new ops, because
> FTRACE_OPS_FL_IPMODIFY prevents us from having two ops registered for
> the same function at the same time. That would leave a regression
> window where the function isn't patched at all (not good for a patch
> upgrade path).
>
> This patch replaces the per-klp_func ftrace_ops with a global klp_ops
> list, with one ftrace_ops per original function. A single ftrace_ops is
> shared between all klp_funcs which have the same old_addr. This allows
> the switch between function versions to happen instantaneously by
> updating the klp_ops struct's func_stack list. The winner is the
> klp_func at the top of the func_stack (front of the list).
>
> Signed-off-by: Josh Poimboeuf <jpoimboe@xxxxxxxxxx>
> Acked-by: Seth Jennings <sjenning@xxxxxxxxxx>
> ---
> include/linux/livepatch.h | 4 +-
> kernel/livepatch/core.c | 157 +++++++++++++++++++++++++++++++---------------
> 2 files changed, 108 insertions(+), 53 deletions(-)
>
> diff --git a/include/linux/livepatch.h b/include/linux/livepatch.h
> index 950bc61..f14c6fb 100644
> --- a/include/linux/livepatch.h
> +++ b/include/linux/livepatch.h
> @@ -40,8 +40,8 @@ enum klp_state {
> * @old_addr: a hint conveying at what address the old function
> * can be found (optional, vmlinux patches only)
> * @kobj: kobject for sysfs resources
> - * @fops: ftrace operations structure
> * @state: tracks function-level patch application state
> + * @stack_node: list node for klp_ops func_stack list
> */
> struct klp_func {
> /* external */
> @@ -59,8 +59,8 @@ struct klp_func {
>
> /* internal */
> struct kobject kobj;
> - struct ftrace_ops *fops;
> enum klp_state state;
> + struct list_head stack_node;
> };
>
> /**
> diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c
> index ce42d3b..5c10381 100644
> --- a/kernel/livepatch/core.c
> +++ b/kernel/livepatch/core.c
> @@ -29,17 +29,40 @@
> #include <linux/kallsyms.h>
> #include <linux/livepatch.h>
>
> +struct klp_ops {
> + struct list_head node;
> + struct list_head func_stack;
> + struct ftrace_ops fops;
> +};
I think it would be useful to add some comments for this structure and its
members (similar to the last paragraph of the changelog above). Maybe it
is useless now but the code is going to get complicated and it costs
nothing...
Otherwise it looks ok to me (except for thing mentioned by Jiri).
Thank you
--
Miroslav Benes
SUSE Labs
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/