[PATCH 4/6] VSOCK: statistics implementation.
VSOCK stats for VMCI Stream Sockets protocol. Signed-off-by: George Zhang georgezh...@vmware.com Acked-by: Andy king ack...@vmware.com Acked-by: Dmitry Torokhov d...@vmware.com --- net/vmw_vsock/stats.c | 30 ++ net/vmw_vsock/stats.h | 150 + 2 files changed, 180 insertions(+), 0 deletions(-) create mode 100644 net/vmw_vsock/stats.c create mode 100644 net/vmw_vsock/stats.h diff --git a/net/vmw_vsock/stats.c b/net/vmw_vsock/stats.c new file mode 100644 index 000..49e09bb --- /dev/null +++ b/net/vmw_vsock/stats.c @@ -0,0 +1,30 @@ +/* + * VMware vSockets Driver + * + * Copyright (C) 2009-2012 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation version 2 and no later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + */ + +#include linux/types.h +#include linux/socket.h +#include linux/stddef.h +#include net/sock.h + +#include af_vsock.h +#include stats.h + +#ifdef VSOCK_GATHER_STATISTICS +u64 vsock_stats_ctl_pkt_count[VSOCK_PACKET_TYPE_MAX]; +u64 vsock_stats_consume_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +u64 vsock_stats_produce_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +atomic64_t vsock_stats_consume_total; +atomic64_t vsock_stats_produce_total; +#endif diff --git a/net/vmw_vsock/stats.h b/net/vmw_vsock/stats.h new file mode 100644 index 000..07e2bf0 --- /dev/null +++ b/net/vmw_vsock/stats.h @@ -0,0 +1,150 @@ +/* + * VMware vSockets Driver + * + * Copyright (C) 2009-2012 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation version 2 and no later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + */ + +#ifndef __STATS_H__ +#define __STATS_H__ + +#include linux/types.h + +#include vsock_common.h +#include vsock_packet.h + +/* Define VSOCK_GATHER_STATISTICS to turn on statistics gathering. Currently + * this consists of 3 types of stats: 1. The number of control datagram + * messages sent. 2. The level of queuepair fullness (in 10% buckets) whenever + * data is about to be enqueued or dequeued from the queuepair. 3. The total + * number of bytes enqueued/dequeued. + */ + +#ifdef VSOCK_GATHER_STATISTICS + +#define VSOCK_NUM_QUEUE_LEVEL_BUCKETS 10 +extern u64 vsock_stats_ctl_pkt_count[VSOCK_PACKET_TYPE_MAX]; +extern u64 vsock_stats_consume_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +extern u64 vsock_stats_produce_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +extern atomic64_t vsock_stats_consume_total; +extern atomic64_t vsock_stats_produce_total; + +#define VSOCK_STATS_STREAM_CONSUME_HIST(vsk) \ + vsock_vmci_stats_update_queue_bucket_count((vsk)-qpair,\ + (vsk)-consume_size,\ + vmci_qpair_consume_buf_ready((vsk)-qpair), \ + vsock_stats_consume_queue_hist) +#define VSOCK_STATS_STREAM_PRODUCE_HIST(vsk) \ + vsock_vmci_stats_update_queue_bucket_count((vsk)-qpair,\ + (vsk)-produce_size,\ + vmci_qpair_produce_buf_ready((vsk)-qpair), \ + vsock_stats_produce_queue_hist) +#define VSOCK_STATS_CTLPKT_LOG(pkt_type) \ + (++vsock_stats_ctl_pkt_count[pkt_type]) +#define VSOCK_STATS_STREAM_CONSUME(bytes) \ + atomic64_add(vsock_stats_consume_total, bytes) +#define VSOCK_STATS_STREAM_PRODUCE(bytes) \ + atomic64_add(vsock_stats_produce_total, bytes) +#define VSOCK_STATS_CTLPKT_DUMP_ALL() vsock_vmci_stats_ctl_pkt_dump_all() +#define VSOCK_STATS_HIST_DUMP_ALL() vsock_vmci_stats_hist_dump_all() +#define VSOCK_STATS_TOTALS_DUMP_ALL() vsock_vmci_stats_totals_dump_all() +#define VSOCK_STATS_RESET() vsock_vmci_stats_reset() + +static inline void +vsock_vmci_stats_update_queue_bucket_count(vmci_qpair *qpair, + u64 queue_size, + u64 data_ready, + u64 queue_hist[]) +{ + u64 bucket = 0; + u32 remainder = 0; + + /* We can't do 64 / 64 = 64 bit divides on linux because it requires a +* libgcc which is not linked into the kernel module. Since this
[PATCH 4/6] VSOCK: statistics implementation.
VSOCK stats for VMCI Stream Sockets protocol. Signed-off-by: George Zhang georgezh...@vmware.com --- net/vmw_vsock/stats.c | 37 net/vmw_vsock/stats.h | 219 + 2 files changed, 256 insertions(+), 0 deletions(-) create mode 100644 net/vmw_vsock/stats.c create mode 100644 net/vmw_vsock/stats.h diff --git a/net/vmw_vsock/stats.c b/net/vmw_vsock/stats.c new file mode 100644 index 000..2d172d5 --- /dev/null +++ b/net/vmw_vsock/stats.c @@ -0,0 +1,37 @@ +/* + * VMware vSockets Driver + * + * Copyright (C) 2009-2012 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation version 2 and no later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + */ + +/* + * stats.c -- + * + * Linux stats for the VMCI Stream Sockets protocol. + */ + +#include linux/types.h + +#include linux/socket.h +#include linux/stddef.h /* for NULL */ +#include net/sock.h + +#include af_vsock.h +#include stats.h + +#ifdef VSOCK_GATHER_STATISTICS +u64 vsock_stats_ctl_pkt_count[VSOCK_PACKET_TYPE_MAX]; +u64 vsock_stats_consume_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +u64 vsock_stats_produce_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +atomic64_t vsock_stats_consume_total; +atomic64_t vsock_stats_produce_total; +#endif diff --git a/net/vmw_vsock/stats.h b/net/vmw_vsock/stats.h new file mode 100644 index 000..2f9d44c --- /dev/null +++ b/net/vmw_vsock/stats.h @@ -0,0 +1,219 @@ +/* + * VMware vSockets Driver + * + * Copyright (C) 2009-2012 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation version 2 and no later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + */ + +/* + * stats.h -- + * + * Stats functions for Linux vsock module. + */ + +#ifndef __STATS_H__ +#define __STATS_H__ + +#include linux/types.h + +#include vsock_common.h +#include vsock_packet.h + +/* + * Define VSOCK_GATHER_STATISTICS to turn on statistics gathering. Currently + * this consists of 3 types of stats: 1. The number of control datagram + * messages sent. 2. The level of queuepair fullness (in 10% buckets) whenever + * data is about to be enqueued or dequeued from the queuepair. 3. The total + * number of bytes enqueued/dequeued. + */ + +#ifdef VSOCK_GATHER_STATISTICS + +#define VSOCK_NUM_QUEUE_LEVEL_BUCKETS 10 +extern u64 vsock_stats_ctl_pkt_count[VSOCK_PACKET_TYPE_MAX]; +extern u64 vsock_stats_consume_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +extern u64 vsock_stats_produce_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +extern atomic64_t vsock_stats_consume_total; +extern atomic64_t vsock_stats_produce_total; + +#define VSOCK_STATS_STREAM_CONSUME_HIST(vsk) \ + vsock_vmci_stats_update_queue_bucket_count((vsk)-qpair,\ + (vsk)-consume_size,\ + vmci_qpair_consume_buf_ready((vsk)-qpair), \ + vsock_stats_consume_queue_hist) +#define VSOCK_STATS_STREAM_PRODUCE_HIST(vsk) \ + vsock_vmci_stats_update_queue_bucket_count((vsk)-qpair,\ + (vsk)-produce_size,\ + vmci_qpair_produce_buf_ready((vsk)-qpair), \ + vsock_stats_produce_queue_hist) +#define VSOCK_STATS_CTLPKT_LOG(pkt_type) \ + do {\ + ++vsock_stats_ctl_pkt_count[pkt_type]; \ + } while (0) +#define VSOCK_STATS_STREAM_CONSUME(bytes) \ + atomic64_add(vsock_stats_consume_total, bytes) +#define VSOCK_STATS_STREAM_PRODUCE(bytes) \ + atomic64_add(vsock_stats_produce_total, bytes) +#define VSOCK_STATS_CTLPKT_DUMP_ALL() vsock_vmci_stats_ctl_pkt_dump_all() +#define VSOCK_STATS_HIST_DUMP_ALL() vsock_vmci_stats_hist_dump_all() +#define VSOCK_STATS_TOTALS_DUMP_ALL() vsock_vmci_stats_totals_dump_all() +#define VSOCK_STATS_RESET() vsock_vmci_stats_reset() + +/* + * + * vsock_vmci_stats_update_queue_bucket_count -- + * + * Given a queue, determine how much data is enqueued and add that to the + * specified queue level statistic bucket. + * + * Results: None. + * + * Side effects: None. +
[PATCH 4/6] VSOCK: statistics implementation.
VSOCK stats for VMCI Stream Sockets protocol. Signed-off-by: George Zhang georgezh...@vmware.com --- net/vmw_vsock/stats.c | 37 net/vmw_vsock/stats.h | 219 + 2 files changed, 256 insertions(+), 0 deletions(-) create mode 100644 net/vmw_vsock/stats.c create mode 100644 net/vmw_vsock/stats.h diff --git a/net/vmw_vsock/stats.c b/net/vmw_vsock/stats.c new file mode 100644 index 000..2d172d5 --- /dev/null +++ b/net/vmw_vsock/stats.c @@ -0,0 +1,37 @@ +/* + * VMware vSockets Driver + * + * Copyright (C) 2009-2012 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation version 2 and no later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + */ + +/* + * stats.c -- + * + * Linux stats for the VMCI Stream Sockets protocol. + */ + +#include linux/types.h + +#include linux/socket.h +#include linux/stddef.h /* for NULL */ +#include net/sock.h + +#include af_vsock.h +#include stats.h + +#ifdef VSOCK_GATHER_STATISTICS +u64 vsock_stats_ctl_pkt_count[VSOCK_PACKET_TYPE_MAX]; +u64 vsock_stats_consume_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +u64 vsock_stats_produce_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +atomic64_t vsock_stats_consume_total; +atomic64_t vsock_stats_produce_total; +#endif diff --git a/net/vmw_vsock/stats.h b/net/vmw_vsock/stats.h new file mode 100644 index 000..2f9d44c --- /dev/null +++ b/net/vmw_vsock/stats.h @@ -0,0 +1,219 @@ +/* + * VMware vSockets Driver + * + * Copyright (C) 2009-2012 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation version 2 and no later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + */ + +/* + * stats.h -- + * + * Stats functions for Linux vsock module. + */ + +#ifndef __STATS_H__ +#define __STATS_H__ + +#include linux/types.h + +#include vsock_common.h +#include vsock_packet.h + +/* + * Define VSOCK_GATHER_STATISTICS to turn on statistics gathering. Currently + * this consists of 3 types of stats: 1. The number of control datagram + * messages sent. 2. The level of queuepair fullness (in 10% buckets) whenever + * data is about to be enqueued or dequeued from the queuepair. 3. The total + * number of bytes enqueued/dequeued. + */ + +#ifdef VSOCK_GATHER_STATISTICS + +#define VSOCK_NUM_QUEUE_LEVEL_BUCKETS 10 +extern u64 vsock_stats_ctl_pkt_count[VSOCK_PACKET_TYPE_MAX]; +extern u64 vsock_stats_consume_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +extern u64 vsock_stats_produce_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +extern atomic64_t vsock_stats_consume_total; +extern atomic64_t vsock_stats_produce_total; + +#define VSOCK_STATS_STREAM_CONSUME_HIST(vsk) \ + vsock_vmci_stats_update_queue_bucket_count((vsk)-qpair,\ + (vsk)-consume_size,\ + vmci_qpair_consume_buf_ready((vsk)-qpair), \ + vsock_stats_consume_queue_hist) +#define VSOCK_STATS_STREAM_PRODUCE_HIST(vsk) \ + vsock_vmci_stats_update_queue_bucket_count((vsk)-qpair,\ + (vsk)-produce_size,\ + vmci_qpair_produce_buf_ready((vsk)-qpair), \ + vsock_stats_produce_queue_hist) +#define VSOCK_STATS_CTLPKT_LOG(pkt_type) \ + do {\ + ++vsock_stats_ctl_pkt_count[pkt_type]; \ + } while (0) +#define VSOCK_STATS_STREAM_CONSUME(bytes) \ + atomic64_add(vsock_stats_consume_total, bytes) +#define VSOCK_STATS_STREAM_PRODUCE(bytes) \ + atomic64_add(vsock_stats_produce_total, bytes) +#define VSOCK_STATS_CTLPKT_DUMP_ALL() vsock_vmci_stats_ctl_pkt_dump_all() +#define VSOCK_STATS_HIST_DUMP_ALL() vsock_vmci_stats_hist_dump_all() +#define VSOCK_STATS_TOTALS_DUMP_ALL() vsock_vmci_stats_totals_dump_all() +#define VSOCK_STATS_RESET() vsock_vmci_stats_reset() + +/* + * + * vsock_vmci_stats_update_queue_bucket_count -- + * + * Given a queue, determine how much data is enqueued and add that to the + * specified queue level statistic bucket. + * + * Results: None. + * + * Side effects: None. +
[PATCH 4/6] VSOCK: statistics implementation.
VSOCK stats for VMCI Stream Sockets protocol. Signed-off-by: George Zhang georgezh...@vmware.com --- net/vmw_vsock/stats.c | 37 net/vmw_vsock/stats.h | 222 + 2 files changed, 259 insertions(+), 0 deletions(-) create mode 100644 net/vmw_vsock/stats.c create mode 100644 net/vmw_vsock/stats.h diff --git a/net/vmw_vsock/stats.c b/net/vmw_vsock/stats.c new file mode 100644 index 000..2d172d5 --- /dev/null +++ b/net/vmw_vsock/stats.c @@ -0,0 +1,37 @@ +/* + * VMware vSockets Driver + * + * Copyright (C) 2009-2012 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation version 2 and no later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + */ + +/* + * stats.c -- + * + * Linux stats for the VMCI Stream Sockets protocol. + */ + +#include linux/types.h + +#include linux/socket.h +#include linux/stddef.h /* for NULL */ +#include net/sock.h + +#include af_vsock.h +#include stats.h + +#ifdef VSOCK_GATHER_STATISTICS +u64 vsock_stats_ctl_pkt_count[VSOCK_PACKET_TYPE_MAX]; +u64 vsock_stats_consume_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +u64 vsock_stats_produce_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +atomic64_t vsock_stats_consume_total; +atomic64_t vsock_stats_produce_total; +#endif diff --git a/net/vmw_vsock/stats.h b/net/vmw_vsock/stats.h new file mode 100644 index 000..ce6ec7e --- /dev/null +++ b/net/vmw_vsock/stats.h @@ -0,0 +1,222 @@ +/* + * VMware vSockets Driver + * + * Copyright (C) 2009-2012 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation version 2 and no later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + */ + +/* + * stats.h -- + * + * Stats functions for Linux vsock module. + */ + +#ifndef __STATS_H__ +#define __STATS_H__ + +#include linux/types.h + +#include vsock_common.h +#include vsock_packet.h + +/* + * Define VSOCK_GATHER_STATISTICS to turn on statistics gathering. Currently + * this consists of 3 types of stats: 1. The number of control datagram + * messages sent. 2. The level of queuepair fullness (in 10% buckets) whenever + * data is about to be enqueued or dequeued from the queuepair. 3. The total + * number of bytes enqueued/dequeued. + */ + +#ifdef VSOCK_GATHER_STATISTICS + +#define VSOCK_NUM_QUEUE_LEVEL_BUCKETS 10 +extern u64 vsock_stats_ctl_pkt_count[VSOCK_PACKET_TYPE_MAX]; +extern u64 vsock_stats_consume_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +extern u64 vsock_stats_produce_queue_hist[VSOCK_NUM_QUEUE_LEVEL_BUCKETS]; +extern atomic64_t vsock_stats_consume_total; +extern atomic64_t vsock_stats_produce_total; + +#define VSOCK_STATS_STREAM_CONSUME_HIST(vsk) \ + vsock_vmci_stats_update_queue_bucket_count((vsk)-qpair,\ + (vsk)-consume_size,\ + vmci_qpair_consume_buf_ready((vsk)-qpair), \ + vsock_stats_consume_queue_hist) +#define VSOCK_STATS_STREAM_PRODUCE_HIST(vsk) \ + vsock_vmci_stats_update_queue_bucket_count((vsk)-qpair,\ + (vsk)-produce_size,\ + vmci_qpair_produce_buf_ready((vsk)-qpair), \ + vsock_stats_produce_queue_hist) +#define VSOCK_STATS_CTLPKT_LOG(pkt_type) \ + do {\ + ++vsock_stats_ctl_pkt_count[pkt_type]; \ + } while (0) +#define VSOCK_STATS_STREAM_CONSUME(bytes) \ + atomic64_add(vsock_stats_consume_total, bytes) +#define VSOCK_STATS_STREAM_PRODUCE(bytes) \ + atomic64_add(vsock_stats_produce_total, bytes) +#define VSOCK_STATS_CTLPKT_DUMP_ALL() vsock_vmci_stats_ctl_pkt_dump_all() +#define VSOCK_STATS_HIST_DUMP_ALL() vsock_vmci_stats_hist_dump_all() +#define VSOCK_STATS_TOTALS_DUMP_ALL() vsock_vmci_stats_totals_dump_all() +#define VSOCK_STATS_RESET() vsock_vmci_stats_reset() + +/* + * + * vsock_vmci_stats_update_queue_bucket_count -- + * + * Given a queue, determine how much data is enqueued and add that to the + * specified queue level statistic bucket. + * + * Results: None. + * + * Side effects: None. +