From: Changchun Ouyang <changchun.ouy...@intel.com> Signed-off-by: Changchun Ouyang <changchun.ouyang at intel.com> Signed-off-by: Yuanhan Liu <yuanhan.liu at linux.intel.com> --- examples/vhost/main.c | 97 +++++++++++++++++++++++++++++---------------------- 1 file changed, 56 insertions(+), 41 deletions(-)
diff --git a/examples/vhost/main.c b/examples/vhost/main.c index 23b7aa7..06a3ac7 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -314,7 +314,7 @@ struct ipv4_hdr { #define VLAN_ETH_HLEN 18 /* Per-device statistics struct */ -struct device_statistics { +struct qp_statistics { uint64_t tx_total; rte_atomic64_t rx_total_atomic; uint64_t rx_total; @@ -322,6 +322,10 @@ struct device_statistics { rte_atomic64_t rx_atomic; uint64_t rx; } __rte_cache_aligned; + +struct device_statistics { + struct qp_statistics *qp_stats; +}; struct device_statistics dev_statistics[MAX_DEVICES]; /* @@ -775,6 +779,17 @@ us_vhost_parse_args(int argc, char **argv) return -1; } else { enable_stats = ret; + if (enable_stats) + for (i = 0; i < MAX_DEVICES; i++) { + dev_statistics[i].qp_stats = + malloc(VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX * sizeof(struct qp_statistics)); + if (dev_statistics[i].qp_stats == NULL) { + RTE_LOG(ERR, VHOST_CONFIG, "Failed to allocate memory for qp stats.\n"); + return -1; + } + memset(dev_statistics[i].qp_stats, 0, + VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX * sizeof(struct qp_statistics)); + } } } @@ -1131,13 +1146,13 @@ virtio_tx_local(struct vhost_dev *vdev, struct rte_mbuf *m, uint32_t qp_idx) &m, 1); if (enable_stats) { rte_atomic64_add( - &dev_statistics[tdev->device_fh].rx_total_atomic, + &dev_statistics[tdev->device_fh].qp_stats[qp_idx].rx_total_atomic, 1); rte_atomic64_add( - &dev_statistics[tdev->device_fh].rx_atomic, + &dev_statistics[tdev->device_fh].qp_stats[qp_idx].rx_atomic, ret); - dev_statistics[tdev->device_fh].tx_total++; - dev_statistics[tdev->device_fh].tx += ret; + dev_statistics[dev->device_fh].qp_stats[qp_idx].tx_total++; + dev_statistics[dev->device_fh].qp_stats[qp_idx].tx += ret; } } @@ -1271,8 +1286,8 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, tx_q->m_table[len] = m; len++; if (enable_stats) { - dev_statistics[dev->device_fh].tx_total++; - dev_statistics[dev->device_fh].tx++; + dev_statistics[dev->device_fh].qp_stats[qp_idx].tx_total++; + dev_statistics[dev->device_fh].qp_stats[qp_idx].tx++; } if (unlikely(len == MAX_PKT_BURST)) { @@ -1403,10 +1418,10 @@ switch_worker(__attribute__((unused)) void *arg) pkts_burst, rx_count); if (enable_stats) { rte_atomic64_add( - &dev_statistics[dev_ll->vdev->dev->device_fh].rx_total_atomic, + &dev_statistics[dev_ll->vdev->dev->device_fh].qp_stats[qp_idx].rx_total_atomic, rx_count); rte_atomic64_add( - &dev_statistics[dev_ll->vdev->dev->device_fh].rx_atomic, ret_count); + &dev_statistics[dev_ll->vdev->dev->device_fh].qp_stats[qp_idx].rx_atomic, ret_count); } while (likely(rx_count)) { rx_count--; @@ -1954,8 +1969,8 @@ virtio_tx_route_zcp(struct virtio_net *dev, struct rte_mbuf *m, (mbuf->next == NULL) ? "null" : "non-null"); if (enable_stats) { - dev_statistics[dev->device_fh].tx_total++; - dev_statistics[dev->device_fh].tx++; + dev_statistics[dev->device_fh].qp_stats[0].tx_total++; + dev_statistics[dev->device_fh].qp_stats[0].tx++; } if (unlikely(len == MAX_PKT_BURST)) { @@ -2238,9 +2253,9 @@ switch_worker_zcp(__attribute__((unused)) void *arg) ret_count = virtio_dev_rx_zcp(dev, pkts_burst, rx_count); if (enable_stats) { - dev_statistics[dev->device_fh].rx_total + dev_statistics[dev->device_fh].qp_stats[0].rx_total += rx_count; - dev_statistics[dev->device_fh].rx + dev_statistics[dev->device_fh].qp_stats[0].rx += ret_count; } while (likely(rx_count)) { @@ -2883,7 +2898,9 @@ new_device (struct virtio_net *dev) } /* Initialize device stats */ - memset(&dev_statistics[dev->device_fh], 0, sizeof(struct device_statistics)); + if (enable_stats) + memset(dev_statistics[dev->device_fh].qp_stats, 0, + VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX * sizeof(struct qp_statistics)); dev->flags |= VIRTIO_DEV_RUNNING; @@ -2911,7 +2928,7 @@ print_stats(void) struct virtio_net_data_ll *dev_ll; uint64_t tx_dropped, rx_dropped; uint64_t tx, tx_total, rx, rx_total; - uint32_t device_fh; + uint32_t device_fh, i; const char clr[] = { 27, '[', '2', 'J', '\0' }; const char top_left[] = { 27, '[', '1', ';', '1', 'H','\0' }; @@ -2926,36 +2943,37 @@ print_stats(void) dev_ll = ll_root_used; while (dev_ll != NULL) { device_fh = (uint32_t)dev_ll->vdev->dev->device_fh; - tx_total = dev_statistics[device_fh].tx_total; - tx = dev_statistics[device_fh].tx; - tx_dropped = tx_total - tx; - if (zero_copy == 0) { - rx_total = rte_atomic64_read( - &dev_statistics[device_fh].rx_total_atomic); - rx = rte_atomic64_read( - &dev_statistics[device_fh].rx_atomic); - } else { - rx_total = dev_statistics[device_fh].rx_total; - rx = dev_statistics[device_fh].rx; - } - rx_dropped = rx_total - rx; - - printf("\nStatistics for device %"PRIu32" ------------------------------" - "\nTX total: %"PRIu64"" - "\nTX dropped: %"PRIu64"" - "\nTX successful: %"PRIu64"" - "\nRX total: %"PRIu64"" - "\nRX dropped: %"PRIu64"" - "\nRX successful: %"PRIu64"", + for (i = 0; i < rxq; i++) { + tx_total = dev_statistics[device_fh].qp_stats[i].tx_total; + tx = dev_statistics[device_fh].qp_stats[i].tx; + tx_dropped = tx_total - tx; + if (zero_copy == 0) { + rx_total = rte_atomic64_read( + &dev_statistics[device_fh].qp_stats[i].rx_total_atomic); + rx = rte_atomic64_read( + &dev_statistics[device_fh].qp_stats[i].rx_atomic); + } else { + rx_total = dev_statistics[device_fh].qp_stats[0].rx_total; + rx = dev_statistics[device_fh].qp_stats[0].rx; + } + rx_dropped = rx_total - rx; + + printf("\nStatistics for device %"PRIu32" queue id: %d------------------" + "\nTX total: %"PRIu64"" + "\nTX dropped: %"PRIu64"" + "\nTX success: %"PRIu64"" + "\nRX total: %"PRIu64"" + "\nRX dropped: %"PRIu64"" + "\nRX success: %"PRIu64"", device_fh, + i, tx_total, tx_dropped, tx, rx_total, rx_dropped, rx); - - + } dev_ll = dev_ll->next; } printf("\n======================================================\n"); @@ -3137,9 +3155,6 @@ main(int argc, char *argv[]) if (init_data_ll() == -1) rte_exit(EXIT_FAILURE, "Failed to initialize linked list\n"); - /* Initialize device stats */ - memset(&dev_statistics, 0, sizeof(dev_statistics)); - /* Enable stats if the user option is set. */ if (enable_stats) pthread_create(&tid, NULL, (void*)print_stats, NULL ); -- 1.9.0