mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
xen-bus: reduce scope of backend watch
Currently a single watch on /local/domain/X/backend is registered by each QEMU process running in service domain X (where X is usually 0). The purpose of this watch is to ensure that QEMU is notified when the Xen toolstack creates a new device backend area. Such a backend area is specific to a single frontend area created for a specific guest domain and, since each QEMU process is also created to service a specfic guest domain, it is unnecessary and inefficient to notify all QEMU processes. Only the QEMU process associated with the same guest domain need receive the notification. This patch re-factors the watch registration code such that notifications are targetted appropriately. Reported-by: Jerome Leseinne <jerome.leseinne@gmail.com> Signed-off-by: Paul Durrant <pdurrant@amazon.com> Reviewed-by: Anthony PERARD <anthony.perard@citrix.com> Message-Id: <20201001081500.1026-1-paul@xen.org> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
This commit is contained in:
parent
2211118a2a
commit
c4583c8c39
4 changed files with 46 additions and 9 deletions
|
@ -430,7 +430,15 @@ static void xen_bus_unrealize(BusState *bus)
|
|||
trace_xen_bus_unrealize();
|
||||
|
||||
if (xenbus->backend_watch) {
|
||||
xen_bus_remove_watch(xenbus, xenbus->backend_watch, NULL);
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < xenbus->backend_types; i++) {
|
||||
if (xenbus->backend_watch[i]) {
|
||||
xen_bus_remove_watch(xenbus, xenbus->backend_watch[i], NULL);
|
||||
}
|
||||
}
|
||||
|
||||
g_free(xenbus->backend_watch);
|
||||
xenbus->backend_watch = NULL;
|
||||
}
|
||||
|
||||
|
@ -446,8 +454,11 @@ static void xen_bus_unrealize(BusState *bus)
|
|||
|
||||
static void xen_bus_realize(BusState *bus, Error **errp)
|
||||
{
|
||||
char *key = g_strdup_printf("%u", xen_domid);
|
||||
XenBus *xenbus = XEN_BUS(bus);
|
||||
unsigned int domid;
|
||||
const char **type;
|
||||
unsigned int i;
|
||||
Error *local_err = NULL;
|
||||
|
||||
trace_xen_bus_realize();
|
||||
|
@ -469,19 +480,32 @@ static void xen_bus_realize(BusState *bus, Error **errp)
|
|||
|
||||
module_call_init(MODULE_INIT_XEN_BACKEND);
|
||||
|
||||
xenbus->backend_watch =
|
||||
xen_bus_add_watch(xenbus, "", /* domain root node */
|
||||
"backend", xen_bus_backend_changed, &local_err);
|
||||
if (local_err) {
|
||||
/* This need not be treated as a hard error so don't propagate */
|
||||
error_reportf_err(local_err,
|
||||
"failed to set up enumeration watch: ");
|
||||
type = xen_backend_get_types(&xenbus->backend_types);
|
||||
xenbus->backend_watch = g_new(XenWatch *, xenbus->backend_types);
|
||||
|
||||
for (i = 0; i < xenbus->backend_types; i++) {
|
||||
char *node = g_strdup_printf("backend/%s", type[i]);
|
||||
|
||||
xenbus->backend_watch[i] =
|
||||
xen_bus_add_watch(xenbus, node, key, xen_bus_backend_changed,
|
||||
&local_err);
|
||||
if (local_err) {
|
||||
/* This need not be treated as a hard error so don't propagate */
|
||||
error_reportf_err(local_err,
|
||||
"failed to set up '%s' enumeration watch: ",
|
||||
type[i]);
|
||||
}
|
||||
|
||||
g_free(node);
|
||||
}
|
||||
|
||||
g_free(type);
|
||||
g_free(key);
|
||||
return;
|
||||
|
||||
fail:
|
||||
xen_bus_unrealize(bus);
|
||||
g_free(key);
|
||||
}
|
||||
|
||||
static void xen_bus_unplug_request(HotplugHandler *hotplug,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue