All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] kexec: implement STATUS hypercall to check if image is loaded
@ 2017-01-12 21:59 Eric DeVolder
  2017-01-13 11:16 ` Jan Beulich
  0 siblings, 1 reply; 9+ messages in thread
From: Eric DeVolder @ 2017-01-12 21:59 UTC (permalink / raw)
  To: xen-devel, ian.jackson, wei.liu2; +Cc: elena.ufimtseva, daniel.kiper

The tools that use kexec are asynchronous in nature and do not keep
state changes. As such provide an hypercall to find out whether an
image has been loaded for either type.

Note: No need to modify XSM as it has one size fits all check and
does not check for subcommands.

Note: No need to check KEXEC_FLAG_IN_PROGRESS (and error out of
kexec_status()) as this flag is set only once by the first/only
cpu on the crash path.

Note: The __XEN_LATEST_INTERFACE_VERSION__ has been bumped to
0x00040900 due to the introduction of a new hypervisor call.

Note: This is just the Xen side of the hypercall, kexec-tools patch
to come separately.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Eric DeVolder <eric.devolder@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
---
CC: Elena Ufimtseva <elena.ufimtseva@oracle.com>
CC: Daniel Kiper <daniel.kiper@oracle.com>

v0: Internal version.
v1: Dropped Reviewed-by, posting on xen-devel.
v2: Incorporated xen-devel feedback
---
 tools/libxc/include/xenctrl.h   | 10 ++++++++++
 tools/libxc/xc_kexec.c          | 24 ++++++++++++++++++++++++
 xen/common/kexec.c              | 19 +++++++++++++++++++
 xen/include/public/kexec.h      | 13 +++++++++++++
 xen/include/public/xen-compat.h |  2 +-
 5 files changed, 67 insertions(+), 1 deletion(-)

diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h
index 4ab0f57117..63c616ff6a 100644
--- a/tools/libxc/include/xenctrl.h
+++ b/tools/libxc/include/xenctrl.h
@@ -2574,6 +2574,16 @@ int xc_kexec_load(xc_interface *xch, uint8_t type, uint16_t arch,
  */
 int xc_kexec_unload(xc_interface *xch, int type);
 
+/*
+ * Find out whether the image has been succesfully loaded.
+ *
+ * The type can be either KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH.
+ * If zero is returned, that means no image is loaded for the type.
+ * If one is returned, that means an image is loaded for the type.
+ * Otherwise, negative return value indicates error.
+ */
+int xc_kexec_status(xc_interface *xch, int type);
+
 typedef xenpf_resource_entry_t xc_resource_entry_t;
 
 /*
diff --git a/tools/libxc/xc_kexec.c b/tools/libxc/xc_kexec.c
index 989e225192..a0a9fd3841 100644
--- a/tools/libxc/xc_kexec.c
+++ b/tools/libxc/xc_kexec.c
@@ -126,3 +126,27 @@ out:
 
     return ret;
 }
+
+int xc_kexec_status(xc_interface *xch, int type)
+{
+    DECLARE_HYPERCALL_BUFFER(xen_kexec_status_t, status);
+    int ret = -1;
+
+    status = xc_hypercall_buffer_alloc(xch, status, sizeof(*status));
+    if ( status == NULL )
+    {
+        PERROR("Could not alloc buffer for kexec status hypercall");
+        goto out;
+    }
+
+    status->type = type;
+
+    ret = xencall2(xch->xcall, __HYPERVISOR_kexec_op,
+                   KEXEC_CMD_kexec_status,
+                   HYPERCALL_BUFFER_AS_ARG(status));
+
+out:
+    xc_hypercall_buffer_free(xch, status);
+
+    return ret;
+}
diff --git a/xen/common/kexec.c b/xen/common/kexec.c
index c83d48fc79..aa808cb2f2 100644
--- a/xen/common/kexec.c
+++ b/xen/common/kexec.c
@@ -1169,6 +1169,22 @@ static int kexec_unload(XEN_GUEST_HANDLE_PARAM(void) uarg)
     return kexec_do_unload(&unload);
 }
 
+static int kexec_status(XEN_GUEST_HANDLE_PARAM(void) uarg)
+{
+    xen_kexec_status_t status;
+    int base, bit;
+
+    if ( unlikely(copy_from_guest(&status, uarg, 1)) )
+        return -EFAULT;
+
+    /* No need to check KEXEC_FLAG_IN_PROGRESS. */
+
+    if ( kexec_load_get_bits(status.type, &base, &bit) )
+        return -EINVAL;
+
+    return test_bit(bit, &kexec_flags);
+}
+
 static int do_kexec_op_internal(unsigned long op,
                                 XEN_GUEST_HANDLE_PARAM(void) uarg,
                                 bool_t compat)
@@ -1208,6 +1224,9 @@ static int do_kexec_op_internal(unsigned long op,
     case KEXEC_CMD_kexec_unload:
         ret = kexec_unload(uarg);
         break;
+    case KEXEC_CMD_kexec_status:
+        ret = kexec_status(uarg);
+        break;
     }
 
     return ret;
diff --git a/xen/include/public/kexec.h b/xen/include/public/kexec.h
index a6a0a88f4f..c200e8ceee 100644
--- a/xen/include/public/kexec.h
+++ b/xen/include/public/kexec.h
@@ -227,6 +227,19 @@ typedef struct xen_kexec_unload {
 } xen_kexec_unload_t;
 DEFINE_XEN_GUEST_HANDLE(xen_kexec_unload_t);
 
+/*
+ * Figure out whether we have an image loaded. A return value of
+ * zero indicates no image loaded. A return value of one
+ * indicates an image is loaded. A negative return value
+ * indicates an error.
+ *
+ * Type must be one of KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH.
+ */
+#define KEXEC_CMD_kexec_status 6
+typedef struct xen_kexec_status {
+    uint8_t type;
+} xen_kexec_status_t;
+DEFINE_XEN_GUEST_HANDLE(xen_kexec_status_t);
 #else /* __XEN_INTERFACE_VERSION__ < 0x00040400 */
 
 #define KEXEC_CMD_kexec_load KEXEC_CMD_kexec_load_v1
diff --git a/xen/include/public/xen-compat.h b/xen/include/public/xen-compat.h
index dd8a5c0d0e..b67365340b 100644
--- a/xen/include/public/xen-compat.h
+++ b/xen/include/public/xen-compat.h
@@ -27,7 +27,7 @@
 #ifndef __XEN_PUBLIC_XEN_COMPAT_H__
 #define __XEN_PUBLIC_XEN_COMPAT_H__
 
-#define __XEN_LATEST_INTERFACE_VERSION__ 0x00040800
+#define __XEN_LATEST_INTERFACE_VERSION__ 0x00040900
 
 #if defined(__XEN__) || defined(__XEN_TOOLS__)
 /* Xen is built with matching headers and implements the latest interface. */
-- 
2.11.0


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] kexec: implement STATUS hypercall to check if image is loaded
  2017-01-12 21:59 [PATCH v2] kexec: implement STATUS hypercall to check if image is loaded Eric DeVolder
@ 2017-01-13 11:16 ` Jan Beulich
  2017-01-13 11:40   ` Daniel Kiper
  0 siblings, 1 reply; 9+ messages in thread
From: Jan Beulich @ 2017-01-13 11:16 UTC (permalink / raw)
  To: Eric DeVolder
  Cc: elena.ufimtseva, wei.liu2, Andrew Cooper, daniel.kiper,
	ian.jackson, xen-devel

>>> On 12.01.17 at 22:59, <eric.devolder@oracle.com> wrote:
> CC: Elena Ufimtseva <elena.ufimtseva@oracle.com>
> CC: Daniel Kiper <daniel.kiper@oracle.com>

Cc: Andrew Cooper <andrew.cooper3@citrix.com>
(as the kexec maintainer)

> Note: The __XEN_LATEST_INTERFACE_VERSION__ has been bumped to
> 0x00040900 due to the introduction of a new hypervisor call.

This bumping is required only if something changes in the interface
such that e.g. source code would need adjustment to not fail to
build.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] kexec: implement STATUS hypercall to check if image is loaded
  2017-01-13 11:16 ` Jan Beulich
