mirror of
https://github.com/openvswitch/ovs
synced 2025-09-01 14:55:18 +00:00
netdev-dpdk: Add some missing statistics.
New stats for vhost ports are rx_bytes, tx_bytes, multicast, rx_errors and rx_length_errors. New stats for PMD ports are rx_dropped, rx_length_errors, rx_crc_errors and rx_missed_errors. DPDK imissed packets are now classified as dropped instead of errors. Signed-off-by: Timo Puha <timox.puha@intel.com> Tested-by: Daniele Di Proietto <diproiettod@vmware.com> Acked-by: Flavio Leitner <fbl@sysclose.org> Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
@@ -945,6 +945,35 @@ is_vhost_running(struct virtio_net *dev)
|
|||||||
return (dev != NULL && (dev->flags & VIRTIO_DEV_RUNNING));
|
return (dev != NULL && (dev->flags & VIRTIO_DEV_RUNNING));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
netdev_dpdk_vhost_update_rx_counters(struct netdev_stats *stats,
|
||||||
|
struct dp_packet **packets, int count)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct dp_packet *packet;
|
||||||
|
|
||||||
|
stats->rx_packets += count;
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
packet = packets[i];
|
||||||
|
|
||||||
|
if (OVS_UNLIKELY(dp_packet_size(packet) < ETH_HEADER_LEN)) {
|
||||||
|
/* This only protects the following multicast counting from
|
||||||
|
* too short packets, but it does not stop the packet from
|
||||||
|
* further processing. */
|
||||||
|
stats->rx_errors++;
|
||||||
|
stats->rx_length_errors++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct eth_header *eh = (struct eth_header *) dp_packet_data(packet);
|
||||||
|
if (OVS_UNLIKELY(eth_addr_is_multicast(eh->eth_dst))) {
|
||||||
|
stats->multicast++;
|
||||||
|
}
|
||||||
|
|
||||||
|
stats->rx_bytes += dp_packet_size(packet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The receive path for the vhost port is the TX path out from guest.
|
* The receive path for the vhost port is the TX path out from guest.
|
||||||
*/
|
*/
|
||||||
@@ -972,7 +1001,7 @@ netdev_dpdk_vhost_rxq_recv(struct netdev_rxq *rxq_,
|
|||||||
}
|
}
|
||||||
|
|
||||||
rte_spinlock_lock(&vhost_dev->stats_lock);
|
rte_spinlock_lock(&vhost_dev->stats_lock);
|
||||||
vhost_dev->stats.rx_packets += (uint64_t)nb_rx;
|
netdev_dpdk_vhost_update_rx_counters(&vhost_dev->stats, packets, nb_rx);
|
||||||
rte_spinlock_unlock(&vhost_dev->stats_lock);
|
rte_spinlock_unlock(&vhost_dev->stats_lock);
|
||||||
|
|
||||||
*c = (int) nb_rx;
|
*c = (int) nb_rx;
|
||||||
@@ -1009,6 +1038,23 @@ netdev_dpdk_rxq_recv(struct netdev_rxq *rxq_, struct dp_packet **packets,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
netdev_dpdk_vhost_update_tx_counters(struct netdev_stats *stats,
|
||||||
|
struct dp_packet **packets,
|
||||||
|
int attempted,
|
||||||
|
int dropped)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int sent = attempted - dropped;
|
||||||
|
|
||||||
|
stats->tx_packets += sent;
|
||||||
|
stats->tx_dropped += dropped;
|
||||||
|
|
||||||
|
for (i = 0; i < sent; i++) {
|
||||||
|
stats->tx_bytes += dp_packet_size(packets[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
__netdev_dpdk_vhost_send(struct netdev *netdev, struct dp_packet **pkts,
|
__netdev_dpdk_vhost_send(struct netdev *netdev, struct dp_packet **pkts,
|
||||||
int cnt, bool may_steal)
|
int cnt, bool may_steal)
|
||||||
@@ -1066,8 +1112,8 @@ __netdev_dpdk_vhost_send(struct netdev *netdev, struct dp_packet **pkts,
|
|||||||
rte_spinlock_unlock(&vhost_dev->vhost_tx_lock);
|
rte_spinlock_unlock(&vhost_dev->vhost_tx_lock);
|
||||||
|
|
||||||
rte_spinlock_lock(&vhost_dev->stats_lock);
|
rte_spinlock_lock(&vhost_dev->stats_lock);
|
||||||
vhost_dev->stats.tx_packets += (total_pkts - cnt);
|
netdev_dpdk_vhost_update_tx_counters(&vhost_dev->stats, pkts, total_pkts,
|
||||||
vhost_dev->stats.tx_dropped += cnt;
|
cnt);
|
||||||
rte_spinlock_unlock(&vhost_dev->stats_lock);
|
rte_spinlock_unlock(&vhost_dev->stats_lock);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
@@ -1368,14 +1414,10 @@ netdev_dpdk_vhost_get_stats(const struct netdev *netdev,
|
|||||||
ovs_mutex_lock(&dev->mutex);
|
ovs_mutex_lock(&dev->mutex);
|
||||||
memset(stats, 0, sizeof(*stats));
|
memset(stats, 0, sizeof(*stats));
|
||||||
/* Unsupported Stats */
|
/* Unsupported Stats */
|
||||||
stats->rx_errors = UINT64_MAX;
|
|
||||||
stats->tx_errors = UINT64_MAX;
|
|
||||||
stats->multicast = UINT64_MAX;
|
|
||||||
stats->collisions = UINT64_MAX;
|
stats->collisions = UINT64_MAX;
|
||||||
stats->rx_crc_errors = UINT64_MAX;
|
stats->rx_crc_errors = UINT64_MAX;
|
||||||
stats->rx_fifo_errors = UINT64_MAX;
|
stats->rx_fifo_errors = UINT64_MAX;
|
||||||
stats->rx_frame_errors = UINT64_MAX;
|
stats->rx_frame_errors = UINT64_MAX;
|
||||||
stats->rx_length_errors = UINT64_MAX;
|
|
||||||
stats->rx_missed_errors = UINT64_MAX;
|
stats->rx_missed_errors = UINT64_MAX;
|
||||||
stats->rx_over_errors = UINT64_MAX;
|
stats->rx_over_errors = UINT64_MAX;
|
||||||
stats->tx_aborted_errors = UINT64_MAX;
|
stats->tx_aborted_errors = UINT64_MAX;
|
||||||
@@ -1384,16 +1426,20 @@ netdev_dpdk_vhost_get_stats(const struct netdev *netdev,
|
|||||||
stats->tx_fifo_errors = UINT64_MAX;
|
stats->tx_fifo_errors = UINT64_MAX;
|
||||||
stats->tx_heartbeat_errors = UINT64_MAX;
|
stats->tx_heartbeat_errors = UINT64_MAX;
|
||||||
stats->tx_window_errors = UINT64_MAX;
|
stats->tx_window_errors = UINT64_MAX;
|
||||||
stats->rx_bytes += UINT64_MAX;
|
|
||||||
stats->rx_dropped += UINT64_MAX;
|
stats->rx_dropped += UINT64_MAX;
|
||||||
stats->tx_bytes += UINT64_MAX;
|
|
||||||
|
|
||||||
rte_spinlock_lock(&dev->stats_lock);
|
rte_spinlock_lock(&dev->stats_lock);
|
||||||
/* Supported Stats */
|
/* Supported Stats */
|
||||||
stats->rx_packets += dev->stats.rx_packets;
|
stats->rx_packets += dev->stats.rx_packets;
|
||||||
stats->tx_packets += dev->stats.tx_packets;
|
stats->tx_packets += dev->stats.tx_packets;
|
||||||
stats->tx_dropped += dev->stats.tx_dropped;
|
stats->tx_dropped += dev->stats.tx_dropped;
|
||||||
|
stats->multicast = dev->stats.multicast;
|
||||||
|
stats->rx_bytes = dev->stats.rx_bytes;
|
||||||
|
stats->tx_bytes = dev->stats.tx_bytes;
|
||||||
|
stats->rx_errors = dev->stats.rx_errors;
|
||||||
|
stats->rx_length_errors = dev->stats.rx_length_errors;
|
||||||
rte_spinlock_unlock(&dev->stats_lock);
|
rte_spinlock_unlock(&dev->stats_lock);
|
||||||
|
|
||||||
ovs_mutex_unlock(&dev->mutex);
|
ovs_mutex_unlock(&dev->mutex);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1416,13 +1462,33 @@ netdev_dpdk_get_stats(const struct netdev *netdev, struct netdev_stats *stats)
|
|||||||
stats->tx_packets = rte_stats.opackets;
|
stats->tx_packets = rte_stats.opackets;
|
||||||
stats->rx_bytes = rte_stats.ibytes;
|
stats->rx_bytes = rte_stats.ibytes;
|
||||||
stats->tx_bytes = rte_stats.obytes;
|
stats->tx_bytes = rte_stats.obytes;
|
||||||
stats->rx_errors = rte_stats.ierrors;
|
/* DPDK counts imissed as errors, but count them here as dropped instead */
|
||||||
|
stats->rx_errors = rte_stats.ierrors - rte_stats.imissed;
|
||||||
stats->tx_errors = rte_stats.oerrors;
|
stats->tx_errors = rte_stats.oerrors;
|
||||||
stats->multicast = rte_stats.imcasts;
|
stats->multicast = rte_stats.imcasts;
|
||||||
|
|
||||||
rte_spinlock_lock(&dev->stats_lock);
|
rte_spinlock_lock(&dev->stats_lock);
|
||||||
stats->tx_dropped = dev->stats.tx_dropped;
|
stats->tx_dropped = dev->stats.tx_dropped;
|
||||||
rte_spinlock_unlock(&dev->stats_lock);
|
rte_spinlock_unlock(&dev->stats_lock);
|
||||||
|
|
||||||
|
/* These are the available DPDK counters for packets not received due to
|
||||||
|
* local resource constraints in DPDK and NIC respectively. */
|
||||||
|
stats->rx_dropped = rte_stats.rx_nombuf + rte_stats.imissed;
|
||||||
|
stats->collisions = UINT64_MAX;
|
||||||
|
|
||||||
|
stats->rx_length_errors = rte_stats.ibadlen;
|
||||||
|
stats->rx_over_errors = UINT64_MAX;
|
||||||
|
stats->rx_crc_errors = rte_stats.ibadcrc;
|
||||||
|
stats->rx_frame_errors = UINT64_MAX;
|
||||||
|
stats->rx_fifo_errors = UINT64_MAX;
|
||||||
|
stats->rx_missed_errors = rte_stats.imissed;
|
||||||
|
|
||||||
|
stats->tx_aborted_errors = UINT64_MAX;
|
||||||
|
stats->tx_carrier_errors = UINT64_MAX;
|
||||||
|
stats->tx_fifo_errors = UINT64_MAX;
|
||||||
|
stats->tx_heartbeat_errors = UINT64_MAX;
|
||||||
|
stats->tx_window_errors = UINT64_MAX;
|
||||||
|
|
||||||
ovs_mutex_unlock(&dev->mutex);
|
ovs_mutex_unlock(&dev->mutex);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Reference in New Issue
Block a user