Page MenuHomeFreeBSD

D7105.id.diff
No OneTemporary

D7105.id.diff

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

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)

Event Timeline