svn commit: r307026 - in stable/10/sys/dev/hyperv: include netvsc storvsc utilities vmbus
Sepherosa Ziehau
sephe at FreeBSD.org
Tue Oct 11 08:01:46 UTC 2016
Author: sephe
Date: Tue Oct 11 08:01:43 2016
New Revision: 307026
URL: https://svnweb.freebsd.org/changeset/base/307026
Log:
MFC 302733,302737,302801-302806
302733
hyperv/vmbus: Remove unused code
Sponsored by: Microsoft OSTC
Differential Revision: https://reviews.freebsd.org/D7089
302737
hyperv/vmbus: Cleanup channel rescind
Sponsored by: Microsoft OSTC
Differential Revision: https://reviews.freebsd.org/D7090
302801
hyperv/vmbus: Remove unused bits
Sponsored by: Microsoft OSTC
Differential Revision: https://reviews.freebsd.org/D7091
302802
hyperv: hv_guid -> struct hyperv_guid.
This paves way for the further cleanup/disentangle.
Sponsored by: Microsoft OSTC
Differential Revision: https://reviews.freebsd.org/D7092
302803
hyperv/vmbus: Move channel offer message definition to vmbus_reg.h
- Avoid bit fields.
- Avoid unnecessary indirection.
Sponsored by: Microsoft OSTC
Differential Revision: https://reviews.freebsd.org/D7093
302804
hyperv/vmbus: Switch to vmbus channel message macros
Prepare for more cleanup.
Sponsored by: Microsoft OSTC
Differential Revision: https://reviews.freebsd.org/D7094
302805
hyperv/vmbus: Remove unused bits
Sponsored by: Microsoft OSTC
Differential Revision: https://reviews.freebsd.org/D7095
302806
hyperv/vmbus: Get rid of rel{_id,id}, use channel id consistently.
Sponsored by: Microsoft OSTC
Differential Revision: https://reviews.freebsd.org/D7100
Modified:
stable/10/sys/dev/hyperv/include/hyperv.h
stable/10/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
stable/10/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
stable/10/sys/dev/hyperv/utilities/hv_heartbeat.c
stable/10/sys/dev/hyperv/utilities/hv_kvp.c
stable/10/sys/dev/hyperv/utilities/hv_shutdown.c
stable/10/sys/dev/hyperv/utilities/hv_timesync.c
stable/10/sys/dev/hyperv/vmbus/hv_channel.c
stable/10/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
stable/10/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
stable/10/sys/dev/hyperv/vmbus/hyperv.c
stable/10/sys/dev/hyperv/vmbus/vmbus.c
stable/10/sys/dev/hyperv/vmbus/vmbus_if.m
stable/10/sys/dev/hyperv/vmbus/vmbus_reg.h
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/dev/hyperv/include/hyperv.h
==============================================================================
--- stable/10/sys/dev/hyperv/include/hyperv.h Tue Oct 11 07:50:09 2016 (r307025)
+++ stable/10/sys/dev/hyperv/include/hyperv.h Tue Oct 11 08:01:43 2016 (r307026)
@@ -82,32 +82,6 @@ typedef uint8_t hv_bool_uint8_t;
#define VMBUS_VERSION_MAJOR(ver) (((uint32_t)(ver)) >> 16)
#define VMBUS_VERSION_MINOR(ver) (((uint32_t)(ver)) & 0xffff)
-/*
- * Make maximum size of pipe payload of 16K
- */
-
-#define HV_MAX_PIPE_DATA_PAYLOAD (sizeof(BYTE) * 16384)
-
-/*
- * Define pipe_mode values
- */
-
-#define HV_VMBUS_PIPE_TYPE_BYTE 0x00000000
-#define HV_VMBUS_PIPE_TYPE_MESSAGE 0x00000004
-
-/*
- * The size of the user defined data buffer for non-pipe offers
- */
-
-#define HV_MAX_USER_DEFINED_BYTES 120
-
-/*
- * The size of the user defined data buffer for pipe offers
- */
-
-#define HV_MAX_PIPE_USER_DEFINED_BYTES 116
-
-
#define HV_MAX_PAGE_BUFFER_COUNT 32
#define HV_MAX_MULTIPAGE_BUFFER_COUNT 32
@@ -121,68 +95,13 @@ typedef uint8_t hv_bool_uint8_t;
((HV_ALIGN_UP(addr+len, PAGE_SIZE) - \
HV_ALIGN_DOWN(addr, PAGE_SIZE)) >> PAGE_SHIFT )
-typedef struct hv_guid {
- uint8_t data[16];
-} __packed hv_guid;
+struct hyperv_guid {
+ uint8_t hv_guid[16];
+} __packed;
#define HYPERV_GUID_STRLEN 40
-int hyperv_guid2str(const struct hv_guid *, char *, size_t);
-
-#define HV_NIC_GUID \
- .data = {0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46, \
- 0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E}
-
-#define HV_IDE_GUID \
- .data = {0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, \
- 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5}
-
-#define HV_SCSI_GUID \
- .data = {0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, \
- 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f}
-
-/*
- * At the center of the Channel Management library is
- * the Channel Offer. This struct contains the
- * fundamental information about an offer.
- */
-
-typedef struct hv_vmbus_channel_offer {
- hv_guid interface_type;
- hv_guid interface_instance;
- uint64_t interrupt_latency_in_100ns_units;
- uint32_t interface_revision;
- uint32_t server_context_area_size; /* in bytes */
- uint16_t channel_flags;
- uint16_t mmio_megabytes; /* in bytes * 1024 * 1024 */
- union
- {
- /*
- * Non-pipes: The user has HV_MAX_USER_DEFINED_BYTES bytes.
- */
- struct {
- uint8_t user_defined[HV_MAX_USER_DEFINED_BYTES];
- } __packed standard;
-
- /*
- * Pipes: The following structure is an integrated pipe protocol, which
- * is implemented on top of standard user-defined data. pipe
- * clients have HV_MAX_PIPE_USER_DEFINED_BYTES left for their
- * own use.
- */
- struct {
- uint32_t pipe_mode;
- uint8_t user_defined[HV_MAX_PIPE_USER_DEFINED_BYTES];
- } __packed pipe;
- } u;
-
- /*
- * Sub_channel_index, newly added in Win8.
- */
- uint16_t sub_channel_index;
- uint16_t padding;
-
-} __packed hv_vmbus_channel_offer;
+int hyperv_guid2str(const struct hyperv_guid *, char *, size_t);
typedef struct {
uint16_t type;
@@ -192,13 +111,6 @@ typedef struct {
uint64_t transaction_id;
} __packed hv_vm_packet_descriptor;
-typedef uint32_t hv_previous_packet_offset;
-
-typedef struct {
- hv_previous_packet_offset previous_packet_start_offset;
- hv_vm_packet_descriptor descriptor;
-} __packed hv_vm_packet_header;
-
typedef struct {
uint32_t byte_count;
uint32_t byte_offset;
@@ -213,91 +125,6 @@ typedef struct {
hv_vm_transfer_page ranges[1];
} __packed hv_vm_transfer_page_packet_header;
-typedef struct {
- hv_vm_packet_descriptor d;
- uint32_t gpadl;
- uint32_t reserved;
-} __packed hv_vm_gpadl_packet_header;
-
-typedef struct {
- hv_vm_packet_descriptor d;
- uint32_t gpadl;
- uint16_t transfer_page_set_id;
- uint16_t reserved;
-} __packed hv_vm_add_remove_transfer_page_set;
-
-/*
- * This structure defines a range in guest
- * physical space that can be made
- * to look virtually contiguous.
- */
-
-typedef struct {
- uint32_t byte_count;
- uint32_t byte_offset;
- uint64_t pfn_array[0];
-} __packed hv_gpa_range;
-
-/*
- * This is the format for an Establish Gpadl packet, which contains a handle
- * by which this GPADL will be known and a set of GPA ranges associated with
- * it. This can be converted to a MDL by the guest OS. If there are multiple
- * GPA ranges, then the resulting MDL will be "chained," representing multiple
- * VA ranges.
- */
-
-typedef struct {
- hv_vm_packet_descriptor d;
- uint32_t gpadl;
- uint32_t range_count;
- hv_gpa_range range[1];
-} __packed hv_vm_establish_gpadl;
-
-/*
- * This is the format for a Teardown Gpadl packet, which indicates that the
- * GPADL handle in the Establish Gpadl packet will never be referenced again.
- */
-
-typedef struct {
- hv_vm_packet_descriptor d;
- uint32_t gpadl;
- /* for alignment to a 8-byte boundary */
- uint32_t reserved;
-} __packed hv_vm_teardown_gpadl;
-
-/*
- * This is the format for a GPA-Direct packet, which contains a set of GPA
- * ranges, in addition to commands and/or data.
- */
-
-typedef struct {
- hv_vm_packet_descriptor d;
- uint32_t reserved;
- uint32_t range_count;
- hv_gpa_range range[1];
-} __packed hv_vm_data_gpa_direct;
-
-/*
- * This is the format for a Additional data Packet.
- */
-typedef struct {
- hv_vm_packet_descriptor d;
- uint64_t total_bytes;
- uint32_t byte_offset;
- uint32_t byte_count;
- uint8_t data[1];
-} __packed hv_vm_additional_data;
-
-typedef union {
- hv_vm_packet_descriptor simple_header;
- hv_vm_transfer_page_packet_header transfer_page_header;
- hv_vm_gpadl_packet_header gpadl_header;
- hv_vm_add_remove_transfer_page_set add_remove_transfer_page_header;
- hv_vm_establish_gpadl establish_gpadl_header;
- hv_vm_teardown_gpadl teardown_gpadl_header;
- hv_vm_data_gpa_direct data_gpa_direct_header;
-} __packed hv_vm_packet_largest_possible_header;
-
typedef enum {
HV_VMBUS_PACKET_TYPE_INVALID = 0x0,
HV_VMBUS_PACKET_TYPES_SYNCH = 0x1,
@@ -317,86 +144,6 @@ typedef enum {
#define HV_VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED 1
-/*
- * Version 1 messages
- */
-typedef enum {
- HV_CHANNEL_MESSAGE_INVALID = 0,
- HV_CHANNEL_MESSAGE_OFFER_CHANNEL = 1,
- HV_CHANNEL_MESSAGE_RESCIND_CHANNEL_OFFER = 2,
- HV_CHANNEL_MESSAGE_REQUEST_OFFERS = 3,
- HV_CHANNEL_MESSAGE_ALL_OFFERS_DELIVERED = 4,
- HV_CHANNEL_MESSAGE_OPEN_CHANNEL = 5,
- HV_CHANNEL_MESSAGE_OPEN_CHANNEL_RESULT = 6,
- HV_CHANNEL_MESSAGE_CLOSE_CHANNEL = 7,
- HV_CHANNEL_MESSAGEL_GPADL_HEADER = 8,
- HV_CHANNEL_MESSAGE_GPADL_BODY = 9,
- HV_CHANNEL_MESSAGE_GPADL_CREATED = 10,
- HV_CHANNEL_MESSAGE_GPADL_TEARDOWN = 11,
- HV_CHANNEL_MESSAGE_GPADL_TORNDOWN = 12,
- HV_CHANNEL_MESSAGE_REL_ID_RELEASED = 13,
- HV_CHANNEL_MESSAGE_INITIATED_CONTACT = 14,
- HV_CHANNEL_MESSAGE_VERSION_RESPONSE = 15,
- HV_CHANNEL_MESSAGE_UNLOAD = 16,
- HV_CHANNEL_MESSAGE_COUNT
-} hv_vmbus_channel_msg_type;
-
-typedef struct {
- hv_vmbus_channel_msg_type message_type;
- uint32_t padding;
-} __packed hv_vmbus_channel_msg_header;
-
-/*
- * Query VMBus Version parameters
- */
-typedef struct {
- hv_vmbus_channel_msg_header header;
- uint32_t version;
-} __packed hv_vmbus_channel_query_vmbus_version;
-
-/*
- * Channel Offer parameters
- */
-typedef struct {
- hv_vmbus_channel_msg_header header;
- hv_vmbus_channel_offer offer;
- uint32_t child_rel_id;
- uint8_t monitor_id;
- /*
- * This field has been split into a bit field on Win7
- * and higher.
- */
- uint8_t monitor_allocated:1;
- uint8_t reserved:7;
- /*
- * Following fields were added in win7 and higher.
- * Make sure to check the version before accessing these fields.
- *
- * If "is_dedicated_interrupt" is set, we must not set the
- * associated bit in the channel bitmap while sending the
- * interrupt to the host.
- *
- * connection_id is used in signaling the host.
- */
- uint16_t is_dedicated_interrupt:1;
- uint16_t reserved1:15;
- uint32_t connection_id;
-} __packed hv_vmbus_channel_offer_channel;
-
-/*
- * Rescind Offer parameters
- */
-typedef struct
-{
- hv_vmbus_channel_msg_header header;
- uint32_t child_rel_id;
-} __packed hv_vmbus_channel_rescind_offer;
-
-typedef struct {
- hv_vmbus_channel_msg_header header;
- uint32_t child_rel_id;
-} __packed hv_vmbus_channel_relid_released;
-
#define HW_MACADDR_LEN 6
/*
@@ -505,18 +252,6 @@ typedef enum {
HV_CHANNEL_CLOSING_NONDESTRUCTIVE_STATE,
} hv_vmbus_channel_state;
-/*
- * Connection identifier type
- */
-typedef union {
- uint32_t as_uint32_t;
- struct {
- uint32_t id:24;
- uint32_t reserved:8;
- } u;
-
-} __packed hv_vmbus_connection_id;
-
typedef struct hv_vmbus_channel {
device_t ch_dev;
struct vmbus_softc *vmbus_sc;
@@ -603,8 +338,8 @@ typedef struct hv_vmbus_channel {
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 hyperv_guid ch_guid_type;
+ struct hyperv_guid ch_guid_inst;
struct sysctl_ctx_list ch_sysctl_ctx;
} hv_vmbus_channel;
Modified: stable/10/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
==============================================================================
--- stable/10/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c Tue Oct 11 07:50:09 2016 (r307025)
+++ stable/10/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c Tue Oct 11 08:01:43 2016 (r307026)
@@ -403,8 +403,8 @@ hn_ifmedia_sts(struct ifnet *ifp, struct
}
/* {F8615163-DF3E-46c5-913F-F2D2F965ED0E} */
-static const hv_guid g_net_vsc_device_type = {
- .data = {0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46,
+static const struct hyperv_guid g_net_vsc_device_type = {
+ .hv_guid = {0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46,
0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E}
};
Modified: stable/10/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
==============================================================================
--- stable/10/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c Tue Oct 11 07:50:09 2016 (r307025)
+++ stable/10/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c Tue Oct 11 08:01:43 2016 (r307026)
@@ -180,14 +180,14 @@ enum hv_storage_type {
#define HV_STORAGE_SUPPORTS_MULTI_CHANNEL 0x1
/* {ba6163d9-04a1-4d29-b605-72e2ffb1dc7f} */
-static const hv_guid gStorVscDeviceType={
- .data = {0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d,
+static const struct hyperv_guid gStorVscDeviceType={
+ .hv_guid = {0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d,
0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f}
};
/* {32412632-86cb-44a2-9b5c-50d1417354f5} */
-static const hv_guid gBlkVscDeviceType={
- .data = {0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44,
+static const struct hyperv_guid gBlkVscDeviceType={
+ .hv_guid = {0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44,
0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5}
};
Modified: stable/10/sys/dev/hyperv/utilities/hv_heartbeat.c
==============================================================================
--- stable/10/sys/dev/hyperv/utilities/hv_heartbeat.c Tue Oct 11 07:50:09 2016 (r307025)
+++ stable/10/sys/dev/hyperv/utilities/hv_heartbeat.c Tue Oct 11 08:01:43 2016 (r307026)
@@ -39,7 +39,7 @@
#include "vmbus_if.h"
/* Heartbeat Service */
-static const hv_guid service_guid = { .data =
+static const struct hyperv_guid service_guid = { .hv_guid =
{0x39, 0x4f, 0x16, 0x57, 0x15, 0x91, 0x78, 0x4e,
0xab, 0x55, 0x38, 0x2f, 0x3b, 0xd5, 0x42, 0x2d} };
Modified: stable/10/sys/dev/hyperv/utilities/hv_kvp.c
==============================================================================
--- stable/10/sys/dev/hyperv/utilities/hv_kvp.c Tue Oct 11 07:50:09 2016 (r307025)
+++ stable/10/sys/dev/hyperv/utilities/hv_kvp.c Tue Oct 11 08:01:43 2016 (r307026)
@@ -90,7 +90,7 @@ static int hv_kvp_log = 0;
log(LOG_INFO, "hv_kvp: " __VA_ARGS__); \
} while (0)
-static const hv_guid service_guid = { .data =
+static const struct hyperv_guid service_guid = { .hv_guid =
{0xe7, 0xf4, 0xa0, 0xa9, 0x45, 0x5a, 0x96, 0x4d,
0xb8, 0x27, 0x8a, 0x84, 0x1e, 0x8c, 0x3, 0xe6} };
Modified: stable/10/sys/dev/hyperv/utilities/hv_shutdown.c
==============================================================================
--- stable/10/sys/dev/hyperv/utilities/hv_shutdown.c Tue Oct 11 07:50:09 2016 (r307025)
+++ stable/10/sys/dev/hyperv/utilities/hv_shutdown.c Tue Oct 11 08:01:43 2016 (r307026)
@@ -43,7 +43,7 @@
#include "hv_util.h"
#include "vmbus_if.h"
-static const hv_guid service_guid = { .data =
+static const struct hyperv_guid service_guid = { .hv_guid =
{0x31, 0x60, 0x0B, 0X0E, 0x13, 0x52, 0x34, 0x49,
0x81, 0x8B, 0x38, 0XD9, 0x0C, 0xED, 0x39, 0xDB} };
Modified: stable/10/sys/dev/hyperv/utilities/hv_timesync.c
==============================================================================
--- stable/10/sys/dev/hyperv/utilities/hv_timesync.c Tue Oct 11 07:50:09 2016 (r307025)
+++ stable/10/sys/dev/hyperv/utilities/hv_timesync.c Tue Oct 11 08:01:43 2016 (r307026)
@@ -55,7 +55,7 @@ typedef struct {
} time_sync_data;
/* Time Synch Service */
-static const hv_guid service_guid = {.data =
+static const struct hyperv_guid service_guid = {.hv_guid =
{0x30, 0xe6, 0x27, 0x95, 0xae, 0xd0, 0x7b, 0x49,
0xad, 0xce, 0xe8, 0x0a, 0xb0, 0x17, 0x5c, 0xaf } };
Modified: stable/10/sys/dev/hyperv/vmbus/hv_channel.c
==============================================================================
--- stable/10/sys/dev/hyperv/vmbus/hv_channel.c Tue Oct 11 07:50:09 2016 (r307025)
+++ stable/10/sys/dev/hyperv/vmbus/hv_channel.c Tue Oct 11 08:01:43 2016 (r307026)
@@ -897,25 +897,23 @@ vmbus_event_flags_proc(struct vmbus_soft
int f;
for (f = 0; f < flag_cnt; ++f) {
- uint32_t rel_id_base;
+ uint32_t chid_base;
u_long flags;
- int bit;
+ int chid_ofs;
if (event_flags[f] == 0)
continue;
flags = atomic_swap_long(&event_flags[f], 0);
- rel_id_base = f << VMBUS_EVTFLAG_SHIFT;
+ chid_base = f << VMBUS_EVTFLAG_SHIFT;
- while ((bit = ffsl(flags)) != 0) {
+ while ((chid_ofs = ffsl(flags)) != 0) {
struct hv_vmbus_channel *channel;
- uint32_t rel_id;
- --bit; /* NOTE: ffsl is 1-based */
- flags &= ~(1UL << bit);
+ --chid_ofs; /* NOTE: ffsl is 1-based */
+ flags &= ~(1UL << chid_ofs);
- rel_id = rel_id_base + bit;
- channel = sc->vmbus_chmap[rel_id];
+ channel = sc->vmbus_chmap[chid_base + chid_ofs];
/* if channel is closed or closing */
if (channel == NULL || channel->rxq == NULL)
Modified: stable/10/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
==============================================================================
--- stable/10/sys/dev/hyperv/vmbus/hv_channel_mgmt.c Tue Oct 11 07:50:09 2016 (r307025)
+++ stable/10/sys/dev/hyperv/vmbus/hv_channel_mgmt.c Tue Oct 11 08:01:43 2016 (r307026)
@@ -45,37 +45,40 @@ 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 *,
const struct vmbus_message *);
-static void vmbus_channel_on_offer_rescind(struct vmbus_softc *,
- const struct vmbus_message *);
static void vmbus_channel_on_offers_delivered(struct vmbus_softc *,
const struct vmbus_message *);
+static void vmbus_chan_msgproc_chrescind(struct vmbus_softc *,
+ const struct vmbus_message *);
-/**
- * Channel message dispatch table
+/*
+ * Vmbus channel message processing.
*/
+
+#define VMBUS_CHANMSG_PROC(name, func) \
+ [VMBUS_CHANMSG_TYPE_##name] = func
+#define VMBUS_CHANMSG_PROC_WAKEUP(name) \
+ VMBUS_CHANMSG_PROC(name, vmbus_msghc_wakeup)
+
static const vmbus_chanmsg_proc_t
-vmbus_chanmsg_process[HV_CHANNEL_MESSAGE_COUNT] = {
- [HV_CHANNEL_MESSAGE_OFFER_CHANNEL] =
- vmbus_channel_on_offer,
- [HV_CHANNEL_MESSAGE_RESCIND_CHANNEL_OFFER] =
- vmbus_channel_on_offer_rescind,
- [HV_CHANNEL_MESSAGE_ALL_OFFERS_DELIVERED] =
- vmbus_channel_on_offers_delivered,
- [HV_CHANNEL_MESSAGE_OPEN_CHANNEL_RESULT] =
- vmbus_msghc_wakeup,
- [HV_CHANNEL_MESSAGE_GPADL_CREATED] =
- vmbus_msghc_wakeup,
- [HV_CHANNEL_MESSAGE_GPADL_TORNDOWN] =
- vmbus_msghc_wakeup,
- [HV_CHANNEL_MESSAGE_VERSION_RESPONSE] =
- vmbus_msghc_wakeup
+vmbus_chanmsg_process[VMBUS_CHANMSG_TYPE_MAX] = {
+ VMBUS_CHANMSG_PROC(CHOFFER, vmbus_channel_on_offer),
+ VMBUS_CHANMSG_PROC(CHRESCIND, vmbus_chan_msgproc_chrescind),
+ VMBUS_CHANMSG_PROC(CHOFFER_DONE,vmbus_channel_on_offers_delivered),
+
+ VMBUS_CHANMSG_PROC_WAKEUP(CHOPEN_RESP),
+ VMBUS_CHANMSG_PROC_WAKEUP(GPADL_CONNRESP),
+ VMBUS_CHANMSG_PROC_WAKEUP(GPADL_DISCONNRESP),
+ VMBUS_CHANMSG_PROC_WAKEUP(CONNECT_RESP)
};
+#undef VMBUS_CHANMSG_PROC_WAKEUP
+#undef VMBUS_CHANMSG_PROC
+
/**
* @brief Allocate and initialize a vmbus channel object
*/
@@ -113,27 +116,25 @@ vmbus_channel_process_offer(hv_vmbus_cha
{
struct vmbus_softc *sc = new_channel->vmbus_sc;
hv_vmbus_channel* channel;
- uint32_t relid;
- relid = new_channel->ch_id;
/*
* Make sure this is a new offer
*/
mtx_lock(&sc->vmbus_chlist_lock);
- if (relid == 0) {
+ if (new_channel->ch_id == 0) {
/*
* XXX channel0 will not be processed; skip it.
*/
printf("VMBUS: got channel0 offer\n");
} else {
- sc->vmbus_chmap[relid] = new_channel;
+ sc->vmbus_chmap[new_channel->ch_id] = new_channel;
}
TAILQ_FOREACH(channel, &sc->vmbus_chlist, ch_link) {
if (memcmp(&channel->ch_guid_type, &new_channel->ch_guid_type,
- sizeof(hv_guid)) == 0 &&
+ sizeof(struct hyperv_guid)) == 0 &&
memcmp(&channel->ch_guid_inst, &new_channel->ch_guid_inst,
- sizeof(hv_guid)) == 0)
+ sizeof(struct hyperv_guid)) == 0)
break;
}
@@ -270,18 +271,16 @@ vmbus_channel_select_defcpu(struct hv_vm
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;
@@ -289,14 +288,14 @@ vmbus_channel_on_offer_internal(struct v
* 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(
@@ -312,15 +311,15 @@ vmbus_channel_on_offer_internal(struct v
}
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. */
@@ -329,33 +328,34 @@ vmbus_channel_on_offer_internal(struct v
vmbus_channel_process_offer(new_channel);
}
-/**
- * @brief Rescind offer handler.
- *
- * We queue a work item to process this offer
- * synchronously.
- *
+/*
* XXX pretty broken; need rework.
*/
static void
-vmbus_channel_on_offer_rescind(struct vmbus_softc *sc,
+vmbus_chan_msgproc_chrescind(struct vmbus_softc *sc,
const struct vmbus_message *msg)
{
- const hv_vmbus_channel_rescind_offer *rescind;
- hv_vmbus_channel* channel;
+ const struct vmbus_chanmsg_chrescind *note;
+ struct hv_vmbus_channel *chan;
+
+ 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",
+ note->chm_chanid);
+ return;
+ }
- rescind = (const hv_vmbus_channel_rescind_offer *)msg->msg_data;
if (bootverbose) {
- device_printf(sc->vmbus_dev, "chan%u rescind\n",
- rescind->child_rel_id);
+ device_printf(sc->vmbus_dev, "chan%u rescinded\n",
+ note->chm_chanid);
}
- channel = sc->vmbus_chmap[rescind->child_rel_id];
- if (channel == NULL)
- return;
- sc->vmbus_chmap[rescind->child_rel_id] = NULL;
+ chan = sc->vmbus_chmap[note->chm_chanid];
+ if (chan == NULL)
+ return;
+ sc->vmbus_chmap[note->chm_chanid] = NULL;
- taskqueue_enqueue(taskqueue_thread, &channel->ch_detach_task);
+ taskqueue_enqueue(taskqueue_thread, &chan->ch_detach_task);
}
static void
@@ -566,7 +566,7 @@ vmbus_chan_msgproc(struct vmbus_softc *s
uint32_t msg_type;
msg_type = ((const struct vmbus_chanmsg_hdr *)msg->msg_data)->chm_type;
- if (msg_type >= HV_CHANNEL_MESSAGE_COUNT) {
+ if (msg_type >= VMBUS_CHANMSG_TYPE_MAX) {
device_printf(sc->vmbus_dev, "unknown message type 0x%x\n",
msg_type);
return;
Modified: stable/10/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
==============================================================================
--- stable/10/sys/dev/hyperv/vmbus/hv_vmbus_priv.h Tue Oct 11 07:50:09 2016 (r307025)
+++ stable/10/sys/dev/hyperv/vmbus/hv_vmbus_priv.h Tue Oct 11 08:01:43 2016 (r307026)
@@ -56,8 +56,8 @@ typedef struct {
typedef struct {
uint32_t rel_id;
hv_vmbus_channel_state state;
- hv_guid interface_type;
- hv_guid interface_instance;
+ struct hyperv_guid interface_type;
+ struct hyperv_guid interface_instance;
uint32_t monitor_id;
uint32_t server_monitor_pending;
uint32_t server_monitor_latency;
@@ -97,67 +97,6 @@ typedef struct hv_vmbus_channel_packet_m
hv_vmbus_multipage_buffer range;
} __packed hv_vmbus_channel_packet_multipage_buffer;
-typedef union {
- uint32_t as_uint32_t;
- struct {
- uint32_t group_enable :4;
- uint32_t rsvd_z :28;
- } u;
-} hv_vmbus_monitor_trigger_state;
-
-typedef union {
- uint64_t as_uint64_t;
- struct {
- uint32_t pending;
- uint32_t armed;
- } u;
-} hv_vmbus_monitor_trigger_group;
-
-typedef struct {
- hv_vmbus_connection_id connection_id;
- uint16_t flag_number;
- uint16_t rsvd_z;
-} hv_vmbus_monitor_parameter;
-
-/*
- * hv_vmbus_monitor_page Layout
- * ------------------------------------------------------
- * | 0 | trigger_state (4 bytes) | Rsvd1 (4 bytes) |
- * | 8 | trigger_group[0] |
- * | 10 | trigger_group[1] |
- * | 18 | trigger_group[2] |
- * | 20 | trigger_group[3] |
- * | 28 | Rsvd2[0] |
- * | 30 | Rsvd2[1] |
- * | 38 | Rsvd2[2] |
- * | 40 | next_check_time[0][0] | next_check_time[0][1] |
- * | ... |
- * | 240 | latency[0][0..3] |
- * | 340 | Rsvz3[0] |
- * | 440 | parameter[0][0] |
- * | 448 | parameter[0][1] |
- * | ... |
- * | 840 | Rsvd4[0] |
- * ------------------------------------------------------
- */
-
-typedef struct {
- hv_vmbus_monitor_trigger_state trigger_state;
- uint32_t rsvd_z1;
-
- hv_vmbus_monitor_trigger_group trigger_group[4];
- uint64_t rsvd_z2[3];
-
- int32_t next_check_time[4][32];
-
- uint16_t latency[4][32];
- uint64_t rsvd_z3[32];
-
- hv_vmbus_monitor_parameter parameter[4][32];
-
- uint8_t rsvd_z4[1984];
-} hv_vmbus_monitor_page;
-
/*
* Private, VM Bus functions
*/
Modified: stable/10/sys/dev/hyperv/vmbus/hyperv.c
==============================================================================
--- stable/10/sys/dev/hyperv/vmbus/hyperv.c Tue Oct 11 07:50:09 2016 (r307025)
+++ stable/10/sys/dev/hyperv/vmbus/hyperv.c Tue Oct 11 08:01:43 2016 (r307026)
@@ -116,9 +116,9 @@ hypercall_signal_event(bus_addr_t monprm
}
int
-hyperv_guid2str(const struct hv_guid *guid, char *buf, size_t sz)
+hyperv_guid2str(const struct hyperv_guid *guid, char *buf, size_t sz)
{
- const uint8_t *d = guid->data;
+ const uint8_t *d = guid->hv_guid;
return snprintf(buf, sz, "%02x%02x%02x%02x-"
"%02x%02x-%02x%02x-%02x%02x-"
Modified: stable/10/sys/dev/hyperv/vmbus/vmbus.c
==============================================================================
--- stable/10/sys/dev/hyperv/vmbus/vmbus.c Tue Oct 11 07:50:09 2016 (r307025)
+++ stable/10/sys/dev/hyperv/vmbus/vmbus.c Tue Oct 11 08:01:43 2016 (r307026)
@@ -1131,11 +1131,12 @@ vmbus_get_version_method(device_t bus, d
}
static int
-vmbus_probe_guid_method(device_t bus, device_t dev, const struct hv_guid *guid)
+vmbus_probe_guid_method(device_t bus, device_t dev,
+ const struct hyperv_guid *guid)
{
const struct hv_vmbus_channel *chan = vmbus_get_channel(dev);
- if (memcmp(&chan->ch_guid_type, guid, sizeof(struct hv_guid)) == 0)
+ if (memcmp(&chan->ch_guid_type, guid, sizeof(struct hyperv_guid)) == 0)
return 0;
return ENXIO;
}
Modified: stable/10/sys/dev/hyperv/vmbus/vmbus_if.m
==============================================================================
--- stable/10/sys/dev/hyperv/vmbus/vmbus_if.m Tue Oct 11 07:50:09 2016 (r307025)
+++ stable/10/sys/dev/hyperv/vmbus/vmbus_if.m Tue Oct 11 08:01:43 2016 (r307026)
@@ -32,7 +32,7 @@
INTERFACE vmbus;
HEADER {
- struct hv_guid;
+ struct hyperv_guid;
};
METHOD uint32_t get_version {
@@ -43,5 +43,5 @@ METHOD uint32_t get_version {
METHOD int probe_guid {
device_t bus;
device_t dev;
- const struct hv_guid *guid;
+ const struct hyperv_guid *guid;
};
Modified: stable/10/sys/dev/hyperv/vmbus/vmbus_reg.h
==============================================================================
--- stable/10/sys/dev/hyperv/vmbus/vmbus_reg.h Tue Oct 11 07:50:09 2016 (r307025)
+++ stable/10/sys/dev/hyperv/vmbus/vmbus_reg.h Tue Oct 11 08:01:43 2016 (r307026)
@@ -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.
@@ -117,11 +118,14 @@ struct vmbus_gpa_range {
/*
* Channel messages
- * - Embedded in vmbus_message.msg_data, e.g. response.
+ * - Embedded in vmbus_message.msg_data, e.g. response and notification.
* - 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_CHOFFER_DONE 4 /* NOTE */
#define VMBUS_CHANMSG_TYPE_CHOPEN 5 /* REQ */
#define VMBUS_CHANMSG_TYPE_CHOPEN_RESP 6 /* RESP */
#define VMBUS_CHANMSG_TYPE_CHCLOSE 7 /* REQ */
@@ -134,6 +138,7 @@ struct vmbus_gpa_range {
#define VMBUS_CHANMSG_TYPE_CONNECT 14 /* REQ */
#define VMBUS_CHANMSG_TYPE_CONNECT_RESP 15 /* RESP */
#define VMBUS_CHANMSG_TYPE_DISCONNECT 16 /* REQ */
+#define VMBUS_CHANMSG_TYPE_MAX 22
struct vmbus_chanmsg_hdr {
uint32_t chm_type; /* VMBUS_CHANMSG_TYPE_ */
@@ -241,4 +246,33 @@ struct vmbus_chanmsg_chfree {
uint32_t chm_chanid;
} __packed;
+/* VMBUS_CHANMSG_TYPE_CHRESCIND */
+struct vmbus_chanmsg_chrescind {
+ struct vmbus_chanmsg_hdr chm_hdr;
+ 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_ */
More information about the svn-src-stable
mailing list