hyperv/vmbus: Move channel offer message definition to vmbus_reg.h

- Avoid bit fields.
- Avoid unnecessary indirection.

MFC after:	1 week
Sponsored by:	Microsoft OSTC
Differential Revision:	https://reviews.freebsd.org/D7093
This commit is contained in:
Sepherosa Ziehau
2016-07-14 05:33:33 +00:00
parent 71ac1309f0
commit e979461031
2 changed files with 38 additions and 15 deletions
+13 -15
View File
@@ -42,7 +42,7 @@ typedef void (*vmbus_chanmsg_proc_t)
static struct hv_vmbus_channel *hv_vmbus_allocate_channel(struct vmbus_softc *);
static void vmbus_channel_on_offer_internal(struct vmbus_softc *,
const hv_vmbus_channel_offer_channel *offer);
const struct vmbus_chanmsg_choffer *);
static void vmbus_chan_detach_task(void *, int);
static void vmbus_channel_on_offer(struct vmbus_softc *,
@@ -267,18 +267,16 @@ vmbus_channel_select_defcpu(struct hv_vmbus_channel *chan)
static void
vmbus_channel_on_offer(struct vmbus_softc *sc, const struct vmbus_message *msg)
{
const hv_vmbus_channel_offer_channel *offer;
/* New channel is offered by vmbus */
vmbus_scan_newchan(sc);
offer = (const hv_vmbus_channel_offer_channel *)msg->msg_data;
vmbus_channel_on_offer_internal(sc, offer);
vmbus_channel_on_offer_internal(sc,
(const struct vmbus_chanmsg_choffer *)msg->msg_data);
}
static void
vmbus_channel_on_offer_internal(struct vmbus_softc *sc,
const hv_vmbus_channel_offer_channel *offer)
const struct vmbus_chanmsg_choffer *offer)
{
hv_vmbus_channel* new_channel;
@@ -286,14 +284,14 @@ 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;
new_channel->ch_guid_type = offer->offer.interface_type;
new_channel->ch_guid_inst = offer->offer.interface_instance;
new_channel->ch_id = offer->chm_chanid;
new_channel->ch_subidx = offer->chm_subidx;
new_channel->ch_guid_type = offer->chm_chtype;
new_channel->ch_guid_inst = offer->chm_chinst;
/* Batch reading is on by default */
new_channel->ch_flags |= VMBUS_CHAN_FLAG_BATCHREAD;
if (offer->monitor_allocated)
if (offer->chm_flags1 & VMBUS_CHOFFER_FLAG1_HASMNF)
new_channel->ch_flags |= VMBUS_CHAN_FLAG_HASMNF;
new_channel->ch_monprm = hyperv_dmamem_alloc(
@@ -309,15 +307,15 @@ vmbus_channel_on_offer_internal(struct vmbus_softc *sc,
}
new_channel->ch_monprm->mp_connid = VMBUS_CONNID_EVENT;
if (sc->vmbus_version != VMBUS_VERSION_WS2008)
new_channel->ch_monprm->mp_connid = offer->connection_id;
new_channel->ch_monprm->mp_connid = offer->chm_connid;
if (new_channel->ch_flags & VMBUS_CHAN_FLAG_HASMNF) {
new_channel->ch_montrig_idx =
offer->monitor_id / VMBUS_MONTRIG_LEN;
offer->chm_montrig / VMBUS_MONTRIG_LEN;
if (new_channel->ch_montrig_idx >= VMBUS_MONTRIGS_MAX)
panic("invalid monitor id %u", offer->monitor_id);
panic("invalid monitor trigger %u", offer->chm_montrig);
new_channel->ch_montrig_mask =
1 << (offer->monitor_id % VMBUS_MONTRIG_LEN);
1 << (offer->chm_montrig % VMBUS_MONTRIG_LEN);
}
/* Select default cpu for this channel. */
+25
View File
@@ -31,6 +31,7 @@
#include <sys/param.h>
#include <dev/hyperv/vmbus/hyperv_reg.h>
#include <dev/hyperv/include/hyperv.h> /* XXX for hyperv_guid */
/*
* Hyper-V SynIC message format.
@@ -121,6 +122,7 @@ struct vmbus_gpa_range {
* - Embedded in hypercall_postmsg_in.hc_data, e.g. request.
*/
#define VMBUS_CHANMSG_TYPE_CHOFFER 1 /* NOTE */
#define VMBUS_CHANMSG_TYPE_CHRESCIND 2 /* NOTE */
#define VMBUS_CHANMSG_TYPE_CHREQUEST 3 /* REQ */
#define VMBUS_CHANMSG_TYPE_CHOPEN 5 /* REQ */
@@ -248,4 +250,27 @@ struct vmbus_chanmsg_chrescind {
uint32_t chm_chanid;
} __packed;
/* VMBUS_CHANMSG_TYPE_CHOFFER */
struct vmbus_chanmsg_choffer {
struct vmbus_chanmsg_hdr chm_hdr;
struct hyperv_guid chm_chtype;
struct hyperv_guid chm_chinst;
uint64_t chm_chlat; /* unit: 100ns */
uint32_t chm_chrev;
uint32_t chm_svrctx_sz;
uint16_t chm_chflags;
uint16_t chm_mmio_sz; /* unit: MB */
uint8_t chm_udata[120];
uint16_t chm_subidx;
uint16_t chm_rsvd;
uint32_t chm_chanid;
uint8_t chm_montrig;
uint8_t chm_flags1; /* VMBUS_CHOFFER_FLAG1_ */
uint16_t chm_flags2;
uint32_t chm_connid;
} __packed;
CTASSERT(sizeof(struct vmbus_chanmsg_choffer) <= VMBUS_MSG_DSIZE_MAX);
#define VMBUS_CHOFFER_FLAG1_HASMNF 0x01
#endif /* !_VMBUS_REG_H_ */