examples/vhost: embed statistics into device structure
Embed dev_statistics into vhost_dev struct, which could clean the code a bit. Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
This commit is contained in:
parent
273ecdbc06
commit
56fe86f8dc
@ -216,15 +216,6 @@ struct mbuf_table lcore_tx_queue[RTE_MAX_LCORE];
|
|||||||
/ US_PER_S * BURST_TX_DRAIN_US)
|
/ US_PER_S * BURST_TX_DRAIN_US)
|
||||||
#define VLAN_HLEN 4
|
#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
|
* Builds up the correct configuration for VMDQ VLAN pool map
|
||||||
* according to the pool & queue limits.
|
* according to the pool & queue limits.
|
||||||
@ -798,17 +789,17 @@ unlink_vmdq(struct vhost_dev *vdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline void __attribute__((always_inline))
|
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)
|
struct rte_mbuf *m)
|
||||||
{
|
{
|
||||||
uint16_t ret;
|
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) {
|
if (enable_stats) {
|
||||||
rte_atomic64_inc(&dev_statistics[dst_dev->device_fh].rx_total_atomic);
|
rte_atomic64_inc(&dst_vdev->stats.rx_total_atomic);
|
||||||
rte_atomic64_add(&dev_statistics[dst_dev->device_fh].rx_atomic, ret);
|
rte_atomic64_add(&dst_vdev->stats.rx_atomic, ret);
|
||||||
dev_statistics[src_dev->device_fh].tx_total++;
|
src_vdev->stats.tx_total++;
|
||||||
dev_statistics[src_dev->device_fh].tx += ret;
|
src_vdev->stats.tx += ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -846,7 +837,7 @@ virtio_tx_local(struct vhost_dev *vdev, struct rte_mbuf *m)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtio_xmit(dst_vdev->dev, vdev->dev, m);
|
virtio_xmit(dst_vdev, vdev, m);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -955,7 +946,7 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, uint16_t vlan_tag)
|
|||||||
struct vhost_dev *vdev2;
|
struct vhost_dev *vdev2;
|
||||||
|
|
||||||
TAILQ_FOREACH(vdev2, &vhost_dev_list, next) {
|
TAILQ_FOREACH(vdev2, &vhost_dev_list, next) {
|
||||||
virtio_xmit(vdev2->dev, vdev->dev, m);
|
virtio_xmit(vdev2, vdev, m);
|
||||||
}
|
}
|
||||||
goto queue2nic;
|
goto queue2nic;
|
||||||
}
|
}
|
||||||
@ -1019,8 +1010,8 @@ queue2nic:
|
|||||||
|
|
||||||
tx_q->m_table[tx_q->len++] = m;
|
tx_q->m_table[tx_q->len++] = m;
|
||||||
if (enable_stats) {
|
if (enable_stats) {
|
||||||
dev_statistics[dev->device_fh].tx_total++;
|
vdev->stats.tx_total++;
|
||||||
dev_statistics[dev->device_fh].tx++;
|
vdev->stats.tx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(tx_q->len == MAX_PKT_BURST))
|
if (unlikely(tx_q->len == MAX_PKT_BURST))
|
||||||
@ -1081,10 +1072,8 @@ drain_eth_rx(struct vhost_dev *vdev)
|
|||||||
enqueue_count = rte_vhost_enqueue_burst(dev, VIRTIO_RXQ,
|
enqueue_count = rte_vhost_enqueue_burst(dev, VIRTIO_RXQ,
|
||||||
pkts, rx_count);
|
pkts, rx_count);
|
||||||
if (enable_stats) {
|
if (enable_stats) {
|
||||||
uint64_t fh = dev->device_fh;
|
rte_atomic64_add(&vdev->stats.rx_total_atomic, rx_count);
|
||||||
|
rte_atomic64_add(&vdev->stats.rx_atomic, enqueue_count);
|
||||||
rte_atomic64_add(&dev_statistics[fh].rx_total_atomic, rx_count);
|
|
||||||
rte_atomic64_add(&dev_statistics[fh].rx_atomic, enqueue_count);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free_pkts(pkts, rx_count);
|
free_pkts(pkts, rx_count);
|
||||||
@ -1265,9 +1254,6 @@ new_device (struct virtio_net *dev)
|
|||||||
TAILQ_INSERT_TAIL(&lcore_info[vdev->coreid].vdev_list, vdev, next);
|
TAILQ_INSERT_TAIL(&lcore_info[vdev->coreid].vdev_list, vdev, next);
|
||||||
lcore_info[vdev->coreid].device_num++;
|
lcore_info[vdev->coreid].device_num++;
|
||||||
|
|
||||||
/* Initialize device stats */
|
|
||||||
memset(&dev_statistics[dev->device_fh], 0, sizeof(struct device_statistics));
|
|
||||||
|
|
||||||
/* Disable notifications. */
|
/* Disable notifications. */
|
||||||
rte_vhost_enable_guest_notification(dev, VIRTIO_RXQ, 0);
|
rte_vhost_enable_guest_notification(dev, VIRTIO_RXQ, 0);
|
||||||
rte_vhost_enable_guest_notification(dev, VIRTIO_TXQ, 0);
|
rte_vhost_enable_guest_notification(dev, VIRTIO_TXQ, 0);
|
||||||
@ -1298,7 +1284,6 @@ print_stats(void)
|
|||||||
struct vhost_dev *vdev;
|
struct vhost_dev *vdev;
|
||||||
uint64_t tx_dropped, rx_dropped;
|
uint64_t tx_dropped, rx_dropped;
|
||||||
uint64_t tx, tx_total, rx, rx_total;
|
uint64_t tx, tx_total, rx, rx_total;
|
||||||
uint32_t device_fh;
|
|
||||||
const char clr[] = { 27, '[', '2', 'J', '\0' };
|
const char clr[] = { 27, '[', '2', 'J', '\0' };
|
||||||
const char top_left[] = { 27, '[', '1', ';', '1', 'H','\0' };
|
const char top_left[] = { 27, '[', '1', ';', '1', 'H','\0' };
|
||||||
|
|
||||||
@ -1306,37 +1291,32 @@ print_stats(void)
|
|||||||
sleep(enable_stats);
|
sleep(enable_stats);
|
||||||
|
|
||||||
/* Clear screen and move to top left */
|
/* Clear screen and move to top left */
|
||||||
printf("%s%s", clr, top_left);
|
printf("%s%s\n", clr, top_left);
|
||||||
|
printf("Device statistics =================================\n");
|
||||||
printf("\nDevice statistics ====================================");
|
|
||||||
|
|
||||||
TAILQ_FOREACH(vdev, &vhost_dev_list, next) {
|
TAILQ_FOREACH(vdev, &vhost_dev_list, next) {
|
||||||
device_fh = vdev->dev->device_fh;
|
tx_total = vdev->stats.tx_total;
|
||||||
tx_total = dev_statistics[device_fh].tx_total;
|
tx = vdev->stats.tx;
|
||||||
tx = dev_statistics[device_fh].tx;
|
|
||||||
tx_dropped = tx_total - tx;
|
tx_dropped = tx_total - tx;
|
||||||
rx_total = rte_atomic64_read(
|
|
||||||
&dev_statistics[device_fh].rx_total_atomic);
|
rx_total = rte_atomic64_read(&vdev->stats.rx_total_atomic);
|
||||||
rx = rte_atomic64_read(
|
rx = rte_atomic64_read(&vdev->stats.rx_atomic);
|
||||||
&dev_statistics[device_fh].rx_atomic);
|
|
||||||
rx_dropped = rx_total - rx;
|
rx_dropped = rx_total - rx;
|
||||||
|
|
||||||
printf("\nStatistics for device %"PRIu32" ------------------------------"
|
printf("Statistics for device %" PRIu64 "\n"
|
||||||
"\nTX total: %"PRIu64""
|
"-----------------------\n"
|
||||||
"\nTX dropped: %"PRIu64""
|
"TX total: %" PRIu64 "\n"
|
||||||
"\nTX successful: %"PRIu64""
|
"TX dropped: %" PRIu64 "\n"
|
||||||
"\nRX total: %"PRIu64""
|
"TX successful: %" PRIu64 "\n"
|
||||||
"\nRX dropped: %"PRIu64""
|
"RX total: %" PRIu64 "\n"
|
||||||
"\nRX successful: %"PRIu64"",
|
"RX dropped: %" PRIu64 "\n"
|
||||||
device_fh,
|
"RX successful: %" PRIu64 "\n",
|
||||||
tx_total,
|
vdev->dev->device_fh,
|
||||||
tx_dropped,
|
tx_total, tx_dropped, tx,
|
||||||
tx,
|
rx_total, rx_dropped, rx);
|
||||||
rx_total,
|
|
||||||
rx_dropped,
|
|
||||||
rx);
|
|
||||||
}
|
}
|
||||||
printf("\n======================================================\n");
|
|
||||||
|
printf("===================================================\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1485,9 +1465,6 @@ main(int argc, char *argv[])
|
|||||||
"Cannot initialize network ports\n");
|
"Cannot initialize network ports\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize device stats */
|
|
||||||
memset(&dev_statistics, 0, sizeof(dev_statistics));
|
|
||||||
|
|
||||||
/* Enable stats if the user option is set. */
|
/* Enable stats if the user option is set. */
|
||||||
if (enable_stats) {
|
if (enable_stats) {
|
||||||
ret = pthread_create(&tid, NULL, (void *)print_stats, NULL);
|
ret = pthread_create(&tid, NULL, (void *)print_stats, NULL);
|
||||||
|
@ -41,9 +41,13 @@
|
|||||||
#define RTE_LOGTYPE_VHOST_DATA RTE_LOGTYPE_USER2
|
#define RTE_LOGTYPE_VHOST_DATA RTE_LOGTYPE_USER2
|
||||||
#define RTE_LOGTYPE_VHOST_PORT RTE_LOGTYPE_USER3
|
#define RTE_LOGTYPE_VHOST_PORT RTE_LOGTYPE_USER3
|
||||||
|
|
||||||
/*
|
struct device_statistics {
|
||||||
* Device linked list structure for data path.
|
uint64_t tx;
|
||||||
*/
|
uint64_t tx_total;
|
||||||
|
rte_atomic64_t rx_atomic;
|
||||||
|
rte_atomic64_t rx_total_atomic;
|
||||||
|
};
|
||||||
|
|
||||||
struct vhost_dev {
|
struct vhost_dev {
|
||||||
/**< Pointer to device created by vhost lib. */
|
/**< Pointer to device created by vhost lib. */
|
||||||
struct virtio_net *dev;
|
struct virtio_net *dev;
|
||||||
@ -62,6 +66,7 @@ struct vhost_dev {
|
|||||||
/**< Device is marked for removal from the data core. */
|
/**< Device is marked for removal from the data core. */
|
||||||
volatile uint8_t remove;
|
volatile uint8_t remove;
|
||||||
|
|
||||||
|
struct device_statistics stats;
|
||||||
TAILQ_ENTRY(vhost_dev) next;
|
TAILQ_ENTRY(vhost_dev) next;
|
||||||
} __rte_cache_aligned;
|
} __rte_cache_aligned;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user