svn commit: r309030 - in head/sys/dev/hyperv: include vmbus
Sepherosa Ziehau
sephe at FreeBSD.org
Wed Nov 23 05:03:46 UTC 2016
Author: sephe
Date: Wed Nov 23 05:03:44 2016
New Revision: 309030
URL: https://svnweb.freebsd.org/changeset/base/309030
Log:
hyperv/vmbus: Set a mark on the revoked channel.
This will be used to fix device detach DEVMETHOD for revoked primary
channel.
MFC after: 1 week
Sponsored by: Microsoft
Differential Revision: https://reviews.freebsd.org/D8522
Modified:
head/sys/dev/hyperv/include/vmbus.h
head/sys/dev/hyperv/vmbus/vmbus_chan.c
head/sys/dev/hyperv/vmbus/vmbus_chanvar.h
Modified: head/sys/dev/hyperv/include/vmbus.h
==============================================================================
--- head/sys/dev/hyperv/include/vmbus.h Wed Nov 23 01:44:28 2016 (r309029)
+++ head/sys/dev/hyperv/include/vmbus.h Wed Nov 23 05:03:44 2016 (r309030)
@@ -172,6 +172,7 @@ int vmbus_chan_send_prplist(struct vmbu
uint32_t vmbus_chan_id(const struct vmbus_channel *chan);
uint32_t vmbus_chan_subidx(const struct vmbus_channel *chan);
bool vmbus_chan_is_primary(const struct vmbus_channel *chan);
+bool vmbus_chan_is_revoked(const struct vmbus_channel *chan);
const struct hyperv_guid *
vmbus_chan_guid_inst(const struct vmbus_channel *chan);
int vmbus_chan_prplist_nelem(int br_size, int prpcnt_max,
Modified: head/sys/dev/hyperv/vmbus/vmbus_chan.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/vmbus_chan.c Wed Nov 23 01:44:28 2016 (r309029)
+++ head/sys/dev/hyperv/vmbus/vmbus_chan.c Wed Nov 23 05:03:44 2016 (r309030)
@@ -1220,7 +1220,7 @@ vmbus_chan_add(struct vmbus_channel *new
wakeup(prichan);
done:
/*
- * Hook this channel up for later rescind.
+ * Hook this channel up for later revocation.
*/
mtx_lock(&sc->vmbus_chan_lock);
vmbus_chan_ins_list(sc, newchan);
@@ -1368,7 +1368,7 @@ vmbus_chan_msgproc_chrescind(struct vmbu
note = (const struct vmbus_chanmsg_chrescind *)msg->msg_data;
if (note->chm_chanid > VMBUS_CHAN_MAX) {
- device_printf(sc->vmbus_dev, "invalid rescinded chan%u\n",
+ device_printf(sc->vmbus_dev, "invalid revoked chan%u\n",
note->chm_chanid);
return;
}
@@ -1403,8 +1403,12 @@ vmbus_chan_msgproc_chrescind(struct vmbu
mtx_unlock(&sc->vmbus_prichan_lock);
}
+ if (atomic_testandset_int(&chan->ch_stflags,
+ VMBUS_CHAN_ST_REVOKED_SHIFT))
+ panic("channel has already been revoked");
+
if (bootverbose)
- vmbus_chan_printf(chan, "chan%u rescinded\n", note->chm_chanid);
+ vmbus_chan_printf(chan, "chan%u revoked\n", note->chm_chanid);
/* Detach the target channel. */
taskqueue_enqueue(chan->ch_mgmt_tq, &chan->ch_detach_task);
@@ -1695,3 +1699,12 @@ vmbus_chan_mgmt_tq(const struct vmbus_ch
return (chan->ch_mgmt_tq);
}
+
+bool
+vmbus_chan_is_revoked(const struct vmbus_channel *chan)
+{
+
+ if (chan->ch_stflags & VMBUS_CHAN_ST_REVOKED)
+ return (true);
+ return (false);
+}
Modified: head/sys/dev/hyperv/vmbus/vmbus_chanvar.h
==============================================================================
--- head/sys/dev/hyperv/vmbus/vmbus_chanvar.h Wed Nov 23 01:44:28 2016 (r309029)
+++ head/sys/dev/hyperv/vmbus/vmbus_chanvar.h Wed Nov 23 05:03:44 2016 (r309030)
@@ -159,10 +159,12 @@ struct vmbus_channel {
#define VMBUS_CHAN_ST_ONPRIL_SHIFT 1
#define VMBUS_CHAN_ST_ONSUBL_SHIFT 2
#define VMBUS_CHAN_ST_ONLIST_SHIFT 3
+#define VMBUS_CHAN_ST_REVOKED_SHIFT 4 /* sticky */
#define VMBUS_CHAN_ST_OPENED (1 << VMBUS_CHAN_ST_OPENED_SHIFT)
#define VMBUS_CHAN_ST_ONPRIL (1 << VMBUS_CHAN_ST_ONPRIL_SHIFT)
#define VMBUS_CHAN_ST_ONSUBL (1 << VMBUS_CHAN_ST_ONSUBL_SHIFT)
#define VMBUS_CHAN_ST_ONLIST (1 << VMBUS_CHAN_ST_ONLIST_SHIFT)
+#define VMBUS_CHAN_ST_REVOKED (1 << VMBUS_CHAN_ST_REVOKED_SHIFT)
struct vmbus_softc;
struct vmbus_message;
More information about the svn-src-all
mailing list