aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2021-12-14 23:45:18 +0000
committerWarner Losh <imp@FreeBSD.org>2021-12-14 23:53:09 +0000
commitf581847a7277576dd71e3d4f7de324150799c7f1 (patch)
tree4a9d07239a9091d0e2b769cac21707a52dd6ff8b
parentcf3ed8e0cd9505f21f614e8208f7afd9cfa4d621 (diff)
downloadsrc-f581847a7277576dd71e3d4f7de324150799c7f1.tar.gz
src-f581847a7277576dd71e3d4f7de324150799c7f1.zip
hyperv: scanning locking is using the bus mtx
The scanning code uses Giant to coordinate its accesses to newbus as well as to synchronize a little state within hyperv's vmbus. Switch to the new bus_topo_* functions instead of referring to Giant explicitly. Sponsored by: Netflix Reviewed by: jhb Differential Revision: https://reviews.freebsd.org/D31840
-rw-r--r--sys/dev/hyperv/vmbus/vmbus.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/sys/dev/hyperv/vmbus/vmbus.c b/sys/dev/hyperv/vmbus/vmbus.c
index 31951cbf4858..f0dea84426eb 100644
--- a/sys/dev/hyperv/vmbus/vmbus.c
+++ b/sys/dev/hyperv/vmbus/vmbus.c
@@ -520,9 +520,9 @@ vmbus_scan_done_task(void *xsc, int pending __unused)
{
struct vmbus_softc *sc = xsc;
- mtx_lock(&Giant);
+ bus_topo_lock();
sc->vmbus_scandone = true;
- mtx_unlock(&Giant);
+ bus_topo_unlock();
wakeup(&sc->vmbus_scandone);
}
@@ -577,9 +577,9 @@ vmbus_scan(struct vmbus_softc *sc)
* Wait for all vmbus devices from the initial channel offers to be
* attached.
*/
- GIANT_REQUIRED;
+ bus_topo_assert();
while (!sc->vmbus_scandone)
- mtx_sleep(&sc->vmbus_scandone, &Giant, 0, "vmbusdev", 0);
+ mtx_sleep(&sc->vmbus_scandone, bus_topo_mtx(), 0, "vmbusdev", 0);
if (bootverbose) {
device_printf(sc->vmbus_dev, "device scan, probe and attach "
@@ -592,17 +592,17 @@ static void
vmbus_scan_teardown(struct vmbus_softc *sc)
{
- GIANT_REQUIRED;
+ bus_topo_assert();
if (sc->vmbus_devtq != NULL) {
- mtx_unlock(&Giant);
+ bus_topo_unlock();
taskqueue_free(sc->vmbus_devtq);
- mtx_lock(&Giant);
+ bus_topo_lock();
sc->vmbus_devtq = NULL;
}
if (sc->vmbus_subchtq != NULL) {
- mtx_unlock(&Giant);
+ bus_topo_unlock();
taskqueue_free(sc->vmbus_subchtq);
- mtx_lock(&Giant);
+ bus_topo_lock();
sc->vmbus_subchtq = NULL;
}
}
@@ -1070,19 +1070,18 @@ vmbus_add_child(struct vmbus_channel *chan)
struct vmbus_softc *sc = chan->ch_vmbus;
device_t parent = sc->vmbus_dev;
- mtx_lock(&Giant);
-
+ bus_topo_lock();
chan->ch_dev = device_add_child(parent, NULL, -1);
if (chan->ch_dev == NULL) {
- mtx_unlock(&Giant);
+ bus_topo_unlock();
device_printf(parent, "device_add_child for chan%u failed\n",
chan->ch_id);
return (ENXIO);
}
device_set_ivars(chan->ch_dev, chan);
device_probe_and_attach(chan->ch_dev);
+ bus_topo_unlock();
- mtx_unlock(&Giant);
return (0);
}
@@ -1091,13 +1090,13 @@ vmbus_delete_child(struct vmbus_channel *chan)
{
int error = 0;
- mtx_lock(&Giant);
+ bus_topo_lock();
if (chan->ch_dev != NULL) {
error = device_delete_child(chan->ch_vmbus->vmbus_dev,
chan->ch_dev);
chan->ch_dev = NULL;
}
- mtx_unlock(&Giant);
+ bus_topo_unlock();
return (error);
}