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;
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'. */
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;
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;
}
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;
}
}
} 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:
}
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) {
}
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);
}
}
}
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;
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;