From: Bjorn Helgaas <helgaas@kernel.org>
To: Juergen Gross <jgross@suse.com>
Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
linux-pci@vger.kernel.org, linux-scsi@vger.kernel.org,
"Stefano Stabellini" <sstabellini@kernel.org>,
"Oleksandr Tyshchenko" <oleksandr_tyshchenko@epam.com>,
"Andrew Lunn" <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
"Eric Dumazet" <edumazet@google.com>,
"Jakub Kicinski" <kuba@kernel.org>,
"Paolo Abeni" <pabeni@redhat.com>,
"Bjorn Helgaas" <bhelgaas@google.com>,
"James E.J. Bottomley" <James.Bottomley@hansenpartnership.com>,
"Martin K. Petersen" <martin.petersen@oracle.com>,
xen-devel@lists.xenproject.org,
"Marek Marczykowski-Górecki" <marmarek@invisiblethingslab.com>
Subject: Re: [PATCH v2 1/2] xenbus: add xenbus_device parameter to xenbus_read_driver_state()
Date: Wed, 18 Feb 2026 11:44:11 -0600 [thread overview]
Message-ID: <20260218174411.GA3434134@bhelgaas> (raw)
In-Reply-To: <20260218095205.453657-2-jgross@suse.com>
On Wed, Feb 18, 2026 at 10:52:04AM +0100, Juergen Gross wrote:
> In order to prepare checking the xenbus device status in
> xenbus_read_driver_state(), add the pointer to struct xenbus_device
> as a parameter.
>
> Signed-off-by: Juergen Gross <jgross@suse.com>
> Tested-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
> Signed-off-by: Juergen Gross <jgross@suse.com>
> ---
> V2:
> - add dev parameter description (kernel test robot)
> ---
> drivers/net/xen-netfront.c | 34 +++++++++++-----------
> drivers/pci/xen-pcifront.c | 8 ++---
Acked-by: Bjorn Helgaas <bhelgaas@google.com> # drivers/pci/xen-pcifront.c
> drivers/scsi/xen-scsifront.c | 2 +-
> drivers/xen/xen-pciback/xenbus.c | 10 +++----
> drivers/xen/xenbus/xenbus_client.c | 4 ++-
> drivers/xen/xenbus/xenbus_probe.c | 6 ++--
> drivers/xen/xenbus/xenbus_probe_frontend.c | 2 +-
> include/xen/xenbus.h | 3 +-
> 8 files changed, 36 insertions(+), 33 deletions(-)
>
> diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
> index 0969d5c9f6b7..2c414b77dd0f 100644
> --- a/drivers/net/xen-netfront.c
> +++ b/drivers/net/xen-netfront.c
> @@ -1646,7 +1646,7 @@ static int xennet_xdp_set(struct net_device *dev, struct bpf_prog *prog,
>
> /* avoid the race with XDP headroom adjustment */
> wait_event(module_wq,
> - xenbus_read_driver_state(np->xbdev->otherend) ==
> + xenbus_read_driver_state(np->xbdev, np->xbdev->otherend) ==
> XenbusStateReconfigured);
> np->netfront_xdp_enabled = true;
>
> @@ -1764,9 +1764,9 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
> do {
> xenbus_switch_state(dev, XenbusStateInitialising);
> err = wait_event_timeout(module_wq,
> - xenbus_read_driver_state(dev->otherend) !=
> + xenbus_read_driver_state(dev, dev->otherend) !=
> XenbusStateClosed &&
> - xenbus_read_driver_state(dev->otherend) !=
> + xenbus_read_driver_state(dev, dev->otherend) !=
> XenbusStateUnknown, XENNET_TIMEOUT);
> } while (!err);
>
> @@ -2627,31 +2627,31 @@ static void xennet_bus_close(struct xenbus_device *dev)
> {
> int ret;
>
> - if (xenbus_read_driver_state(dev->otherend) == XenbusStateClosed)
> + if (xenbus_read_driver_state(dev, dev->otherend) == XenbusStateClosed)
> return;
> do {
> xenbus_switch_state(dev, XenbusStateClosing);
> ret = wait_event_timeout(module_wq,
> - xenbus_read_driver_state(dev->otherend) ==
> - XenbusStateClosing ||
> - xenbus_read_driver_state(dev->otherend) ==
> - XenbusStateClosed ||
> - xenbus_read_driver_state(dev->otherend) ==
> - XenbusStateUnknown,
> - XENNET_TIMEOUT);
> + xenbus_read_driver_state(dev, dev->otherend) ==
> + XenbusStateClosing ||
> + xenbus_read_driver_state(dev, dev->otherend) ==
> + XenbusStateClosed ||
> + xenbus_read_driver_state(dev, dev->otherend) ==
> + XenbusStateUnknown,
> + XENNET_TIMEOUT);
> } while (!ret);
>
> - if (xenbus_read_driver_state(dev->otherend) == XenbusStateClosed)
> + if (xenbus_read_driver_state(dev, dev->otherend) == XenbusStateClosed)
> return;
>
> do {
> xenbus_switch_state(dev, XenbusStateClosed);
> ret = wait_event_timeout(module_wq,
> - xenbus_read_driver_state(dev->otherend) ==
> - XenbusStateClosed ||
> - xenbus_read_driver_state(dev->otherend) ==
> - XenbusStateUnknown,
> - XENNET_TIMEOUT);
> + xenbus_read_driver_state(dev, dev->otherend) ==
> + XenbusStateClosed ||
> + xenbus_read_driver_state(dev, dev->otherend) ==
> + XenbusStateUnknown,
> + XENNET_TIMEOUT);
> } while (!ret);
> }
>
> diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c
> index 11636634ae51..cd22bf984024 100644
> --- a/drivers/pci/xen-pcifront.c
> +++ b/drivers/pci/xen-pcifront.c
> @@ -856,7 +856,7 @@ static void pcifront_try_connect(struct pcifront_device *pdev)
> int err;
>
> /* Only connect once */
> - if (xenbus_read_driver_state(pdev->xdev->nodename) !=
> + if (xenbus_read_driver_state(pdev->xdev, pdev->xdev->nodename) !=
> XenbusStateInitialised)
> return;
>
> @@ -876,7 +876,7 @@ static int pcifront_try_disconnect(struct pcifront_device *pdev)
> enum xenbus_state prev_state;
>
>
> - prev_state = xenbus_read_driver_state(pdev->xdev->nodename);
> + prev_state = xenbus_read_driver_state(pdev->xdev, pdev->xdev->nodename);
>
> if (prev_state >= XenbusStateClosing)
> goto out;
> @@ -895,7 +895,7 @@ static int pcifront_try_disconnect(struct pcifront_device *pdev)
>
> static void pcifront_attach_devices(struct pcifront_device *pdev)
> {
> - if (xenbus_read_driver_state(pdev->xdev->nodename) ==
> + if (xenbus_read_driver_state(pdev->xdev, pdev->xdev->nodename) ==
> XenbusStateReconfiguring)
> pcifront_connect(pdev);
> }
> @@ -909,7 +909,7 @@ static int pcifront_detach_devices(struct pcifront_device *pdev)
> struct pci_dev *pci_dev;
> char str[64];
>
> - state = xenbus_read_driver_state(pdev->xdev->nodename);
> + state = xenbus_read_driver_state(pdev->xdev, pdev->xdev->nodename);
> if (state == XenbusStateInitialised) {
> dev_dbg(&pdev->xdev->dev, "Handle skipped connect.\n");
> /* We missed Connected and need to initialize. */
> diff --git a/drivers/scsi/xen-scsifront.c b/drivers/scsi/xen-scsifront.c
> index 924025305753..ef74d4da5ab0 100644
> --- a/drivers/scsi/xen-scsifront.c
> +++ b/drivers/scsi/xen-scsifront.c
> @@ -1175,7 +1175,7 @@ static void scsifront_backend_changed(struct xenbus_device *dev,
> return;
> }
>
> - if (xenbus_read_driver_state(dev->nodename) ==
> + if (xenbus_read_driver_state(dev, dev->nodename) ==
> XenbusStateInitialised)
> scsifront_do_lun_hotplug(info, VSCSIFRONT_OP_ADD_LUN);
>
> diff --git a/drivers/xen/xen-pciback/xenbus.c b/drivers/xen/xen-pciback/xenbus.c
> index b11e401f1b1e..4bd1c7a8957e 100644
> --- a/drivers/xen/xen-pciback/xenbus.c
> +++ b/drivers/xen/xen-pciback/xenbus.c
> @@ -149,12 +149,12 @@ static int xen_pcibk_attach(struct xen_pcibk_device *pdev)
>
> mutex_lock(&pdev->dev_lock);
> /* Make sure we only do this setup once */
> - if (xenbus_read_driver_state(pdev->xdev->nodename) !=
> + if (xenbus_read_driver_state(pdev->xdev, pdev->xdev->nodename) !=
> XenbusStateInitialised)
> goto out;
>
> /* Wait for frontend to state that it has published the configuration */
> - if (xenbus_read_driver_state(pdev->xdev->otherend) !=
> + if (xenbus_read_driver_state(pdev->xdev, pdev->xdev->otherend) !=
> XenbusStateInitialised)
> goto out;
>
> @@ -374,7 +374,7 @@ static int xen_pcibk_reconfigure(struct xen_pcibk_device *pdev,
> dev_dbg(&pdev->xdev->dev, "Reconfiguring device ...\n");
>
> mutex_lock(&pdev->dev_lock);
> - if (xenbus_read_driver_state(pdev->xdev->nodename) != state)
> + if (xenbus_read_driver_state(pdev->xdev, pdev->xdev->nodename) != state)
> goto out;
>
> err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, "num_devs", "%d",
> @@ -572,7 +572,7 @@ static int xen_pcibk_setup_backend(struct xen_pcibk_device *pdev)
> /* It's possible we could get the call to setup twice, so make sure
> * we're not already connected.
> */
> - if (xenbus_read_driver_state(pdev->xdev->nodename) !=
> + if (xenbus_read_driver_state(pdev->xdev, pdev->xdev->nodename) !=
> XenbusStateInitWait)
> goto out;
>
> @@ -662,7 +662,7 @@ static void xen_pcibk_be_watch(struct xenbus_watch *watch,
> struct xen_pcibk_device *pdev =
> container_of(watch, struct xen_pcibk_device, be_watch);
>
> - switch (xenbus_read_driver_state(pdev->xdev->nodename)) {
> + switch (xenbus_read_driver_state(pdev->xdev, pdev->xdev->nodename)) {
> case XenbusStateInitWait:
> xen_pcibk_setup_backend(pdev);
> break;
> diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c
> index 2dc874fb5506..e502435145ae 100644
> --- a/drivers/xen/xenbus/xenbus_client.c
> +++ b/drivers/xen/xenbus/xenbus_client.c
> @@ -931,12 +931,14 @@ static int xenbus_unmap_ring_hvm(struct xenbus_device *dev, void *vaddr)
>
> /**
> * xenbus_read_driver_state - read state from a store path
> + * @dev: xenbus device pointer
> * @path: path for driver
> *
> * Returns: the state of the driver rooted at the given store path, or
> * XenbusStateUnknown if no state can be read.
> */
> -enum xenbus_state xenbus_read_driver_state(const char *path)
> +enum xenbus_state xenbus_read_driver_state(const struct xenbus_device *dev,
> + const char *path)
> {
> enum xenbus_state result;
> int err = xenbus_gather(XBT_NIL, path, "state", "%d", &result, NULL);
> diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c
> index 9f9011cd7447..2eed06ba5d38 100644
> --- a/drivers/xen/xenbus/xenbus_probe.c
> +++ b/drivers/xen/xenbus/xenbus_probe.c
> @@ -191,7 +191,7 @@ void xenbus_otherend_changed(struct xenbus_watch *watch,
> return;
> }
>
> - state = xenbus_read_driver_state(dev->otherend);
> + state = xenbus_read_driver_state(dev, dev->otherend);
>
> dev_dbg(&dev->dev, "state is %d, (%s), %s, %s\n",
> state, xenbus_strstate(state), dev->otherend_watch.node, path);
> @@ -364,7 +364,7 @@ void xenbus_dev_remove(struct device *_dev)
> * closed.
> */
> if (!drv->allow_rebind ||
> - xenbus_read_driver_state(dev->nodename) == XenbusStateClosing)
> + xenbus_read_driver_state(dev, dev->nodename) == XenbusStateClosing)
> xenbus_switch_state(dev, XenbusStateClosed);
> }
> EXPORT_SYMBOL_GPL(xenbus_dev_remove);
> @@ -514,7 +514,7 @@ int xenbus_probe_node(struct xen_bus_type *bus,
> size_t stringlen;
> char *tmpstring;
>
> - enum xenbus_state state = xenbus_read_driver_state(nodename);
> + enum xenbus_state state = xenbus_read_driver_state(NULL, nodename);
>
> if (state != XenbusStateInitialising) {
> /* Device is not new, so ignore it. This can happen if a
> diff --git a/drivers/xen/xenbus/xenbus_probe_frontend.c b/drivers/xen/xenbus/xenbus_probe_frontend.c
> index f04707d1f667..ca04609730df 100644
> --- a/drivers/xen/xenbus/xenbus_probe_frontend.c
> +++ b/drivers/xen/xenbus/xenbus_probe_frontend.c
> @@ -253,7 +253,7 @@ static int print_device_status(struct device *dev, void *data)
> } else if (xendev->state < XenbusStateConnected) {
> enum xenbus_state rstate = XenbusStateUnknown;
> if (xendev->otherend)
> - rstate = xenbus_read_driver_state(xendev->otherend);
> + rstate = xenbus_read_driver_state(xendev, xendev->otherend);
> pr_warn("Timeout connecting to device: %s (local state %d, remote state %d)\n",
> xendev->nodename, xendev->state, rstate);
> }
> diff --git a/include/xen/xenbus.h b/include/xen/xenbus.h
> index c94caf852aea..15319da65b7f 100644
> --- a/include/xen/xenbus.h
> +++ b/include/xen/xenbus.h
> @@ -228,7 +228,8 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr);
> int xenbus_alloc_evtchn(struct xenbus_device *dev, evtchn_port_t *port);
> int xenbus_free_evtchn(struct xenbus_device *dev, evtchn_port_t port);
>
> -enum xenbus_state xenbus_read_driver_state(const char *path);
> +enum xenbus_state xenbus_read_driver_state(const struct xenbus_device *dev,
> + const char *path);
>
> __printf(3, 4)
> void xenbus_dev_error(struct xenbus_device *dev, int err, const char *fmt, ...);
> --
> 2.53.0
>
next prev parent reply other threads:[~2026-02-18 17:44 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-18 9:52 [PATCH v2 0/2] xen/xenbus: better handle backend crash Juergen Gross
2026-02-18 9:52 ` [PATCH v2 1/2] xenbus: add xenbus_device parameter to xenbus_read_driver_state() Juergen Gross
2026-02-18 17:44 ` Bjorn Helgaas [this message]
2026-02-19 0:26 ` Jakub Kicinski
2026-02-24 19:20 ` Martin K. Petersen
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=20260218174411.GA3434134@bhelgaas \
--to=helgaas@kernel.org \
--cc=James.Bottomley@hansenpartnership.com \
--cc=andrew+netdev@lunn.ch \
--cc=bhelgaas@google.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=jgross@suse.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=marmarek@invisiblethingslab.com \
--cc=martin.petersen@oracle.com \
--cc=netdev@vger.kernel.org \
--cc=oleksandr_tyshchenko@epam.com \
--cc=pabeni@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox