svn commit: r303180 - head/sys/dev/hyperv/vmbus

Sepherosa Ziehau sephe at FreeBSD.org
Fri Jul 22 03:42:33 UTC 2016


Author: sephe
Date: Fri Jul 22 03:42:32 2016
New Revision: 303180
URL: https://svnweb.freebsd.org/changeset/base/303180

Log:
  hyperv/vmbus: Cleanup and augment bufring sysctl tree creation
  
  Binary state node is added, so that userland programs do not have
  to parse human readable state string.
  
  MFC after:	1 week
  Sponsored by:	Microsoft OSTC
  Differential Revision:	https://reviews.freebsd.org/D7268

Modified:
  head/sys/dev/hyperv/vmbus/hv_ring_buffer.c
  head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
  head/sys/dev/hyperv/vmbus/vmbus_chan.c

Modified: head/sys/dev/hyperv/vmbus/hv_ring_buffer.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_ring_buffer.c	Fri Jul 22 03:34:15 2016	(r303179)
+++ head/sys/dev/hyperv/vmbus/hv_ring_buffer.c	Fri Jul 22 03:42:32 2016	(r303180)
@@ -44,36 +44,74 @@ static uint32_t copy_from_ring_buffer(hv
 		    char *dest, uint32_t dest_len, uint32_t start_read_offset);
 
 static int
-hv_rbi_sysctl_stats(SYSCTL_HANDLER_ARGS)
+vmbus_br_sysctl_state(SYSCTL_HANDLER_ARGS)
 {
-	hv_vmbus_ring_buffer_info* rbi;
-	uint32_t read_index, write_index, interrupt_mask, sz;
-	uint32_t read_avail, write_avail;
-	char rbi_stats[256];
-
-	rbi = (hv_vmbus_ring_buffer_info*)arg1;
-	read_index = rbi->ring_buffer->read_index;
-	write_index = rbi->ring_buffer->write_index;
-	interrupt_mask = rbi->ring_buffer->interrupt_mask;
-	sz = rbi->ring_data_size;
-	write_avail = HV_BYTES_AVAIL_TO_WRITE(read_index,
-			write_index, sz);
-	read_avail = sz - write_avail;
-
-	snprintf(rbi_stats, sizeof(rbi_stats),
-	    "r_idx:%d w_idx:%d int_mask:%d r_avail:%d w_avail:%d",
-	    read_index, write_index, interrupt_mask, read_avail, write_avail);
-	return sysctl_handle_string(oidp, rbi_stats, sizeof(rbi_stats), req);
+	const hv_vmbus_ring_buffer_info *br = arg1;
+	uint32_t rindex, windex, intr_mask, ravail, wavail;
+	char state[256];
+
+	rindex = br->ring_buffer->read_index;
+	windex = br->ring_buffer->write_index;
+	intr_mask = br->ring_buffer->interrupt_mask;
+	wavail = HV_BYTES_AVAIL_TO_WRITE(rindex, windex, br->ring_data_size);
+	ravail = br->ring_data_size - wavail;
+
+	snprintf(state, sizeof(state),
+	    "rindex:%u windex:%u intr_mask:%u ravail:%u wavail:%u",
+	    rindex, windex, intr_mask, ravail, wavail);
+	return sysctl_handle_string(oidp, state, sizeof(state), req);
+}
+
+/*
+ * Binary bufring states.
+ */
+static int
+vmbus_br_sysctl_state_bin(SYSCTL_HANDLER_ARGS)
+{
+#define BR_STATE_RIDX	0
+#define BR_STATE_WIDX	1
+#define BR_STATE_IMSK	2
+#define BR_STATE_RSPC	3
+#define BR_STATE_WSPC	4
+#define BR_STATE_MAX	5
+
+	const hv_vmbus_ring_buffer_info *br = arg1;
+	uint32_t rindex, windex, wavail, state[BR_STATE_MAX];
+
+	rindex = br->ring_buffer->read_index;
+	windex = br->ring_buffer->write_index;
+	wavail = HV_BYTES_AVAIL_TO_WRITE(rindex, windex, br->ring_data_size);
+
+	state[BR_STATE_RIDX] = rindex;
+	state[BR_STATE_WIDX] = windex;
+	state[BR_STATE_IMSK] = br->ring_buffer->interrupt_mask;
+	state[BR_STATE_WSPC] = wavail;
+	state[BR_STATE_RSPC] = br->ring_data_size - wavail;
+
+	return sysctl_handle_opaque(oidp, state, sizeof(state), req);
 }
 
 void
