Message ID | 1f141995bb61af32c2867ef5559e253f39b0949c.camel@infradead.org |
---|---|
State | New |
Headers | show |
Series | accel/xen: Fix DM state change notification in dm_restrict mode | expand |
On 14/03/2023 08:35, David Woodhouse wrote: > From: David Woodhouse <dwmw@amazon.co.uk> > > When dm_restrict is set, QEMU isn't permitted to update the XenStore node > to indicate its running status. Previously, the xs_write() call would fail > but the failure was ignored. > > However, in refactoring to allow for emulated XenStore operations, a new > call to xs_open() was added. That one didn't fail gracefully, causing a > fatal error when running in dm_restrict mode. > > Partially revert the offending patch, removing the additional call to > xs_open() because the global 'xenstore' variable is still available; it > just needs to be used with qemu_xen_xs_write() now instead of directly > with the xs_write() libxenstore function. > > Also make the whole thing conditional on !xen_domid_restrict. There's no > point even registering the state change handler to attempt to update the > XenStore node when we know it's destined to fail. > > Fixes: ba2a92db1ff6 ("hw/xen: Add xenstore operations to allow redirection to internal emulation") > Reported-by: Jason Andryuk <jandryuk@gmail.com> > Co-developed-by: Jason Andryuk <jandryuk@gmail.com> > Not-Signed-off-by: Jason Andryuk <jandryuk@gmail.com> > Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> > Will-be-Tested-by: Jason Andryuk <jandryuk@gmail.com> > --- > accel/xen/xen-all.c | 27 ++++++++++----------------- > 1 file changed, 10 insertions(+), 17 deletions(-) > Reviewed-by: Paul Durrant <paul@xen.org>
On Tue, Mar 14, 2023 at 4:35 AM David Woodhouse <dwmw2@infradead.org> wrote: > > From: David Woodhouse <dwmw@amazon.co.uk> > > When dm_restrict is set, QEMU isn't permitted to update the XenStore node > to indicate its running status. Previously, the xs_write() call would fail > but the failure was ignored. > > However, in refactoring to allow for emulated XenStore operations, a new > call to xs_open() was added. That one didn't fail gracefully, causing a > fatal error when running in dm_restrict mode. > > Partially revert the offending patch, removing the additional call to > xs_open() because the global 'xenstore' variable is still available; it > just needs to be used with qemu_xen_xs_write() now instead of directly > with the xs_write() libxenstore function. > > Also make the whole thing conditional on !xen_domid_restrict. There's no > point even registering the state change handler to attempt to update the > XenStore node when we know it's destined to fail. > > Fixes: ba2a92db1ff6 ("hw/xen: Add xenstore operations to allow redirection to internal emulation") > Reported-by: Jason Andryuk <jandryuk@gmail.com> > Co-developed-by: Jason Andryuk <jandryuk@gmail.com> > Not-Signed-off-by: Jason Andryuk <jandryuk@gmail.com> > Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> > Will-be-Tested-by: Jason Andryuk <jandryuk@gmail.com> Signed-off-by: Jason Andryuk <jandryuk@gmail.com> Tested-by: Jason Andryuk <jandryuk@gmail.com> Thanks, David. -Jason
diff --git a/accel/xen/xen-all.c b/accel/xen/xen-all.c index 00221e23c5..5ff0cb8bd9 100644 --- a/accel/xen/xen-all.c +++ b/accel/xen/xen-all.c @@ -32,28 +32,13 @@ xendevicemodel_handle *xen_dmod; static void xenstore_record_dm_state(const char *state) { - struct xs_handle *xs; char path[50]; - /* We now have everything we need to set the xenstore entry. */ - xs = xs_open(0); - if (xs == NULL) { - fprintf(stderr, "Could not contact XenStore\n"); - exit(1); - } - snprintf(path, sizeof (path), "device-model/%u/state", xen_domid); - /* - * This call may fail when running restricted so don't make it fatal in - * that case. Toolstacks should instead use QMP to listen for state changes. - */ - if (!xs_write(xs, XBT_NULL, path, state, strlen(state)) && - !xen_domid_restrict) { + if (!qemu_xen_xs_write(xenstore, XBT_NULL, path, state, strlen(state))) { error_report("error recording dm state"); exit(1); } - - xs_close(xs); } @@ -111,7 +96,15 @@ static int xen_init(MachineState *ms) xc_interface_close(xen_xc); return -1; } - qemu_add_vm_change_state_handler(xen_change_state_handler, NULL); + + /* + * The XenStore write would fail when running restricted so don't attempt + * it in that case. Toolstacks should instead use QMP to listen for state + * changes. + */ + if (!xen_domid_restrict) { + qemu_add_vm_change_state_handler(xen_change_state_handler, NULL); + } /* * opt out of system RAM being allocated by generic code */