Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F148921161
D7105.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D7105.id.diff
View Options
Index: head/sys/dev/hyperv/include/hyperv.h
===================================================================
--- head/sys/dev/hyperv/include/hyperv.h
+++ head/sys/dev/hyperv/include/hyperv.h
@@ -244,18 +244,9 @@
typedef void (*hv_vmbus_pfn_channel_callback)(void *context);
-typedef enum {
- HV_CHANNEL_OFFER_STATE,
- HV_CHANNEL_OPENING_STATE,
- HV_CHANNEL_OPEN_STATE,
- HV_CHANNEL_OPENED_STATE,
- HV_CHANNEL_CLOSING_NONDESTRUCTIVE_STATE,
-} hv_vmbus_channel_state;
-
typedef struct hv_vmbus_channel {
device_t ch_dev;
struct vmbus_softc *vmbus_sc;
- hv_vmbus_channel_state state;
uint32_t ch_flags; /* VMBUS_CHAN_FLAG_ */
uint32_t ch_id; /* channel id */
@@ -337,7 +328,8 @@
struct task ch_detach_task;
TAILQ_ENTRY(hv_vmbus_channel) ch_link;
uint32_t ch_subidx; /* subchan index */
-
+ volatile uint32_t ch_stflags; /* atomic-op */
+ /* VMBUS_CHAN_ST_ */
struct hyperv_guid ch_guid_type;
struct hyperv_guid ch_guid_inst;
@@ -357,6 +349,9 @@
*/
#define VMBUS_CHAN_FLAG_BATCHREAD 0x0002
+#define VMBUS_CHAN_ST_OPENED_SHIFT 0
+#define VMBUS_CHAN_ST_OPENED (1 << VMBUS_CHAN_ST_OPENED_SHIFT)
+
static inline void
hv_set_channel_read_state(hv_vmbus_channel* channel, boolean_t on)
{
Index: head/sys/dev/hyperv/netvsc/hv_net_vsc.c
===================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.c
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.c
@@ -719,11 +719,6 @@
/* Now, we can close the channel safely */
- if (!destroy_channel) {
- sc->hn_prichan->state =
- HV_CHANNEL_CLOSING_NONDESTRUCTIVE_STATE;
- }
-
free(sc->hn_prichan->hv_chan_rdbuf, M_NETVSC);
hv_vmbus_channel_close(sc->hn_prichan);
Index: head/sys/dev/hyperv/vmbus/hv_channel.c
===================================================================
--- head/sys/dev/hyperv/vmbus/hv_channel.c
+++ head/sys/dev/hyperv/vmbus/hv_channel.c
@@ -191,17 +191,9 @@
return EINVAL;
}
- mtx_lock(&new_channel->sc_lock);
- if (new_channel->state == HV_CHANNEL_OPEN_STATE) {
- new_channel->state = HV_CHANNEL_OPENING_STATE;
- } else {
- mtx_unlock(&new_channel->sc_lock);
- if(bootverbose)
- printf("VMBUS: Trying to open channel <%p> which in "
- "%d state.\n", new_channel, new_channel->state);
- return (EINVAL);
- }
- mtx_unlock(&new_channel->sc_lock);
+ if (atomic_testandset_int(&new_channel->ch_stflags,
+ VMBUS_CHAN_ST_OPENED_SHIFT))
+ panic("double-open chan%u", new_channel->ch_id);
new_channel->on_channel_callback = pfn_on_channel_callback;
new_channel->channel_callback_context = context;
@@ -223,8 +215,10 @@
M_DEVBUF, M_ZERO, 0UL, BUS_SPACE_MAXADDR, PAGE_SIZE, 0);
KASSERT(out != NULL,
("Error VMBUS: contigmalloc failed to allocate Ring Buffer!"));
- if (out == NULL)
- return (ENOMEM);
+ if (out == NULL) {
+ ret = ENOMEM;
+ goto failed;
+ }
in = ((uint8_t *) out + send_ring_buffer_size);
@@ -265,7 +259,8 @@
device_printf(sc->vmbus_dev,
"can not get msg hypercall for chopen(chan%u)\n",
new_channel->ch_id);
- return ENXIO;
+ ret = ENXIO;
+ goto failed;
}
req = vmbus_msghc_dataptr(mh);
@@ -284,7 +279,7 @@
"chopen(chan%u) msg hypercall exec failed: %d\n",
new_channel->ch_id, ret);
vmbus_msghc_put(sc, mh);
- return ret;
+ goto failed;
}
msg = vmbus_msghc_wait_result(sc, mh);
@@ -294,17 +289,20 @@
vmbus_msghc_put(sc, mh);
if (status == 0) {
- new_channel->state = HV_CHANNEL_OPENED_STATE;
if (bootverbose) {
device_printf(sc->vmbus_dev, "chan%u opened\n",
new_channel->ch_id);
}
- } else {
- device_printf(sc->vmbus_dev, "failed to open chan%u\n",
- new_channel->ch_id);
- ret = ENXIO;
+ return 0;
}
- return (ret);
+
+ device_printf(sc->vmbus_dev, "failed to open chan%u\n",
+ new_channel->ch_id);
+ ret = ENXIO;
+
+failed:
+ atomic_clear_int(&new_channel->ch_stflags, VMBUS_CHAN_ST_OPENED);
+ return ret;
}
/**
@@ -487,7 +485,9 @@
struct taskqueue *rxq = channel->rxq;
int error;
- channel->state = HV_CHANNEL_OPEN_STATE;
+ /* TODO: stringent check */
+ atomic_clear_int(&channel->ch_stflags, VMBUS_CHAN_ST_OPENED);
+
sysctl_ctx_free(&channel->ch_sysctl_ctx);
/*
@@ -563,7 +563,7 @@
*/
TAILQ_FOREACH(sub_channel, &channel->sc_list_anchor,
sc_list_entry) {
- if (sub_channel->state != HV_CHANNEL_OPENED_STATE)
+ if ((sub_channel->ch_stflags & VMBUS_CHAN_ST_OPENED) == 0)
continue;
hv_vmbus_channel_close_internal(sub_channel);
}
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
@@ -191,8 +191,6 @@
ch_link);
mtx_unlock(&sc->vmbus_chlist_lock);
- new_channel->state = HV_CHANNEL_OPEN_STATE;
-
/*
* Bump up sub-channel count and notify anyone that is
* interested in this sub-channel, after this sub-channel
@@ -210,8 +208,6 @@
new_channel->ch_id);
return EINVAL;
}
-
- new_channel->state = HV_CHANNEL_OPEN_STATE;
return 0;
}
@@ -479,7 +475,7 @@
cur_vcpu = VMBUS_PCPU_GET(primary->vmbus_sc, vcpuid, smp_pro_id);
TAILQ_FOREACH(new_channel, &primary->sc_list_anchor, sc_list_entry) {
- if (new_channel->state != HV_CHANNEL_OPENED_STATE){
+ if ((new_channel->ch_stflags & VMBUS_CHAN_ST_OPENED) == 0) {
continue;
}
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
@@ -55,7 +55,6 @@
typedef struct {
uint32_t rel_id;
- hv_vmbus_channel_state state;
struct hyperv_guid interface_type;
struct hyperv_guid interface_instance;
uint32_t monitor_id;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Mar 22, 1:01 AM (11 h, 42 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30099868
Default Alt Text
D7105.id.diff (5 KB)
Attached To
Mode
D7105: hyperv/vmbus: Nuke the channel open state.
Attached
Detach File
Event Timeline
Log In to Comment