From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: Juergen Gross <jgross@suse.com>,
Xen-devel <xen-devel@lists.xenproject.org>,
Ross Lagerwall <ross.lagerwall@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1/2] xen/livepatch: Add a return value to load hooks
Date: Wed, 6 Nov 2019 09:20:03 -0500 [thread overview]
Message-ID: <20191106142003.GA5520@localhost.localdomain> (raw)
In-Reply-To: <20191105194317.16232-2-andrew.cooper3@citrix.com>
On Tue, Nov 05, 2019 at 07:43:16PM +0000, Andrew Cooper wrote:
> One use of load hooks is to perform a safety check of the system in its
> quiesced state. Any non-zero return value from a load hook will abort the
> apply attempt.
>
Shouldn't you also update the documentation (design doc?)
Thanks.
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
> ---
> CC: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> CC: Ross Lagerwall <ross.lagerwall@citrix.com>
> CC: Juergen Gross <jgross@suse.com>
>
> For several years, the following patch in the series has been shipped in every
> XenServer livepatch, implemented as a void load hook which modifies its return
> address to skip to the end of apply_payload(). This method is distinctly less
> hacky.
> ---
> xen/common/livepatch.c | 30 +++++++++++++++++++-----------
> xen/include/xen/livepatch_payload.h | 2 +-
> xen/test/livepatch/xen_hello_world.c | 12 +++++++++---
> 3 files changed, 29 insertions(+), 15 deletions(-)
>
> diff --git a/xen/common/livepatch.c b/xen/common/livepatch.c
> index 7caa30c202..962647616a 100644
> --- a/xen/common/livepatch.c
> +++ b/xen/common/livepatch.c
> @@ -1076,25 +1076,33 @@ static int apply_payload(struct payload *data)
> * temporarily disable the spin locks IRQ state checks.
> */
> spin_debug_disable();
> - for ( i = 0; i < data->n_load_funcs; i++ )
> - data->load_funcs[i]();
> + for ( i = 0; !rc && i < data->n_load_funcs; i++ )
> + rc = data->load_funcs[i]();
> spin_debug_enable();
>
> + if ( rc )
> + printk(XENLOG_ERR LIVEPATCH "%s: load_funcs[%u] failed: %d\n",
> + data->name, i, rc);
> +
> ASSERT(!local_irq_is_enabled());
>
> - for ( i = 0; i < data->nfuncs; i++ )
> - arch_livepatch_apply(&data->funcs[i]);
> + if ( !rc )
> + for ( i = 0; i < data->nfuncs; i++ )
> + arch_livepatch_apply(&data->funcs[i]);
>
> arch_livepatch_revive();
>
> - /*
> - * We need RCU variant (which has barriers) in case we crash here.
> - * The applied_list is iterated by the trap code.
> - */
> - list_add_tail_rcu(&data->applied_list, &applied_list);
> - register_virtual_region(&data->region);
> + if ( !rc )
> + {
> + /*
> + * We need RCU variant (which has barriers) in case we crash here.
> + * The applied_list is iterated by the trap code.
> + */
> + list_add_tail_rcu(&data->applied_list, &applied_list);
> + register_virtual_region(&data->region);
> + }
>
> - return 0;
> + return rc;
> }
>
> static int revert_payload(struct payload *data)
> diff --git a/xen/include/xen/livepatch_payload.h b/xen/include/xen/livepatch_payload.h
> index 4a1a96d054..3788b52ddf 100644
> --- a/xen/include/xen/livepatch_payload.h
> +++ b/xen/include/xen/livepatch_payload.h
> @@ -9,7 +9,7 @@
> * The following definitions are to be used in patches. They are taken
> * from kpatch.
> */
> -typedef void livepatch_loadcall_t(void);
> +typedef int livepatch_loadcall_t(void);
> typedef void livepatch_unloadcall_t(void);
>
> /*
> diff --git a/xen/test/livepatch/xen_hello_world.c b/xen/test/livepatch/xen_hello_world.c
> index 02f3f85dc0..d720001f07 100644
> --- a/xen/test/livepatch/xen_hello_world.c
> +++ b/xen/test/livepatch/xen_hello_world.c
> @@ -16,9 +16,11 @@ static const char hello_world_patch_this_fnc[] = "xen_extra_version";
> extern const char *xen_hello_world(void);
> static unsigned int cnt;
>
> -static void apply_hook(void)
> +static int apply_hook(void)
> {
> printk(KERN_DEBUG "Hook executing.\n");
> +
> + return 0;
> }
>
> static void revert_hook(void)
> @@ -26,10 +28,14 @@ static void revert_hook(void)
> printk(KERN_DEBUG "Hook unloaded.\n");
> }
>
> -static void hi_func(void)
> +static int hi_func(void)
> {
> printk(KERN_DEBUG "%s: Hi! (called %u times)\n", __func__, ++cnt);
> +
> + return 0;
> };
> +/* Safe to cast away the return value for this trivial case. */
> +void (void_hi_func)(void) __attribute__((alias("hi_func")));
>
> static void check_fnc(void)
> {
> @@ -43,7 +49,7 @@ LIVEPATCH_UNLOAD_HOOK(revert_hook);
> /* Imbalance here. Two load and three unload. */
>
> LIVEPATCH_LOAD_HOOK(hi_func);
> -LIVEPATCH_UNLOAD_HOOK(hi_func);
> +LIVEPATCH_UNLOAD_HOOK(void_hi_func);
>
> LIVEPATCH_UNLOAD_HOOK(check_fnc);
>
> --
> 2.11.0
>
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2019-11-06 14:20 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-05 19:43 [Xen-devel] [PATCH for-4.13 0/2] xen/livepatch: Safety fixes Andrew Cooper
2019-11-05 19:43 ` [Xen-devel] [PATCH 1/2] xen/livepatch: Add a return value to load hooks Andrew Cooper
2019-11-06 14:20 ` Konrad Rzeszutek Wilk [this message]
2019-11-06 14:35 ` Jan Beulich
2019-11-08 10:21 ` Ross Lagerwall
2019-11-05 19:43 ` [Xen-devel] [PATCH 2/2] x86/livepatch: Prevent patching with active waitqueues Andrew Cooper
2019-11-05 19:49 ` [Xen-devel] [PATCH v1.5] " Andrew Cooper
2019-11-22 10:13 ` Jürgen Groß
2019-11-23 3:23 ` Sarah Newman
2019-11-23 4:48 ` Sarah Newman
2019-11-06 14:25 ` [Xen-devel] [PATCH 2/2] " Konrad Rzeszutek Wilk
2019-11-08 10:18 ` Ross Lagerwall
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=20191106142003.GA5520@localhost.localdomain \
--to=konrad.wilk@oracle.com \
--cc=andrew.cooper3@citrix.com \
--cc=jgross@suse.com \
--cc=ross.lagerwall@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/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.