summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorsephe <sephe@FreeBSD.org>2016-10-11 07:10:12 +0000
committersephe <sephe@FreeBSD.org>2016-10-11 07:10:12 +0000
commit5aca196a1235050ca5edda3bcef3ce631a06097b (patch)
treec4ed8f5965407df1561ad19361adc0ac7d58f625 /sys/dev
parent1863f98be56ab345dd563e2ed8468947585cd5f5 (diff)
downloadFreeBSD-src-5aca196a1235050ca5edda3bcef3ce631a06097b.zip
FreeBSD-src-5aca196a1235050ca5edda3bcef3ce631a06097b.tar.gz
MFC 302693-302697
302693 hyperv/vmbus: Make channel id a field of hv_vmbus_channel. This prepares to remove the unnecessary offer message embedding in hv_vmbus_channel. Sponsored by: Microsoft OSTC Differential Revision: https://reviews.freebsd.org/D7014 302694 hyperv/vmbus: Make subchan index a field of hv_vmbus_channel. This prepares to remove the unnecessary offer message embedding in hv_vmbus_channel. Sponsored by: Microsoft OSTC Differential Revision: https://reviews.freebsd.org/D7015 302695 hyperv/vmbus: Add flags field into hv_vmbus_channel for MNF indication This prepares to remove the unnecessary offer message embedding in hv_vmbus_channel. Sponsored by: Microsoft OSTC Differential Revision: https://reviews.freebsd.org/D7019 302696 hyperv/vmbus: Add type/instance guid fields into hv_vmbus_channel This prepares to remove the unnecessary offer message embedding in hv_vmbus_channel. Sponsored by: Microsoft OSTC Differential Revision: https://reviews.freebsd.org/D7020 302697 hyperv/vmbus: Remove the embedded offer message from hv_vmbus_channel Sponsored by: Microsoft OSTC Differential Revision: https://reviews.freebsd.org/D7021
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/hyperv/include/hyperv.h9
-rw-r--r--sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c18
-rw-r--r--sys/dev/hyperv/vmbus/hv_channel.c56
-rw-r--r--sys/dev/hyperv/vmbus/hv_channel_mgmt.c40
-rw-r--r--sys/dev/hyperv/vmbus/hv_vmbus_priv.h4
-rw-r--r--sys/dev/hyperv/vmbus/vmbus.c7
6 files changed, 69 insertions, 65 deletions
diff --git a/sys/dev/hyperv/include/hyperv.h b/sys/dev/hyperv/include/hyperv.h
index 82bfa48..2ebc608 100644
--- a/sys/dev/hyperv/include/hyperv.h
+++ b/sys/dev/hyperv/include/hyperv.h
@@ -537,7 +537,8 @@ typedef struct hv_vmbus_channel {
struct hv_device* device;
struct vmbus_softc *vmbus_sc;
hv_vmbus_channel_state state;
- hv_vmbus_channel_offer_channel offer_msg;
+ uint32_t ch_flags; /* VMBUS_CHAN_FLAG_ */
+ uint32_t ch_id; /* channel id */
/*
* These are based on the offer_msg.monitor_id.
* Save it here for easy access.
@@ -628,12 +629,18 @@ typedef struct hv_vmbus_channel {
struct task ch_detach_task;
TAILQ_ENTRY(hv_vmbus_channel) ch_link;
+ uint32_t ch_subidx; /* subchan index */
+
+ struct hv_guid ch_guid_type;
+ struct hv_guid ch_guid_inst;
struct sysctl_ctx_list ch_sysctl_ctx;
} hv_vmbus_channel;
#define HV_VMBUS_CHAN_ISPRIMARY(chan) ((chan)->primary_channel == NULL)
+#define VMBUS_CHAN_FLAG_HASMNF 0x0001
+
static inline void
hv_set_channel_read_state(hv_vmbus_channel* channel, boolean_t state)
{
diff --git a/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c b/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
index 3dd1de2..8f1e1e7 100644
--- a/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
+++ b/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
@@ -534,9 +534,9 @@ netvsc_attach(device_t dev)
*/
pri_chan = device_ctx->channel;
KASSERT(HV_VMBUS_CHAN_ISPRIMARY(pri_chan), ("not primary channel"));
- KASSERT(pri_chan->offer_msg.offer.sub_channel_index == 0,
+ KASSERT(pri_chan->ch_subidx == 0,
("primary channel subidx %u",
- pri_chan->offer_msg.offer.sub_channel_index));
+ pri_chan->ch_subidx));
hn_channel_attach(sc, pri_chan);
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
@@ -821,8 +821,8 @@ hn_tx_done(struct hv_vmbus_channel *chan, void *xpkt)
txr = txd->txr;
KASSERT(txr->hn_chan == chan,
("channel mismatch, on channel%u, should be channel%u",
- chan->offer_msg.offer.sub_channel_index,
- txr->hn_chan->offer_msg.offer.sub_channel_index));
+ chan->ch_subidx,
+ txr->hn_chan->ch_subidx));
txr->hn_has_txeof = 1;
hn_txdesc_put(txr, txd);
@@ -2996,7 +2996,7 @@ hn_channel_attach(struct hn_softc *sc, struct hv_vmbus_channel *chan)
struct hn_rx_ring *rxr;
int idx;
- idx = chan->offer_msg.offer.sub_channel_index;
+ idx = chan->ch_subidx;
KASSERT(idx >= 0 && idx < sc->hn_rx_ring_inuse,
("invalid channel index %d, should > 0 && < %d",
@@ -3009,7 +3009,7 @@ hn_channel_attach(struct hn_softc *sc, struct hv_vmbus_channel *chan)
chan->hv_chan_rxr = rxr;
if (bootverbose) {
if_printf(sc->hn_ifp, "link RX ring %d to channel%u\n",
- idx, chan->offer_msg.child_rel_id);
+ idx, chan->ch_id);
}
if (idx < sc->hn_tx_ring_inuse) {
@@ -3023,7 +3023,7 @@ hn_channel_attach(struct hn_softc *sc, struct hv_vmbus_channel *chan)
txr->hn_chan = chan;
if (bootverbose) {
if_printf(sc->hn_ifp, "link TX ring %d to channel%u\n",
- idx, chan->offer_msg.child_rel_id);
+ idx, chan->ch_id);
}
}
@@ -3037,9 +3037,9 @@ hn_subchan_attach(struct hn_softc *sc, struct hv_vmbus_channel *chan)
KASSERT(!HV_VMBUS_CHAN_ISPRIMARY(chan),
("subchannel callback on primary channel"));
- KASSERT(chan->offer_msg.offer.sub_channel_index > 0,
+ KASSERT(chan->ch_subidx > 0,
("invalid channel subidx %u",
- chan->offer_msg.offer.sub_channel_index));
+ chan->ch_subidx));
hn_channel_attach(sc, chan);
}
diff --git a/sys/dev/hyperv/vmbus/hv_channel.c b/sys/dev/hyperv/vmbus/hv_channel.c
index 1c84c4f..9b9f684 100644
--- a/sys/dev/hyperv/vmbus/hv_channel.c
+++ b/sys/dev/hyperv/vmbus/hv_channel.c
@@ -62,12 +62,12 @@ static void
vmbus_channel_set_event(hv_vmbus_channel *channel)
{
struct vmbus_softc *sc = channel->vmbus_sc;
- uint32_t chanid = channel->offer_msg.child_rel_id;
+ uint32_t chanid = channel->ch_id;
atomic_set_long(&sc->vmbus_tx_evtflags[chanid >> VMBUS_EVTFLAG_SHIFT],
1UL << (chanid & VMBUS_EVTFLAG_MASK));
- if (channel->offer_msg.monitor_allocated) {
+ if (channel->ch_flags & VMBUS_CHAN_FLAG_HASMNF) {
hv_vmbus_monitor_page *monitor_page;
monitor_page = sc->vmbus_mnf2;
@@ -86,7 +86,7 @@ vmbus_channel_sysctl_monalloc(SYSCTL_HANDLER_ARGS)
struct hv_vmbus_channel *chan = arg1;
int alloc = 0;
- if (chan->offer_msg.monitor_allocated)
+ if (chan->ch_flags & VMBUS_CHAN_FLAG_HASMNF)
alloc = 1;
return sysctl_handle_int(oidp, &alloc, 0, req);
}
@@ -107,11 +107,11 @@ vmbus_channel_sysctl_create(hv_vmbus_channel* channel)
if (primary_ch == NULL) {
dev = channel->device->device;
- ch_id = channel->offer_msg.child_rel_id;
+ ch_id = channel->ch_id;
} else {
dev = primary_ch->device->device;
- ch_id = primary_ch->offer_msg.child_rel_id;
- sub_ch_id = channel->offer_msg.offer.sub_channel_index;
+ ch_id = primary_ch->ch_id;
+ sub_ch_id = channel->ch_subidx;
}
ctx = &channel->ch_sysctl_ctx;
sysctl_ctx_init(ctx);
@@ -136,7 +136,7 @@ vmbus_channel_sysctl_create(hv_vmbus_channel* channel)
SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(devch_id_sysctl),
OID_AUTO, "chanid", CTLFLAG_RD,
- &channel->offer_msg.child_rel_id, 0, "channel id");
+ &channel->ch_id, 0, "channel id");
}
SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(devch_id_sysctl), OID_AUTO,
"cpu", CTLFLAG_RD, &channel->target_cpu, 0, "owner CPU id");
@@ -190,7 +190,7 @@ hv_vmbus_channel_open(
if (user_data_len > VMBUS_CHANMSG_CHOPEN_UDATA_SIZE) {
device_printf(sc->vmbus_dev,
"invalid udata len %u for chan%u\n",
- user_data_len, new_channel->offer_msg.child_rel_id);
+ user_data_len, new_channel->ch_id);
return EINVAL;
}
@@ -261,14 +261,14 @@ hv_vmbus_channel_open(
if (mh == NULL) {
device_printf(sc->vmbus_dev,
"can not get msg hypercall for chopen(chan%u)\n",
- new_channel->offer_msg.child_rel_id);
+ new_channel->ch_id);
return ENXIO;
}
req = vmbus_msghc_dataptr(mh);
req->chm_hdr.chm_type = VMBUS_CHANMSG_TYPE_CHOPEN;
- req->chm_chanid = new_channel->offer_msg.child_rel_id;
- req->chm_openid = new_channel->offer_msg.child_rel_id;
+ req->chm_chanid = new_channel->ch_id;
+ req->chm_openid = new_channel->ch_id;
req->chm_gpadl = new_channel->ring_buffer_gpadl_handle;
req->chm_vcpuid = new_channel->target_vcpu;
req->chm_rxbr_pgofs = send_ring_buffer_size >> PAGE_SHIFT;
@@ -279,7 +279,7 @@ hv_vmbus_channel_open(
if (ret != 0) {
device_printf(sc->vmbus_dev,
"chopen(chan%u) msg hypercall exec failed: %d\n",
- new_channel->offer_msg.child_rel_id, ret);
+ new_channel->ch_id, ret);
vmbus_msghc_put(sc, mh);
return ret;
}
@@ -294,11 +294,11 @@ hv_vmbus_channel_open(
new_channel->state = HV_CHANNEL_OPENED_STATE;
if (bootverbose) {
device_printf(sc->vmbus_dev, "chan%u opened\n",
- new_channel->offer_msg.child_rel_id);
+ new_channel->ch_id);
}
} else {
device_printf(sc->vmbus_dev, "failed to open chan%u\n",
- new_channel->offer_msg.child_rel_id);
+ new_channel->ch_id);
ret = ENXIO;
}
return (ret);
@@ -369,13 +369,13 @@ hv_vmbus_channel_establish_gpadl(struct hv_vmbus_channel *channel,
if (mh == NULL) {
device_printf(sc->vmbus_dev,
"can not get msg hypercall for gpadl->chan%u\n",
- channel->offer_msg.child_rel_id);
+ channel->ch_id);
return EIO;
}
req = vmbus_msghc_dataptr(mh);
req->chm_hdr.chm_type = VMBUS_CHANMSG_TYPE_GPADL_CONN;
- req->chm_chanid = channel->offer_msg.child_rel_id;
+ req->chm_chanid = channel->ch_id;
req->chm_gpadl = gpadl;
req->chm_range_len = range_len;
req->chm_range_cnt = 1;
@@ -388,7 +388,7 @@ hv_vmbus_channel_establish_gpadl(struct hv_vmbus_channel *channel,
if (error) {
device_printf(sc->vmbus_dev,
"gpadl->chan%u msg hypercall exec failed: %d\n",
- channel->offer_msg.child_rel_id, error);
+ channel->ch_id, error);
vmbus_msghc_put(sc, mh);
return error;
}
@@ -424,12 +424,12 @@ hv_vmbus_channel_establish_gpadl(struct hv_vmbus_channel *channel,
if (status != 0) {
device_printf(sc->vmbus_dev, "gpadl->chan%u failed: "
- "status %u\n", channel->offer_msg.child_rel_id, status);
+ "status %u\n", channel->ch_id, status);
return EIO;
} else {
if (bootverbose) {
device_printf(sc->vmbus_dev, "gpadl->chan%u "
- "succeeded\n", channel->offer_msg.child_rel_id);
+ "succeeded\n", channel->ch_id);
}
}
return 0;
@@ -450,20 +450,20 @@ hv_vmbus_channel_teardown_gpdal(struct hv_vmbus_channel *chan, uint32_t gpadl)
if (mh == NULL) {
device_printf(sc->vmbus_dev,
"can not get msg hypercall for gpa x->chan%u\n",
- chan->offer_msg.child_rel_id);
+ chan->ch_id);
return EBUSY;
}
req = vmbus_msghc_dataptr(mh);
req->chm_hdr.chm_type = VMBUS_CHANMSG_TYPE_GPADL_DISCONN;
- req->chm_chanid = chan->offer_msg.child_rel_id;
+ req->chm_chanid = chan->ch_id;
req->chm_gpadl = gpadl;
error = vmbus_msghc_exec(sc, mh);
if (error) {
device_printf(sc->vmbus_dev,
"gpa x->chan%u msg hypercall exec failed: %d\n",
- chan->offer_msg.child_rel_id, error);
+ chan->ch_id, error);
vmbus_msghc_put(sc, mh);
return error;
}
@@ -502,13 +502,13 @@ hv_vmbus_channel_close_internal(hv_vmbus_channel *channel)
if (mh == NULL) {
device_printf(sc->vmbus_dev,
"can not get msg hypercall for chclose(chan%u)\n",
- channel->offer_msg.child_rel_id);
+ channel->ch_id);
return;
}
req = vmbus_msghc_dataptr(mh);
req->chm_hdr.chm_type = VMBUS_CHANMSG_TYPE_CHCLOSE;
- req->chm_chanid = channel->offer_msg.child_rel_id;
+ req->chm_chanid = channel->ch_id;
error = vmbus_msghc_exec_noresult(mh);
vmbus_msghc_put(sc, mh);
@@ -516,11 +516,11 @@ hv_vmbus_channel_close_internal(hv_vmbus_channel *channel)
if (error) {
device_printf(sc->vmbus_dev,
"chclose(chan%u) msg hypercall exec failed: %d\n",
- channel->offer_msg.child_rel_id, error);
+ channel->ch_id, error);
return;
} else if (bootverbose) {
device_printf(sc->vmbus_dev, "close chan%u\n",
- channel->offer_msg.child_rel_id);
+ channel->ch_id);
}
/* Tear down the gpadl for the channel's ring buffer */
@@ -957,7 +957,7 @@ vmbus_chan_update_evtflagcnt(struct vmbus_softc *sc,
volatile int *flag_cnt_ptr;
int flag_cnt;
- flag_cnt = (chan->offer_msg.child_rel_id / VMBUS_EVTFLAG_LEN) + 1;
+ flag_cnt = (chan->ch_id / VMBUS_EVTFLAG_LEN) + 1;
flag_cnt_ptr = VMBUS_PCPU_PTR(sc, event_flags_cnt, chan->target_cpu);
for (;;) {
@@ -970,7 +970,7 @@ vmbus_chan_update_evtflagcnt(struct vmbus_softc *sc,
if (bootverbose) {
device_printf(sc->vmbus_dev,
"channel%u update cpu%d flag_cnt to %d\n",
- chan->offer_msg.child_rel_id,
+ chan->ch_id,
chan->target_cpu, flag_cnt);
}
break;
diff --git a/sys/dev/hyperv/vmbus/hv_channel_mgmt.c b/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
index 2f6545d..b6d0eac 100644
--- a/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
+++ b/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
@@ -115,7 +115,7 @@ vmbus_channel_process_offer(hv_vmbus_channel *new_channel)
hv_vmbus_channel* channel;
uint32_t relid;
- relid = new_channel->offer_msg.child_rel_id;
+ relid = new_channel->ch_id;
/*
* Make sure this is a new offer
*/
@@ -130,11 +130,9 @@ vmbus_channel_process_offer(hv_vmbus_channel *new_channel)
}
TAILQ_FOREACH(channel, &sc->vmbus_chlist, ch_link) {
- if (memcmp(&channel->offer_msg.offer.interface_type,
- &new_channel->offer_msg.offer.interface_type,
+ if (memcmp(&channel->ch_guid_type, &new_channel->ch_guid_type,
sizeof(hv_guid)) == 0 &&
- memcmp(&channel->offer_msg.offer.interface_instance,
- &new_channel->offer_msg.offer.interface_instance,
+ memcmp(&channel->ch_guid_inst, &new_channel->ch_guid_inst,
sizeof(hv_guid)) == 0)
break;
}
@@ -151,18 +149,18 @@ vmbus_channel_process_offer(hv_vmbus_channel *new_channel)
logstr[0] = '\0';
if (channel != NULL) {
snprintf(logstr, sizeof(logstr), ", primary chan%u",
- channel->offer_msg.child_rel_id);
+ channel->ch_id);
}
device_printf(sc->vmbus_dev, "chan%u subchanid%u offer%s\n",
- new_channel->offer_msg.child_rel_id,
- new_channel->offer_msg.offer.sub_channel_index, logstr);
+ new_channel->ch_id,
+ new_channel->ch_subidx, logstr);
}
if (channel != NULL) {
/*
* Check if this is a sub channel.
*/
- if (new_channel->offer_msg.offer.sub_channel_index != 0) {
+ if (new_channel->ch_subidx != 0) {
/*
* It is a sub channel offer, process it.
*/
@@ -203,7 +201,7 @@ vmbus_channel_process_offer(hv_vmbus_channel *new_channel)
}
printf("VMBUS: duplicated primary channel%u\n",
- new_channel->offer_msg.child_rel_id);
+ new_channel->ch_id);
hv_vmbus_free_vmbus_channel(new_channel);
return;
}
@@ -215,9 +213,7 @@ vmbus_channel_process_offer(hv_vmbus_channel *new_channel)
* (We need to set the device field before calling
* hv_vmbus_child_device_add())
*/
- new_channel->device = hv_vmbus_child_device_create(
- new_channel->offer_msg.offer.interface_type,
- new_channel->offer_msg.offer.interface_instance, new_channel);
+ new_channel->device = hv_vmbus_child_device_create(new_channel);
/*
* Add the new device to the bus. This will kick off device-driver
@@ -244,7 +240,7 @@ vmbus_channel_cpu_set(struct hv_vmbus_channel *chan, int cpu)
if (bootverbose) {
printf("vmbus_chan%u: assigned to cpu%u [vcpu%u]\n",
- chan->offer_msg.child_rel_id,
+ chan->ch_id,
chan->target_cpu, chan->target_vcpu);
}
}
@@ -295,6 +291,12 @@ vmbus_channel_on_offer_internal(struct vmbus_softc *sc,
/* Allocate the channel object and save this offer */
new_channel = hv_vmbus_allocate_channel(sc);
+ new_channel->ch_id = offer->child_rel_id;
+ new_channel->ch_subidx = offer->offer.sub_channel_index;
+ if (offer->monitor_allocated)
+ new_channel->ch_flags |= VMBUS_CHAN_FLAG_HASMNF;
+ new_channel->ch_guid_type = offer->offer.interface_type;
+ new_channel->ch_guid_inst = offer->offer.interface_instance;
/*
* By default we setup state to enable batched
@@ -322,8 +324,6 @@ vmbus_channel_on_offer_internal(struct vmbus_softc *sc,
new_channel->ch_sigevt->hc_connid = offer->connection_id;
}
- memcpy(&new_channel->offer_msg, offer,
- sizeof(hv_vmbus_channel_offer_channel));
new_channel->monitor_group = (uint8_t) offer->monitor_id / 32;
new_channel->monitor_bit = (uint8_t) offer->monitor_id % 32;
@@ -382,13 +382,13 @@ vmbus_chan_detach_task(void *xchan, int pending __unused)
if (mh == NULL) {
device_printf(sc->vmbus_dev,
"can not get msg hypercall for chfree(chan%u)\n",
- chan->offer_msg.child_rel_id);
+ chan->ch_id);
goto remove;
}
req = vmbus_msghc_dataptr(mh);
req->chm_hdr.chm_type = VMBUS_CHANMSG_TYPE_CHFREE;
- req->chm_chanid = chan->offer_msg.child_rel_id;
+ req->chm_chanid = chan->ch_id;
error = vmbus_msghc_exec_noresult(mh);
vmbus_msghc_put(sc, mh);
@@ -396,12 +396,12 @@ vmbus_chan_detach_task(void *xchan, int pending __unused)
if (error) {
device_printf(sc->vmbus_dev,
"chfree(chan%u) failed: %d",
- chan->offer_msg.child_rel_id, error);
+ chan->ch_id, error);
/* NOTE: Move on! */
} else {
if (bootverbose) {
device_printf(sc->vmbus_dev, "chan%u freed\n",
- chan->offer_msg.child_rel_id);
+ chan->ch_id);
}
}
remove:
diff --git a/sys/dev/hyperv/vmbus/hv_vmbus_priv.h b/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
index 1cba8a7..b6cb8f8 100644
--- a/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
+++ b/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
@@ -213,9 +213,7 @@ void hv_vmbus_release_unattached_channels(
struct vmbus_softc *);
struct hv_device* hv_vmbus_child_device_create(
- hv_guid device_type,
- hv_guid device_instance,
- hv_vmbus_channel *channel);
+ struct hv_vmbus_channel *channel);
void hv_vmbus_child_device_register(struct vmbus_softc *,
struct hv_device *child_dev);
diff --git a/sys/dev/hyperv/vmbus/vmbus.c b/sys/dev/hyperv/vmbus/vmbus.c
index 7e7439d..350e120 100644
--- a/sys/dev/hyperv/vmbus/vmbus.c
+++ b/sys/dev/hyperv/vmbus/vmbus.c
@@ -1097,8 +1097,7 @@ vmbus_child_pnpinfo_str(device_t dev, device_t child, char *buf, size_t buflen)
}
struct hv_device *
-hv_vmbus_child_device_create(hv_guid type, hv_guid instance,
- hv_vmbus_channel *channel)
+hv_vmbus_child_device_create(struct hv_vmbus_channel *channel)
{
hv_device *child_dev;
@@ -1108,8 +1107,8 @@ hv_vmbus_child_device_create(hv_guid type, hv_guid instance,
child_dev = malloc(sizeof(hv_device), M_DEVBUF, M_WAITOK | M_ZERO);
child_dev->channel = channel;
- memcpy(&child_dev->class_id, &type, sizeof(hv_guid));
- memcpy(&child_dev->device_id, &instance, sizeof(hv_guid));
+ child_dev->class_id = channel->ch_guid_type;
+ child_dev->device_id = channel->ch_guid_inst;
return (child_dev);
}
OpenPOWER on IntegriCloud