@ 2017-01-13 11:40   ` Daniel Kiper
  2017-01-13 11:56     ` Jan Beulich
  0 siblings, 1 reply; 9+ messages in thread
From: Daniel Kiper @ 2017-01-13 11:40 UTC (permalink / raw)
  To: Jan Beulich
  Cc: elena.ufimtseva, wei.liu2, Andrew Cooper, ian.jackson, xen-devel,
	Eric DeVolder

On Fri, Jan 13, 2017 at 04:16:01AM -0700, Jan Beulich wrote:
> >>> On 12.01.17 at 22:59, <eric.devolder@oracle.com> wrote:
> > CC: Elena Ufimtseva <elena.ufimtseva@oracle.com>
> > CC: Daniel Kiper <daniel.kiper@oracle.com>
>
> Cc: Andrew Cooper <andrew.cooper3@citrix.com>
> (as the kexec maintainer)
>
> > Note: The __XEN_LATEST_INTERFACE_VERSION__ has been bumped to
> > 0x00040900 due to the introduction of a new hypervisor call.
>
> This bumping is required only if something changes in the interface
> such that e.g. source code would need adjustment to not fail to
> build.

We need a check in kexec-tools to verify that STATUS hypercall
is available. Otherwise we can disable relevant functionality.
I thought that we can do that because __XEN_LATEST_INTERFACE_VERSION__
is exposed via public headers.

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] kexec: implement STATUS hypercall to check if image is loaded
  2017-01-13 11:40   ` Daniel Kiper
@ 2017-01-13 11:56     ` Jan Beulich
  2017-01-13 12:14       ` Daniel Kiper
  0 siblings, 1 reply; 9+ messages in thread
From: Jan Beulich @ 2017-01-13 11:56 UTC (permalink / raw)
  To: Daniel Kiper
  Cc: elena.ufimtseva, wei.liu2, Andrew Cooper, ian.jackson, xen-devel,
	Eric DeVolder

>>> On 13.01.17 at 12:40, <daniel.kiper@oracle.com> wrote:
> On Fri, Jan 13, 2017 at 04:16:01AM -0700, Jan Beulich wrote:
>> >>> On 12.01.17 at 22:59, <eric.devolder@oracle.com> wrote:
>> > CC: Elena Ufimtseva <elena.ufimtseva@oracle.com>
>> > CC: Daniel Kiper <daniel.kiper@oracle.com>
>>
>> Cc: Andrew Cooper <andrew.cooper3@citrix.com>
>> (as the kexec maintainer)
>>
>> > Note: The __XEN_LATEST_INTERFACE_VERSION__ has been bumped to
>> > 0x00040900 due to the introduction of a new hypervisor call.
>>
>> This bumping is required only if something changes in the interface
>> such that e.g. source code would need adjustment to not fail to
>> build.
> 
> We need a check in kexec-tools to verify that STATUS hypercall
> is available. Otherwise we can disable relevant functionality.
> I thought that we can do that because __XEN_LATEST_INTERFACE_VERSION__
> is exposed via public headers.

No, you should check for KEXEC_CMD_kexec_status being defined
instead. That'll also cover someone backporting the change to their
packages.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] kexec: implement STATUS hypercall to check if image is loaded
  2017-01-13 11:56     ` Jan Beulich
