]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
xen: add "not_essential" flag to struct xenbus_driver
authorJuergen Gross <jgross@suse.com>
Fri, 22 Oct 2021 06:47:56 +0000 (08:47 +0200)
committerBoris Ostrovsky <boris.ostrovsky@oracle.com>
Tue, 23 Nov 2021 19:41:29 +0000 (13:41 -0600)
When booting the xenbus driver will wait for PV devices to have
connected to their backends before continuing. The timeout is different
between essential and non-essential devices.

Non-essential devices are identified by their nodenames directly in the
xenbus driver, which requires to update this list in case a new device
type being non-essential is added (this was missed for several types
in the past).

In order to avoid this problem, add a "not_essential" flag to struct
xenbus_driver which can be set to "true" by the respective frontend.

Set this flag for the frontends currently regarded to be not essential
(vkbs and vfb) and use it for testing in the xenbus driver.

Signed-off-by: Juergen Gross <jgross@suse.com>
Link: https://lore.kernel.org/r/20211022064800.14978-2-jgross@suse.com
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
drivers/input/misc/xen-kbdfront.c
drivers/video/fbdev/xen-fbfront.c
drivers/xen/xenbus/xenbus_probe_frontend.c
include/xen/xenbus.h

index 4ff5cd2a6d8de6b4c19da59a97de93ccf31ac0f9..3d17a0b3fe5118e336cb170b2735c1386fe25d2b 100644 (file)
@@ -542,6 +542,7 @@ static struct xenbus_driver xenkbd_driver = {
        .remove = xenkbd_remove,
        .resume = xenkbd_resume,
        .otherend_changed = xenkbd_backend_changed,
+       .not_essential = true,
 };
 
 static int __init xenkbd_init(void)
index 5ec51445bee882beb88cefb66dd2f63483a14e8b..6826f986da436859c3e97379c24cda9d645dab93 100644 (file)
@@ -695,6 +695,7 @@ static struct xenbus_driver xenfb_driver = {
        .remove = xenfb_remove,
        .resume = xenfb_resume,
        .otherend_changed = xenfb_backend_changed,
+       .not_essential = true,
 };
 
 static int __init xenfb_init(void)
index 480944606a3c9910ea8df4a13d3905a51ac11dff..07b010a68fcf9cd5e6bca1e4ec47d8487013e227 100644 (file)
@@ -211,19 +211,11 @@ static int is_device_connecting(struct device *dev, void *data, bool ignore_none
        if (drv && (dev->driver != drv))
                return 0;
 
-       if (ignore_nonessential) {
-               /* With older QEMU, for PVonHVM guests the guest config files
-                * could contain: vfb = [ 'vnc=1, vnclisten=0.0.0.0']
-                * which is nonsensical as there is no PV FB (there can be
-                * a PVKB) running as HVM guest. */
+       xendrv = to_xenbus_driver(dev->driver);
 
-               if ((strncmp(xendev->nodename, "device/vkbd", 11) == 0))
-                       return 0;
+       if (ignore_nonessential && xendrv->not_essential)
+               return 0;
 
-               if ((strncmp(xendev->nodename, "device/vfb", 10) == 0))
-                       return 0;
-       }
-       xendrv = to_xenbus_driver(dev->driver);
        return (xendev->state < XenbusStateConnected ||
                (xendev->state == XenbusStateConnected &&
                 xendrv->is_ready && !xendrv->is_ready(xendev)));
index b94074c827721b8ebdee18a5199ba3657cfcccfd..b13eb86395e0597861b345417ddaa3427fb21946 100644 (file)
@@ -112,6 +112,7 @@ struct xenbus_driver {
        const char *name;       /* defaults to ids[0].devicetype */
        const struct xenbus_device_id *ids;
        bool allow_rebind; /* avoid setting xenstore closed during remove */
+       bool not_essential;     /* is not mandatory for boot progress */
        int (*probe)(struct xenbus_device *dev,
                     const struct xenbus_device_id *id);
        void (*otherend_changed)(struct xenbus_device *dev,