mirror of https://github.com/xemu-project/xemu.git
xen: register legacy backends via xen_backend_init
It is okay to register legacy backends in the middle of xen_bus_init(). All that the registration does is record the existence of the backend in xenstore. This makes it possible to remove them from the build without introducing undefined symbols in xen_be_init(). It also removes the need for the backend_register callback, whose only purpose is to avoid registering nonfunctional backends. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-ID: <20240509170044.190795-8-pbonzini@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
0973996fe4
commit
88f5ed7017
|
@ -513,7 +513,7 @@ static void xen_9pfs_alloc(struct XenLegacyDevice *xendev)
|
|||
xenstore_write_be_int(xendev, "max-ring-page-order", MAX_RING_ORDER);
|
||||
}
|
||||
|
||||
struct XenDevOps xen_9pfs_ops = {
|
||||
static struct XenDevOps xen_9pfs_ops = {
|
||||
.size = sizeof(Xen9pfsDev),
|
||||
.flags = DEVOPS_FLAG_NEED_GNTDEV,
|
||||
.alloc = xen_9pfs_alloc,
|
||||
|
@ -522,3 +522,9 @@ struct XenDevOps xen_9pfs_ops = {
|
|||
.disconnect = xen_9pfs_disconnect,
|
||||
.free = xen_9pfs_free,
|
||||
};
|
||||
|
||||
static void xen_9pfs_register_backend(void)
|
||||
{
|
||||
xen_be_register("9pfs", &xen_9pfs_ops);
|
||||
}
|
||||
xen_backend_init(xen_9pfs_register_backend);
|
||||
|
|
|
@ -972,7 +972,7 @@ static void fb_event(struct XenLegacyDevice *xendev)
|
|||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
||||
struct XenDevOps xen_kbdmouse_ops = {
|
||||
static struct XenDevOps xen_kbdmouse_ops = {
|
||||
.size = sizeof(struct XenInput),
|
||||
.init = input_init,
|
||||
.initialise = input_initialise,
|
||||
|
@ -995,3 +995,9 @@ static const GraphicHwOps xenfb_ops = {
|
|||
.gfx_update = xenfb_update,
|
||||
.ui_info = xenfb_ui_info,
|
||||
};
|
||||
|
||||
static void xen_vkbd_register_backend(void)
|
||||
{
|
||||
xen_be_register("vkbd", &xen_kbdmouse_ops);
|
||||
}
|
||||
xen_backend_init(xen_vkbd_register_backend);
|
||||
|
|
|
@ -1083,7 +1083,7 @@ static void usbback_event(struct XenLegacyDevice *xendev)
|
|||
qemu_bh_schedule(usbif->bh);
|
||||
}
|
||||
|
||||
struct XenDevOps xen_usb_ops = {
|
||||
static struct XenDevOps xen_usb_ops = {
|
||||
.size = sizeof(struct usbback_info),
|
||||
.flags = DEVOPS_FLAG_NEED_GNTDEV,
|
||||
.init = usbback_init,
|
||||
|
@ -1095,15 +1095,9 @@ struct XenDevOps xen_usb_ops = {
|
|||
.event = usbback_event,
|
||||
};
|
||||
|
||||
#else /* USBIF_SHORT_NOT_OK */
|
||||
|
||||
static int usbback_not_supported(void)
|
||||
static void xen_usb_register_backend(void)
|
||||
{
|
||||
return -EINVAL;
|
||||
xen_be_register("qusb", &xen_usb_ops);
|
||||
}
|
||||
|
||||
struct XenDevOps xen_usb_ops = {
|
||||
.backend_register = usbback_not_supported,
|
||||
};
|
||||
|
||||
xen_backend_init(xen_usb_register_backend);
|
||||
#endif
|
||||
|
|
|
@ -622,27 +622,11 @@ void xen_be_init(void)
|
|||
qbus_set_bus_hotplug_handler(xen_sysbus);
|
||||
|
||||
xen_set_dynamic_sysbus();
|
||||
|
||||
xen_be_register("vkbd", &xen_kbdmouse_ops);
|
||||
#ifdef CONFIG_VIRTFS
|
||||
xen_be_register("9pfs", &xen_9pfs_ops);
|
||||
#endif
|
||||
#ifdef CONFIG_USB_LIBUSB
|
||||
xen_be_register("qusb", &xen_usb_ops);
|
||||
#endif
|
||||
}
|
||||
|
||||
int xen_be_register(const char *type, struct XenDevOps *ops)
|
||||
{
|
||||
char path[50];
|
||||
int rc;
|
||||
|
||||
if (ops->backend_register) {
|
||||
rc = ops->backend_register();
|
||||
if (rc) {
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(path, sizeof(path), "device-model/%u/backends/%s", xen_domid,
|
||||
type);
|
||||
|
|
|
@ -66,18 +66,8 @@ static inline void xen_be_unmap_grant_ref(struct XenLegacyDevice *xendev,
|
|||
return xen_be_unmap_grant_refs(xendev, ptr, &ref, 1);
|
||||
}
|
||||
|
||||
/* actual backend drivers */
|
||||
extern struct XenDevOps xen_console_ops; /* xen_console.c */
|
||||
extern struct XenDevOps xen_kbdmouse_ops; /* xen_framebuffer.c */
|
||||
extern struct XenDevOps xen_framebuffer_ops; /* xen_framebuffer.c */
|
||||
extern struct XenDevOps xen_blkdev_ops; /* xen_disk.c */
|
||||
#ifdef CONFIG_VIRTFS
|
||||
extern struct XenDevOps xen_9pfs_ops; /* xen-9p-backend.c */
|
||||
#endif
|
||||
extern struct XenDevOps xen_netdev_ops; /* xen_nic.c */
|
||||
#ifdef CONFIG_USB_LIBUSB
|
||||
extern struct XenDevOps xen_usb_ops; /* xen-usb.c */
|
||||
#endif
|
||||
/* backend drivers not included in all machines */
|
||||
extern struct XenDevOps xen_framebuffer_ops; /* xenfb.c */
|
||||
|
||||
/* configuration (aka xenbus setup) */
|
||||
void xen_config_cleanup(void);
|
||||
|
|
|
@ -29,7 +29,6 @@ struct XenDevOps {
|
|||
const char *node);
|
||||
void (*frontend_changed)(struct XenLegacyDevice *xendev,
|
||||
const char *node);
|
||||
int (*backend_register)(void);
|
||||
};
|
||||
|
||||
struct XenLegacyDevice {
|
||||
|
|
Loading…
Reference in New Issue