@ 2017-01-13 12:14       ` Daniel Kiper
  2017-01-13 12:35         ` Jan Beulich
  0 siblings, 1 reply; 9+ messages in thread
From: Daniel Kiper @ 2017-01-13 12:14 UTC (permalink / raw)
  To: Jan Beulich
  Cc: elena.ufimtseva, wei.liu2, Andrew Cooper, ian.jackson, xen-devel,
	Eric DeVolder

On Fri, Jan 13, 2017 at 04:56:55AM -0700, Jan Beulich wrote:
> >>> On 13.01.17 at 12:40, <daniel.kiper@oracle.com> wrote:
> > On Fri, Jan 13, 2017 at 04:16:01AM -0700, Jan Beulich wrote:
> >> >>> On 12.01.17 at 22:59, <eric.devolder@oracle.com> wrote:
> >> > CC: Elena Ufimtseva <elena.ufimtseva@oracle.com>
> >> > CC: Daniel Kiper <daniel.kiper@oracle.com>
> >>
> >> Cc: Andrew Cooper <andrew.cooper3@citrix.com>
> >> (as the kexec maintainer)
> >>
> >> > Note: The __XEN_LATEST_INTERFACE_VERSION__ has been bumped to
> >> > 0x00040900 due to the introduction of a new hypervisor call.
> >>
> >> This bumping is required only if something changes in the interface
> >> such that e.g. source code would need adjustment to not fail to
> >> build.
> >
> > We need a check in kexec-tools to verify that STATUS hypercall
> > is available. Otherwise we can disable relevant functionality.
> > I thought that we can do that because __XEN_LATEST_INTERFACE_VERSION__
> > is exposed via public headers.
>
> No, you should check for KEXEC_CMD_kexec_status being defined
> instead. That'll also cover someone backporting the change to their
> packages.

