Acked-by: Ethan Jackson <[email protected]>
On Fri, May 22, 2015 at 9:14 AM, Daniele Di Proietto <[email protected]> wrote: > Right now ethernet and ring devices use a mutex, while vhost devices use > a mutex or a spinlock to protect statistics. This commit introduces a > single spinlock that's always used for stats updates. > > Signed-off-by: Daniele Di Proietto <[email protected]> > --- > lib/netdev-dpdk.c | 29 +++++++++++++++++++++-------- > 1 file changed, 21 insertions(+), 8 deletions(-) > > diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c > index 3fe5a82..975a842 100644 > --- a/lib/netdev-dpdk.c > +++ b/lib/netdev-dpdk.c > @@ -194,6 +194,8 @@ struct netdev_dpdk { > int socket_id; > int buf_size; > struct netdev_stats stats; > + /* Protects stats */ > + rte_spinlock_t stats_lock; > > uint8_t hwaddr[ETH_ADDR_LEN]; > enum netdev_flags flags; > @@ -504,6 +506,8 @@ netdev_dpdk_init(struct netdev *netdev_, unsigned int > port_no, > ovs_mutex_init(&netdev->mutex); > ovs_mutex_lock(&netdev->mutex); > > + rte_spinlock_init(&netdev->stats_lock); > + > /* If the 'sid' is negative, it means that the kernel fails > * to obtain the pci numa info. In that situation, always > * use 'SOCKET0'. */ > @@ -785,9 +789,9 @@ dpdk_queue_flush__(struct netdev_dpdk *dev, int qid) > for (i = nb_tx; i < txq->count; i++) { > rte_pktmbuf_free_seg(txq->burst_pkts[i]); > } > - ovs_mutex_lock(&dev->mutex); > + rte_spinlock_lock(&dev->stats_lock); > dev->stats.tx_dropped += txq->count-nb_tx; > - ovs_mutex_unlock(&dev->mutex); > + rte_spinlock_unlock(&dev->stats_lock); > } > > txq->count = 0; > @@ -837,7 +841,10 @@ netdev_dpdk_vhost_rxq_recv(struct netdev_rxq *rxq_, > return EAGAIN; > } > > + rte_spinlock_lock(&vhost_dev->stats_lock); > vhost_dev->stats.rx_packets += (uint64_t)nb_rx; > + rte_spinlock_unlock(&vhost_dev->stats_lock); > + > *c = (int) nb_rx; > return 0; > } > @@ -880,9 +887,9 @@ __netdev_dpdk_vhost_send(struct netdev *netdev, struct > dp_packet **pkts, > uint64_t start = 0; > > if (OVS_UNLIKELY(!is_vhost_running(virtio_dev))) { > - ovs_mutex_lock(&vhost_dev->mutex); > + rte_spinlock_lock(&vhost_dev->stats_lock); > vhost_dev->stats.tx_dropped+= cnt; > - ovs_mutex_unlock(&vhost_dev->mutex); > + rte_spinlock_unlock(&vhost_dev->stats_lock); > goto out; > } > > @@ -924,8 +931,10 @@ __netdev_dpdk_vhost_send(struct netdev *netdev, struct > dp_packet **pkts, > } > } while (cnt); > > + rte_spinlock_lock(&vhost_dev->stats_lock); > vhost_dev->stats.tx_packets += (total_pkts - cnt); > vhost_dev->stats.tx_dropped += cnt; > + rte_spinlock_unlock(&vhost_dev->stats_lock); > rte_spinlock_unlock(&vhost_dev->txq_lock); > > out: > @@ -1020,9 +1029,9 @@ dpdk_do_tx_copy(struct netdev *netdev, int qid, struct > dp_packet **pkts, > } > > if (OVS_UNLIKELY(dropped)) { > - ovs_mutex_lock(&dev->mutex); > + rte_spinlock_lock(&dev->stats_lock); > dev->stats.tx_dropped += dropped; > - ovs_mutex_unlock(&dev->mutex); > + rte_spinlock_unlock(&dev->stats_lock); > } > > if (dev->type == DPDK_DEV_VHOST) { > @@ -1102,9 +1111,9 @@ netdev_dpdk_send__(struct netdev_dpdk *dev, int qid, > } > > if (OVS_UNLIKELY(dropped)) { > - ovs_mutex_lock(&dev->mutex); > + rte_spinlock_lock(&dev->stats_lock); > dev->stats.tx_dropped += dropped; > - ovs_mutex_unlock(&dev->mutex); > + rte_spinlock_unlock(&dev->stats_lock); > } > } > } > @@ -1239,10 +1248,12 @@ netdev_dpdk_vhost_get_stats(const struct netdev > *netdev, > stats->rx_dropped += UINT64_MAX; > stats->tx_bytes += UINT64_MAX; > > + rte_spinlock_lock(&dev->stats_lock); > /* Supported Stats */ > stats->rx_packets += dev->stats.rx_packets; > stats->tx_packets += dev->stats.tx_packets; > stats->tx_dropped += dev->stats.tx_dropped; > + rte_spinlock_unlock(&dev->stats_lock); > ovs_mutex_unlock(&dev->mutex); > > return 0; > @@ -1269,7 +1280,9 @@ netdev_dpdk_get_stats(const struct netdev *netdev, > struct netdev_stats *stats) > stats->tx_errors = rte_stats.oerrors; > stats->multicast = rte_stats.imcasts; > > + rte_spinlock_lock(&dev->stats_lock); > stats->tx_dropped = dev->stats.tx_dropped; > + rte_spinlock_unlock(&dev->stats_lock); > ovs_mutex_unlock(&dev->mutex); > > return 0; > -- > 2.1.4 > > _______________________________________________ > dev mailing list > [email protected] > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
