git: f581847a7277 - main - hyperv: scanning locking is using the bus mtx
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 14 Dec 2021 23:53:27 UTC
The branch main has been updated by imp:
URL: https://cgit.FreeBSD.org/src/commit/?id=f581847a7277576dd71e3d4f7de324150799c7f1
commit f581847a7277576dd71e3d4f7de324150799c7f1
Author: Warner Losh <imp@FreeBSD.org>
AuthorDate: 2021-12-14 23:45:18 +0000
Commit: Warner Losh <imp@FreeBSD.org>
CommitDate: 2021-12-14 23:53:09 +0000
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
---
sys/dev/hyperv/vmbus/vmbus.c | 29 ++++++++++++++---------------
1 file 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);
}