From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by dpdk.org (Postfix) with ESMTP id C844C56B7 for ; Mon, 2 May 2016 23:20:34 +0200 (CEST) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga104.fm.intel.com with ESMTP; 02 May 2016 14:20:35 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,569,1455004800"; d="scan'208";a="95880125" Received: from yliu-dev.sh.intel.com ([10.239.67.162]) by fmsmga004.fm.intel.com with ESMTP; 02 May 2016 14:20:33 -0700 From: Yuanhan Liu To: dev@dpdk.org Cc: huawei.xie@intel.com, Yuanhan Liu Date: Mon, 2 May 2016 14:23:50 -0700 Message-Id: <1462224230-19460-9-git-send-email-yuanhan.liu@linux.intel.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1462224230-19460-1-git-send-email-yuanhan.liu@linux.intel.com> References: <1461645951-14603-1-git-send-email-yuanhan.liu@linux.intel.com> <1462224230-19460-1-git-send-email-yuanhan.liu@linux.intel.com> Subject: [dpdk-dev] [PATCH v2 8/8] examples/vhost: embed statistics into vhost_dev struct X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 May 2016 21:20:35 -0000 Embed dev_statistics into vhost_dev strcuct, which could clean the code a bit. Signed-off-by: Yuanhan Liu --- examples/vhost/main.c | 87 +++++++++++++++++++-------------------------------- examples/vhost/main.h | 11 +++++-- 2 files changed, 40 insertions(+), 58 deletions(-) diff --git a/examples/vhost/main.c b/examples/vhost/main.c index 66d3bf2..d3da41b 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -217,15 +217,6 @@ struct mbuf_table lcore_tx_queue[RTE_MAX_LCORE]; / US_PER_S * BURST_TX_DRAIN_US) #define VLAN_HLEN 4 -/* Per-device statistics struct */ -struct device_statistics { - uint64_t tx_total; - rte_atomic64_t rx_total_atomic; - uint64_t tx; - rte_atomic64_t rx_atomic; -} __rte_cache_aligned; -struct device_statistics dev_statistics[MAX_DEVICES]; - /* * Builds up the correct configuration for VMDQ VLAN pool map * according to the pool & queue limits. @@ -799,17 +790,17 @@ unlink_vmdq(struct vhost_dev *vdev) } static inline void __attribute__((always_inline)) -virtio_xmit(struct virtio_net *dst_dev, struct virtio_net *src_dev, +virtio_xmit(struct vhost_dev *dst_vdev, struct vhost_dev *src_vdev, struct rte_mbuf *m) { uint16_t ret; - ret = rte_vhost_enqueue_burst(dst_dev, VIRTIO_RXQ, &m, 1); + ret = rte_vhost_enqueue_burst(dst_vdev->dev, VIRTIO_RXQ, &m, 1); if (enable_stats) { - rte_atomic64_inc(&dev_statistics[dst_dev->device_fh].rx_total_atomic); - rte_atomic64_add(&dev_statistics[dst_dev->device_fh].rx_atomic, ret); - dev_statistics[src_dev->device_fh].tx_total++; - dev_statistics[src_dev->device_fh].tx += ret; + rte_atomic64_inc(&dst_vdev->stats.rx_total_atomic); + rte_atomic64_add(&dst_vdev->stats.rx_atomic, ret); + src_vdev->stats.tx_total++; + src_vdev->stats.tx += ret; } } @@ -847,7 +838,7 @@ virtio_tx_local(struct vhost_dev *vdev, struct rte_mbuf *m) return 0; } - virtio_xmit(dst_vdev->dev, vdev->dev, m); + virtio_xmit(dst_vdev, vdev, m); return 0; } @@ -956,7 +947,7 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, uint16_t vlan_tag) struct vhost_dev *vdev2; TAILQ_FOREACH(vdev2, &vhost_dev_list, next) { - virtio_xmit(vdev2->dev, vdev->dev, m); + virtio_xmit(vdev2, vdev, m); } goto queue2nic; } @@ -1020,8 +1011,8 @@ queue2nic: tx_q->m_table[tx_q->len++] = m; if (enable_stats) { - dev_statistics[dev->device_fh].tx_total++; - dev_statistics[dev->device_fh].tx++; + vdev->stats.tx_total++; + vdev->stats.tx++; } if (unlikely(tx_q->len == MAX_PKT_BURST)) @@ -1082,10 +1073,8 @@ drain_eth_rx(struct vhost_dev *vdev) enqueue_count = rte_vhost_enqueue_burst(dev, VIRTIO_RXQ, pkts, rx_count); if (enable_stats) { - uint64_t fh = dev->device_fh; - - rte_atomic64_add(&dev_statistics[fh].rx_total_atomic, rx_count); - rte_atomic64_add(&dev_statistics[fh].rx_atomic, enqueue_count); + rte_atomic64_add(&vdev->stats.rx_total_atomic, rx_count); + rte_atomic64_add(&vdev->stats.rx_atomic, enqueue_count); } free_pkts(pkts, rx_count); @@ -1266,9 +1255,6 @@ new_device (struct virtio_net *dev) TAILQ_INSERT_TAIL(&lcore_info[vdev->coreid].vdev_list, vdev, next); lcore_info[vdev->coreid].device_num++; - /* Initialize device stats */ - memset(&dev_statistics[dev->device_fh], 0, sizeof(struct device_statistics)); - /* Disable notifications. */ rte_vhost_enable_guest_notification(dev, VIRTIO_RXQ, 0); rte_vhost_enable_guest_notification(dev, VIRTIO_TXQ, 0); @@ -1299,7 +1285,6 @@ print_stats(void) struct vhost_dev *vdev; uint64_t tx_dropped, rx_dropped; uint64_t tx, tx_total, rx, rx_total; - uint32_t device_fh; const char clr[] = { 27, '[', '2', 'J', '\0' }; const char top_left[] = { 27, '[', '1', ';', '1', 'H','\0' }; @@ -1307,37 +1292,32 @@ print_stats(void) sleep(enable_stats); /* Clear screen and move to top left */ - printf("%s%s", clr, top_left); - - printf("\nDevice statistics ===================================="); + printf("%s%s\n", clr, top_left); + printf("Device statistics =================================\n"); TAILQ_FOREACH(vdev, &vhost_dev_list, next) { - device_fh = vdev->dev->device_fh; - tx_total = dev_statistics[device_fh].tx_total; - tx = dev_statistics[device_fh].tx; + tx_total = vdev->stats.tx_total; + tx = vdev->stats.tx; tx_dropped = tx_total - tx; - rx_total = rte_atomic64_read( - &dev_statistics[device_fh].rx_total_atomic); - rx = rte_atomic64_read( - &dev_statistics[device_fh].rx_atomic); + + rx_total = rte_atomic64_read(&vdev->stats.rx_total_atomic); + rx = rte_atomic64_read(&vdev->stats.rx_atomic); 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"", - device_fh, - tx_total, - tx_dropped, - tx, - rx_total, - rx_dropped, - rx); + printf("Statistics for device %" PRIu64 "\n" + "-----------------------\n" + "TX total: %" PRIu64 "\n" + "TX dropped: %" PRIu64 "\n" + "TX successful: %" PRIu64 "\n" + "RX total: %" PRIu64 "\n" + "RX dropped: %" PRIu64 "\n" + "RX successful: %" PRIu64 "\n", + vdev->dev->device_fh, + tx_total, tx_dropped, tx, + rx_total, rx_dropped, rx); } - printf("\n======================================================\n"); + + printf("===================================================\n"); } } @@ -1486,9 +1466,6 @@ main(int argc, char *argv[]) "Cannot initialize network ports\n"); } - /* Initialize device stats */ - memset(&dev_statistics, 0, sizeof(dev_statistics)); - /* Enable stats if the user option is set. */ if (enable_stats) { ret = pthread_create(&tid, NULL, (void *)print_stats, NULL); diff --git a/examples/vhost/main.h b/examples/vhost/main.h index 6a06441..c4591b4 100644 --- a/examples/vhost/main.h +++ b/examples/vhost/main.h @@ -41,9 +41,13 @@ #define RTE_LOGTYPE_VHOST_DATA RTE_LOGTYPE_USER2 #define RTE_LOGTYPE_VHOST_PORT RTE_LOGTYPE_USER3 -/* - * Device linked list structure for data path. - */ +struct device_statistics { + uint64_t tx; + uint64_t tx_total; + rte_atomic64_t rx_atomic; + rte_atomic64_t rx_total_atomic; +}; + struct vhost_dev { /**< Pointer to device created by vhost lib. */ struct virtio_net *dev; @@ -62,6 +66,7 @@ struct vhost_dev { /**< Device is marked for removal from the data core. */ volatile uint8_t remove; + struct device_statistics stats; TAILQ_ENTRY(vhost_dev) next; } __rte_cache_aligned; -- 1.9.3