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-all mailing list