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