All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Woodhouse <dwmw2@infradead.org>
To: qemu-devel@nongnu.org
Cc: "Kevin Wolf" <kwolf@redhat.com>,
	"Hanna Reitz" <hreitz@redhat.com>,
	"Stefano Stabellini" <sstabellini@kernel.org>,
	"Anthony Perard" <anthony.perard@citrix.com>,
	"Paul Durrant" <paul@xen.org>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
	"Richard Henderson" <richard.henderson@linaro.org>,
	"Eduardo Habkost" <eduardo@habkost.net>,
	"Jason Wang" <jasowang@redhat.com>,
	"Marcelo Tosatti" <mtosatti@redhat.com>,
	qemu-block@nongnu.org, xen-devel@lists.xenproject.org,
	kvm@vger.kernel.org, "Bernhard Beschow" <shentey@gmail.com>,
	"Joel Upham" <jupham125@gmail.com>
Subject: [PATCH v3 15/28] hw/xen: do not repeatedly try to create a failing backend device
Date: Wed, 25 Oct 2023 15:50:29 +0100	[thread overview]
Message-ID: <20231025145042.627381-16-dwmw2@infradead.org> (raw)
In-Reply-To: <20231025145042.627381-1-dwmw2@infradead.org>

From: David Woodhouse <dwmw@amazon.co.uk>

If xen_backend_device_create() fails to instantiate a device, the XenBus
code will just keep trying over and over again each time the bus is
re-enumerated, as long as the backend appears online and in
XenbusStateInitialising.

The only thing which prevents the XenBus code from recreating duplicates
of devices which already exist, is the fact that xen_device_realize()
sets the backend state to XenbusStateInitWait. If the attempt to create
the device doesn't get *that* far, that's when it will keep getting
retried.

My first thought was to handle errors by setting the backend state to
XenbusStateClosed, but that doesn't work for XenConsole which wants to
*ignore* any device of type != "ioemu" completely.

So, make xen_backend_device_create() *keep* the XenBackendInstance for a
failed device, and provide a new xen_backend_exists() function to allow
xen_bus_type_enumerate() to check whether one already exists before
creating a new one.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Paul Durrant <paul@xen.org>
---
 hw/xen/xen-backend.c         | 27 +++++++++++++++++++++------
 hw/xen/xen-bus.c             |  3 ++-
 include/hw/xen/xen-backend.h |  1 +
 3 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/hw/xen/xen-backend.c b/hw/xen/xen-backend.c
index 5b0fb76eae..b9bf70a9f5 100644
--- a/hw/xen/xen-backend.c
+++ b/hw/xen/xen-backend.c
@@ -101,6 +101,24 @@ static XenBackendInstance *xen_backend_list_find(XenDevice *xendev)
     return NULL;
 }
 
+bool xen_backend_exists(const char *type, const char *name)
+{
+    const XenBackendImpl *impl = xen_backend_table_lookup(type);
+    XenBackendInstance *backend;
+
+    if (!impl) {
+        return false;
+    }
+
+    QLIST_FOREACH(backend, &backend_list, entry) {
+        if (backend->impl == impl && !strcmp(backend->name, name)) {
+            return true;
+        }
+    }
+
+    return false;
+}
+
 static void xen_backend_list_remove(XenBackendInstance *backend)
 {
     QLIST_REMOVE(backend, entry);
@@ -122,11 +140,6 @@ void xen_backend_device_create(XenBus *xenbus, const char *type,
     backend->name = g_strdup(name);
 
     impl->create(backend, opts, errp);
-    if (*errp) {
-        g_free(backend->name);
-        g_free(backend);
-        return;
-    }
 
     backend->impl = impl;
     xen_backend_list_add(backend);
@@ -165,7 +178,9 @@ bool xen_backend_try_device_destroy(XenDevice *xendev, Error **errp)
     }
 
     impl = backend->impl;
-    impl->destroy(backend, errp);
+    if (backend->xendev) {
+        impl->destroy(backend, errp);
+    }
 
     xen_backend_list_remove(backend);
     g_free(backend->name);
diff --git a/hw/xen/xen-bus.c b/hw/xen/xen-bus.c
index 12ff782005..3ffd1a5333 100644
--- a/hw/xen/xen-bus.c
+++ b/hw/xen/xen-bus.c
@@ -209,7 +209,8 @@ static void xen_bus_type_enumerate(XenBus *xenbus, const char *type)
                           NULL, "%u", &online) != 1)
             online = 0;
 
