diff options
| -rw-r--r-- | hw/i386/xen/xen-hvm.c | 2 | ||||
| -rw-r--r-- | hw/xen/xen-bus.c | 34 | ||||
| -rw-r--r-- | include/hw/xen/interface/io/ring.h | 13 | ||||
| -rw-r--r-- | tests/modules-test.c | 7 | ||||
| -rw-r--r-- | ui/Makefile.objs | 4 |
5 files changed, 45 insertions, 15 deletions
diff --git a/hw/i386/xen/xen-hvm.c b/hw/i386/xen/xen-hvm.c index 5d3e4750e6..6b5e5bb7f5 100644 --- a/hw/i386/xen/xen-hvm.c +++ b/hw/i386/xen/xen-hvm.c @@ -1247,6 +1247,8 @@ static void xen_exit_notifier(Notifier *n, void *data) { XenIOState *state = container_of(n, XenIOState, exit); + xen_destroy_ioreq_server(xen_domid, state->ioservid); + xenevtchn_close(state->xce_handle); xs_daemon_close(state->xenstore); } diff --git a/hw/xen/xen-bus.c b/hw/xen/xen-bus.c index e40500242d..a04478ad4f 100644 --- a/hw/xen/xen-bus.c +++ b/hw/xen/xen-bus.c @@ -516,6 +516,23 @@ static void xen_device_backend_set_online(XenDevice *xendev, bool online) xen_device_backend_printf(xendev, "online", "%u", online); } +/* + * Tell from the state whether the frontend is likely alive, + * i.e. it will react to a change of state of the backend. + */ +static bool xen_device_state_is_active(enum xenbus_state state) +{ + switch (state) { + case XenbusStateInitWait: + case XenbusStateInitialised: + case XenbusStateConnected: + case XenbusStateClosing: + return true; + default: + return false; + } +} + static void xen_device_backend_changed(void *opaque) { XenDevice *xendev = opaque; @@ -539,11 +556,11 @@ static void xen_device_backend_changed(void *opaque) /* * If the toolstack (or unplug request callback) has set the backend - * state to Closing, but there is no active frontend (i.e. the - * state is not Connected) then set the backend state to Closed. + * state to Closing, but there is no active frontend then set the + * backend state to Closed. */ if (xendev->backend_state == XenbusStateClosing && - xendev->frontend_state != XenbusStateConnected) { + !xen_device_state_is_active(state)) { xen_device_backend_set_state(xendev, XenbusStateClosed); } @@ -681,7 +698,8 @@ int xen_device_frontend_scanf(XenDevice *xendev, const char *key, } static void xen_device_frontend_set_state(XenDevice *xendev, - enum xenbus_state state) + enum xenbus_state state, + bool publish) { const char *type = object_get_typename(OBJECT(xendev)); @@ -693,7 +711,9 @@ static void xen_device_frontend_set_state(XenDevice *xendev, xs_strstate(state)); xendev->frontend_state = state; - xen_device_frontend_printf(xendev, "state", "%u", state); + if (publish) { + xen_device_frontend_printf(xendev, "state", "%u", state); + } } static void xen_device_frontend_changed(void *opaque) @@ -709,7 +729,7 @@ static void xen_device_frontend_changed(void *opaque) state = XenbusStateUnknown; } - xen_device_frontend_set_state(xendev, state); + xen_device_frontend_set_state(xendev, state, false); if (state == XenbusStateInitialising && xendev->backend_state == XenbusStateClosed && @@ -1152,7 +1172,7 @@ static void xen_device_realize(DeviceState *dev, Error **errp) xen_device_frontend_printf(xendev, "backend-id", "%u", xenbus->backend_id); - xen_device_frontend_set_state(xendev, XenbusStateInitialising); + xen_device_frontend_set_state(xendev, XenbusStateInitialising, true); xendev->exit.notify = xen_device_exit; qemu_add_exit_notifier(&xendev->exit); diff --git a/include/hw/xen/interface/io/ring.h b/include/hw/xen/interface/io/ring.h index 1adacf09f9..5d048b335c 100644 --- a/include/hw/xen/interface/io/ring.h +++ b/include/hw/xen/interface/io/ring.h @@ -33,6 +33,13 @@ * - standard integers types (uint8_t, uint16_t, etc) * They are provided by stdint.h of the standard headers. * + * Before using the different macros, you need to provide the following + * macros: + * - xen_mb() a memory barrier + * - xen_rmb() a read memory barrier + * - xen_wmb() a write memory barrier + * Example of those can be found in xenctrl.h. + * * In addition, if you intend to use the FLEX macros, you also need to * provide the following, before invoking the FLEX macros: * - size_t @@ -42,12 +49,6 @@ * and grant_table.h from the Xen public headers. */ -#if __XEN_INTERFACE_VERSION__ < 0x00030208 -#define xen_mb() mb() -#define xen_rmb() rmb() -#define xen_wmb() wmb() -#endif - typedef unsigned int RING_IDX; /* Round a 32-bit unsigned constant down to the nearest power of two. */ diff --git a/tests/modules-test.c b/tests/modules-test.c index f9de3afdb7..d1a6ace218 100644 --- a/tests/modules-test.c +++ b/tests/modules-test.c @@ -1,12 +1,14 @@ #include "qemu/osdep.h" #include "libqtest.h" +const char common_args[] = "-nodefaults -machine none"; + static void test_modules_load(const void *data) { QTestState *qts; const char **args = (const char **)data; - qts = qtest_init(NULL); + qts = qtest_init(common_args); qtest_module_load(qts, args[0], args[1]); qtest_quit(qts); } @@ -53,6 +55,9 @@ int main(int argc, char *argv[]) #ifdef CONFIG_SDL "ui-", "sdl", #endif +#if defined(CONFIG_SPICE) && defined(CONFIG_GIO) + "ui-", "spice-app", +#endif }; int i; diff --git a/ui/Makefile.objs b/ui/Makefile.objs index cc2bf5b180..ba39080edb 100644 --- a/ui/Makefile.objs +++ b/ui/Makefile.objs @@ -49,7 +49,9 @@ curses.mo-objs := curses.o curses.mo-cflags := $(CURSES_CFLAGS) $(ICONV_CFLAGS) curses.mo-libs := $(CURSES_LIBS) $(ICONV_LIBS) -common-obj-$(call land,$(CONFIG_SPICE),$(CONFIG_GIO)) += spice-app.mo +ifeq ($(CONFIG_GIO)$(CONFIG_SPICE),yy) +common-obj-$(if $(CONFIG_MODULES),m,y) += spice-app.mo +endif spice-app.mo-objs := spice-app.o spice-app.mo-cflags := $(GIO_CFLAGS) spice-app.mo-libs := $(GIO_LIBS) |