-hv_ring_buffer_stat(struct sysctl_ctx_list *ctx,
-    struct sysctl_oid_list *tree_node, hv_vmbus_ring_buffer_info *rbi,
-    const char *desc)
-{
-	SYSCTL_ADD_PROC(ctx, tree_node, OID_AUTO,
-	    "ring_buffer_stats", CTLTYPE_STRING|CTLFLAG_RD|CTLFLAG_MPSAFE,
-	    rbi, 0, hv_rbi_sysctl_stats, "A", desc);
+vmbus_br_sysctl_create(struct sysctl_ctx_list *ctx, struct sysctl_oid *br_tree,
+    hv_vmbus_ring_buffer_info *br, const char *name)
+{
+	struct sysctl_oid *tree;
+	char desc[64];
+
+	tree = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(br_tree), OID_AUTO,
+	    name, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "");
+	if (tree == NULL)
+		return;
+
+	snprintf(desc, sizeof(desc), "%s state", name);
+	SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "state",
+	    CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
+	    br, 0, vmbus_br_sysctl_state, "A", desc);
+
+	snprintf(desc, sizeof(desc), "%s binary state", name);
+	SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "state_bin",
+	    CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE,
+	    br, 0, vmbus_br_sysctl_state_bin, "IU", desc);
 }
 
 /**

Modified: head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h	Fri Jul 22 03:34:15 2016	(r303179)
+++ head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h	Fri Jul 22 03:42:32 2016	(r303180)
@@ -45,13 +45,11 @@ struct vmbus_softc;
  * Private, VM Bus functions
  */
 struct sysctl_ctx_list;
-struct sysctl_oid_list;
+struct sysctl_oid;
 
-void			hv_ring_buffer_stat(
-				struct sysctl_ctx_list		*ctx,
-				struct sysctl_oid_list		*tree_node,
-				hv_vmbus_ring_buffer_info	*rbi,
-				const char			*desc);
+void	vmbus_br_sysctl_create(struct sysctl_ctx_list *ctx,
+	    struct sysctl_oid *br_tree, hv_vmbus_ring_buffer_info *br,
+	    const char *name);
 
 int			hv_vmbus_ring_buffer_init(
 				hv_vmbus_ring_buffer_info	*ring_info,

Modified: head/sys/dev/hyperv/vmbus/vmbus_chan.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/vmbus_chan.c	Fri Jul 22 03:34:15 2016	(r303179)
+++ head/sys/dev/hyperv/vmbus/vmbus_chan.c	Fri Jul 22 03:42:32 2016	(r303180)
@@ -171,24 +171,17 @@ vmbus_chan_sysctl_create(struct vmbus_ch
 	    chan, 0, vmbus_chan_sysctl_mnf, "I",
 	    "has monitor notification facilities");
 
-	/*
-	 * Create sysctl tree for RX bufring.
-	 */
-	br_tree = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(chid_tree), OID_AUTO,
-	    "in", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "");
-	if (br_tree != NULL) {
-		hv_ring_buffer_stat(ctx, SYSCTL_CHILDREN(br_tree),
-		    &chan->ch_rxbr, "inbound ring buffer stats");
-	}
-
-	/*
-	 * Create sysctl tree for TX bufring.
-	 */
 	br_tree = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(chid_tree), OID_AUTO,
-	    "out", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "");
+	    "br", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "");
 	if (br_tree != NULL) {
-		hv_ring_buffer_stat(ctx, SYSCTL_CHILDREN(br_tree),
-		    &chan->ch_txbr, "outbound ring buffer stats");
+		/*
+		 * Create sysctl tree for RX bufring.
+		 */
+		vmbus_br_sysctl_create(ctx, br_tree, &chan->ch_rxbr, "rx");
+		/*
+		 * Create sysctl tree for TX bufring.
+		 */
+		vmbus_br_sysctl_create(ctx, br_tree, &chan->ch_txbr, "tx");
 	}
 }
 


More information about the svn-src-head mailing list