OK, this also works for us. Eric, please drop __XEN_LATEST_INTERFACE_VERSION__
change and add KEXEC_CMD_kexec_status check to kexec-tools configure script.
Sorry for confusion.

Jan, so, __XEN_LATEST_INTERFACE_VERSION__ is used only for Xen internal purposes
(eg. for xl build, etc.) and should not be used as a reference point externally,
e.g. in kexec-tools?

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] kexec: implement STATUS hypercall to check if image is loaded
  2017-01-13 12:14       ` Daniel Kiper
@ 2017-01-13 12:35         ` Jan Beulich
  2017-01-13 12:49           ` Daniel Kiper
  0 siblings, 1 reply; 9+ messages in thread
From: Jan Beulich @ 2017-01-13 12:35 UTC (permalink / raw)
  To: Daniel Kiper
  Cc: elena.ufimtseva, wei.liu2, Andrew Cooper, ian.jackson, xen-devel,
	Eric DeVolder

>>> On 13.01.17 at 13:14, <daniel.kiper@oracle.com> wrote:
> Jan, so, __XEN_LATEST_INTERFACE_VERSION__ is used only for Xen internal purposes
> (eg. for xl build, etc.) and should not be used as a reference point externally,
> e.g. in kexec-tools?

It's certainly meant for external consumption (see my original reply
to Eric), but if at all possible you should not use it for (build time,
obviously) feature detection.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] kexec: implement STATUS hypercall to check if image is loaded
  2017-01-13 12:35         ` Jan Beulich
@ 2017-01-13 12:49           ` Daniel Kiper
  2017-01-13 13:19             ` Jan Beulich
  0 siblings, 1 reply; 9+ messages in thread
From: Daniel Kiper @ 2017-01-13 12:49 UTC (permalink / raw)
  To: Jan Beulich
  Cc: elena.ufimtseva, wei.liu2, Andrew Cooper, ian.jackson, xen-devel,
	Eric DeVolder

On Fri, Jan 13, 2017 at 05:35:35AM -0700, Jan Beulich wrote:
> >>> On 13.01.17 at 13:14, <daniel.kiper@oracle.com> wrote:
> > Jan, so, __XEN_LATEST_INTERFACE_VERSION__ is used only for Xen internal purposes
> > (eg. for xl build, etc.) and should not be used as a reference point externally,
> > e.g. in kexec-tools?
>
> It's certainly meant for external consumption (see my original reply
> to Eric), but if at all possible you should not use it for (build time,
> obviously) feature detection.

