Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F146788510
D7110.id18415.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D7110.id18415.diff
View Options
Index: head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
===================================================================
--- head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
+++ head/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
@@ -398,27 +398,27 @@
vmbus_scan_done(sc);
}
-/**
- * @brief Release channels that are unattached/unconnected (i.e., no drivers associated)
+/*
+ * Detach all devices and destroy the corresponding primary channels.
*/
void
-hv_vmbus_release_unattached_channels(struct vmbus_softc *sc)
+vmbus_chan_destroy_all(struct vmbus_softc *sc)
{
- hv_vmbus_channel *channel;
+ struct hv_vmbus_channel *chan;
mtx_lock(&sc->vmbus_chlist_lock);
+ while ((chan = TAILQ_FIRST(&sc->vmbus_chlist)) != NULL) {
+ KASSERT(VMBUS_CHAN_ISPRIMARY(chan), ("not primary channel"));
+ TAILQ_REMOVE(&sc->vmbus_chlist, chan, ch_link);
+ mtx_unlock(&sc->vmbus_chlist_lock);
- while (!TAILQ_EMPTY(&sc->vmbus_chlist)) {
- channel = TAILQ_FIRST(&sc->vmbus_chlist);
- KASSERT(VMBUS_CHAN_ISPRIMARY(channel), ("not primary channel"));
- TAILQ_REMOVE(&sc->vmbus_chlist, channel, ch_link);
+ hv_vmbus_child_device_unregister(chan);
+ vmbus_chan_free(chan);
- hv_vmbus_child_device_unregister(channel);
- vmbus_chan_free(channel);
+ mtx_lock(&sc->vmbus_chlist_lock);
}
bzero(sc->vmbus_chmap,
sizeof(struct hv_vmbus_channel *) * VMBUS_CHAN_MAX);
-
mtx_unlock(&sc->vmbus_chlist_lock);
}
Index: head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
===================================================================
--- head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
+++ head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
@@ -146,9 +146,6 @@
uint32_t hv_ring_buffer_read_end(
hv_vmbus_ring_buffer_info *ring_info);
-void hv_vmbus_release_unattached_channels(
- struct vmbus_softc *);
-
int hv_vmbus_child_device_register(
struct hv_vmbus_channel *chan);
int hv_vmbus_child_device_unregister(
Index: head/sys/dev/hyperv/vmbus/vmbus.c
===================================================================
--- head/sys/dev/hyperv/vmbus/vmbus.c
+++ head/sys/dev/hyperv/vmbus/vmbus.c
@@ -1239,7 +1239,7 @@
{
struct vmbus_softc *sc = device_get_softc(dev);
- hv_vmbus_release_unattached_channels(sc);
+ vmbus_chan_destroy_all(sc);
vmbus_disconnect(sc);
Index: head/sys/dev/hyperv/vmbus/vmbus_var.h
===================================================================
--- head/sys/dev/hyperv/vmbus/vmbus_var.h
+++ head/sys/dev/hyperv/vmbus/vmbus_var.h
@@ -138,6 +138,7 @@
void vmbus_et_intr(struct trapframe *);
void vmbus_chan_msgproc(struct vmbus_softc *, const struct vmbus_message *);
+void vmbus_chan_destroy_all(struct vmbus_softc *);
struct vmbus_msghc *vmbus_msghc_get(struct vmbus_softc *, size_t);
void vmbus_msghc_put(struct vmbus_softc *, struct vmbus_msghc *);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Mar 6, 2:55 PM (12 h, 10 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29320042
Default Alt Text
D7110.id18415.diff (2 KB)
Attached To
Mode
D7110: hyperv/vmbus: Release vmbus channel lock before detach devices
Attached
Detach File
Event Timeline
Log In to Comment