-        if (online && state == XenbusStateInitialising) {
+        if (online && state == XenbusStateInitialising &&
+            !xen_backend_exists(type, backend[i])) {
             Error *local_err = NULL;
 
             xen_bus_backend_create(xenbus, type, backend[i], backend_path,
diff --git a/include/hw/xen/xen-backend.h b/include/hw/xen/xen-backend.h
index aac2fd454d..0f01631ae7 100644
--- a/include/hw/xen/xen-backend.h
+++ b/include/hw/xen/xen-backend.h
@@ -33,6 +33,7 @@ XenDevice *xen_backend_get_device(XenBackendInstance *backend);
 void xen_backend_register(const XenBackendInfo *info);
 const char **xen_backend_get_types(unsigned int *nr);
 
+bool xen_backend_exists(const char *type, const char *name);
 void xen_backend_device_create(XenBus *xenbus, const char *type,
                                const char *name, QDict *opts, Error **errp);
 bool xen_backend_try_device_destroy(XenDevice *xendev, Error **errp);
-- 
2.40.1


  parent reply	other threads:[~2023-10-25 14:52 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-10-25 14:50 [PATCH v3 00/28] Get Xen PV shim running in QEMU, add net & console David Woodhouse
2023-10-25 14:50 ` [PATCH v3 01/28] i386/xen: Don't advertise XENFEAT_supervisor_mode_kernel David Woodhouse
2023-10-25 14:50 ` [PATCH v3 02/28] i386/xen: fix per-vCPU upcall vector for Xen emulation David Woodhouse
2023-10-25 14:50 ` [PATCH v3 03/28] hw/xen: select kernel mode for per-vCPU event channel upcall vector David Woodhouse
2023-10-25 14:50 ` [PATCH v3 04/28] hw/xen: don't clear map_track[] in xen_gnttab_reset() David Woodhouse
2023-10-25 14:50 ` [PATCH v3 05/28] hw/xen: fix XenStore watch delivery to guest David Woodhouse
2023-10-27  7:15   ` Durrant, Paul
2023-10-25 14:50 ` [PATCH v3 06/28] hw/xen: take iothread mutex in xen_evtchn_reset_op() David Woodhouse
2023-10-27  7:20   ` Durrant, Paul
2023-10-25 14:50 ` [PATCH v3 07/28] hw/xen: use correct default protocol for xen-block on x86 David Woodhouse
2023-10-27  7:22   ` Durrant, Paul
2023-10-25 14:50 ` [PATCH v3 08/28] i386/xen: Ignore VCPU_SSHOTTMR_future flag in set_singleshot_timer() David Woodhouse
2023-10-27  7:23   ` Durrant, Paul
2023-10-25 14:50 ` [PATCH v3 09/28] hw/xen: Clean up event channel 'type_val' handling to use union David Woodhouse
2023-10-25 14:50 ` [PATCH v3 10/28] include: update Xen public headers to Xen 4.17.2 release David Woodhouse
2023-10-25 14:50 ` [PATCH v3 11/28] i386/xen: advertise XEN_HVM_CPUID_UPCALL_VECTOR in CPUID David Woodhouse
2023-10-25 14:50 ` [PATCH v3 12/28] hw/xen: populate store frontend nodes with XenStore PFN/port David Woodhouse
2023-10-25 14:50 ` [PATCH v3 13/28] hw/xen: automatically assign device index to block devices David Woodhouse
2023-10-27  7:30   ` Durrant, Paul
2023-10-27  8:45     ` David Woodhouse
2023-10-27  9:01       ` Durrant, Paul
2023-10-27 10:25         ` David Woodhouse
2023-10-27 10:32           ` Durrant, Paul
2023-10-27 12:02             ` David Woodhouse
2023-10-25 14:50 ` [PATCH v3 14/28] hw/xen: add get_frontend_path() method to XenDeviceClass David Woodhouse
2023-10-27  7:31   ` Durrant, Paul
2023-10-25 14:50 ` David Woodhouse [this message]
2023-10-25 14:50 ` [PATCH v3 16/28] hw/xen: update Xen console to XenDevice model David Woodhouse
2023-10-25 14:50 ` [PATCH v3 17/28] hw/xen: add support for Xen primary console in emulated mode David Woodhouse
2023-10-27  7:44   ` Durrant, Paul
2023-10-25 14:50 ` [PATCH v3 18/28] hw/xen: only remove peers of PCI NICs on unplug David Woodhouse
2023-10-27  8:29   ` Durrant, Paul
2023-10-25 14:50 ` [PATCH v3 19/28] hw/xen: update Xen PV NIC to XenDevice model David Woodhouse
2023-10-27  8:42   ` Durrant, Paul
2023-10-25 14:50 ` [PATCH v3 20/28] net: do not delete nics in net_cleanup() David Woodhouse
2023-10-27  8:44   ` Durrant, Paul
2023-10-25 14:50 ` [PATCH v3 21/28] xen-platform: unplug AHCI disks David Woodhouse
2023-10-27  9:08   ` Durrant, Paul
2023-10-25 14:50 ` [PATCH v3 22/28] net: add qemu_{configure,create}_nic_device(), qemu_find_nic_info() David Woodhouse
2023-10-25 14:50   ` [PATCH v3 22/28] net: add qemu_{configure, create}_nic_device(), qemu_find_nic_info() David Woodhouse
2023-10-27  9:25   ` [PATCH v3 22/28] net: add qemu_{configure,create}_nic_device(), qemu_find_nic_info() Durrant, Paul
2023-10-25 14:50 ` [PATCH v3 23/28] net: report list of available models according to platform David Woodhouse
2023-10-27  9:31   ` Durrant, Paul
2023-10-25 14:50 ` [PATCH v3 24/28] net: add qemu_create_nic_bus_devices() David Woodhouse
2023-10-27  9:42   ` Durrant, Paul
2023-10-25 14:50 ` [PATCH v3 25/28] hw/pci: add pci_init_nic_devices(), pci_init_nic_in_slot() David Woodhouse
2023-10-27  9:46   ` Durrant, Paul
2023-10-25 14:50 ` [PATCH v3 26/28] hw/i386/pc: use qemu_get_nic_info() and pci_init_nic_devices() David Woodhouse
2023-10-27  9:48   ` Durrant, Paul
2023-10-25 14:50 ` [PATCH v3 27/28] hw/xen: use qemu_create_nic_bus_devices() to instantiate Xen NICs David Woodhouse
2023-10-27  9:52   ` Durrant, Paul
2023-10-25 14:50 ` [PATCH v3 28/28] docs: update Xen-on-KVM documentation David Woodhouse
2023-10-25 18:20   ` Eric Blake
2023-10-25 18:26     ` David Woodhouse
2023-10-25 18:56       ` Andrew Cooper
2023-10-25 19:02         ` David Woodhouse
2023-10-26  8:26         ` Kevin Wolf
2023-10-26  9:25           ` David Woodhouse
2023-10-26 16:25             ` David Woodhouse

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231025145042.627381-16-dwmw2@infradead.org \
    --to=dwmw2@infradead.org \
    --cc=anthony.perard@citrix.com \
    --cc=eduardo@habkost.net \
    --cc=hreitz@redhat.com \
    --cc=jasowang@redhat.com \
    --cc=jupham125@gmail.com \
    --cc=kvm@vger.kernel.org \
    --cc=kwolf@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=mst@redhat.com \
    --cc=mtosatti@redhat.com \
    --cc=paul@xen.org \
    --cc=pbonzini@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=shentey@gmail.com \
    --cc=sstabellini@kernel.org \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.