So, AIUI, __XEN_LATEST_INTERFACE_VERSION__ should be used when e.g. structure
layout passed to a given hypercall changes and it is not possible to detect
such change in other way. Right?

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] kexec: implement STATUS hypercall to check if image is loaded
  2017-01-13 12:49           ` Daniel Kiper
@ 2017-01-13 13:19             ` Jan Beulich
  2017-01-13 13:34               ` Daniel Kiper
  0 siblings, 1 reply; 9+ messages in thread
From: Jan Beulich @ 2017-01-13 13:19 UTC (permalink / raw)
  To: Daniel Kiper
  Cc: elena.ufimtseva, wei.liu2, Andrew Cooper, ian.jackson, xen-devel,
	Eric DeVolder

>>> On 13.01.17 at 13:49, <daniel.kiper@oracle.com> wrote:
> On Fri, Jan 13, 2017 at 05:35:35AM -0700, Jan Beulich wrote:
>> >>> On 13.01.17 at 13:14, <daniel.kiper@oracle.com> wrote:
>> > Jan, so, __XEN_LATEST_INTERFACE_VERSION__ is used only for Xen internal purposes
>> > (eg. for xl build, etc.) and should not be used as a reference point externally,
>> > e.g. in kexec-tools?
>>
>> It's certainly meant for external consumption (see my original reply
>> to Eric), but if at all possible you should not use it for (build time,
>> obviously) feature detection.
> 
> So, AIUI, __XEN_LATEST_INTERFACE_VERSION__ should be used when e.g. structure
> layout passed to a given hypercall changes and it is not possible to detect
> such change in other way. Right?

No, structure _layout_ must not change (other than in tools only
interfaces). But structure field naming occasionally changes. While
that retains binary compatibility, source code requires changes in
such a case, and that's what the symbol is meant to help with.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] kexec: implement STATUS hypercall to check if image is loaded
  2017-01-13 13:19             ` Jan Beulich
@ 2017-01-13 13:34               ` Daniel Kiper
  0 siblings, 0 replies; 9+ messages in thread
From: Daniel Kiper @ 2017-01-13 13:34 UTC (permalink / raw)
  To: Jan Beulich
  Cc: elena.ufimtseva, wei.liu2, Andrew Cooper, ian.jackson, xen-devel,
	Eric DeVolder

On Fri, Jan 13, 2017 at 06:19:28AM -0700, Jan Beulich wrote:
> >>> On 13.01.17 at 13:49, <daniel.kiper@oracle.com> wrote:
> > On Fri, Jan 13, 2017 at 05:35:35AM -0700, Jan Beulich wrote:
> >> >>> On 13.01.17 at 13:14, <daniel.kiper@oracle.com> wrote:
> >> > Jan, so, __XEN_LATEST_INTERFACE_VERSION__ is used only for Xen internal purposes
> >> > (eg. for xl build, etc.) and should not be used as a reference point externally,
> >> > e.g. in kexec-tools?
> >>
> >> It's certainly meant for external consumption (see my original reply
> >> to Eric), but if at all possible you should not use it for (build time,
> >> obviously) feature detection.
> >
> > So, AIUI, __XEN_LATEST_INTERFACE_VERSION__ should be used when e.g. structure
> > layout passed to a given hypercall changes and it is not possible to detect
> > such change in other way. Right?
>
> No, structure _layout_ must not change (other than in tools only
> interfaces). But structure field naming occasionally changes. While
> that retains binary compatibility, source code requires changes in
> such a case, and that's what the symbol is meant to help with.

Thanks, make sense.

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2017-01-13 13:34 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-12 21:59 [PATCH v2] kexec: implement STATUS hypercall to check if image is loaded Eric DeVolder
2017-01-13 11:16 ` Jan Beulich
2017-01-13 11:40   ` Daniel Kiper
2017-01-13 11:56     ` Jan Beulich
2017-01-13 12:14       ` Daniel Kiper
2017-01-13 12:35         ` Jan Beulich
2017-01-13 12:49           ` Daniel Kiper
2017-01-13 13:19             ` Jan Beulich
2017-01-13 13:34               ` Daniel Kiper

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.