I'm not entirely convinced a spinlock is better, but if that's the
existing convention then I'm fine with it.

Ethan

On Fri, Apr 10, 2015 at 5:37 AM, Daniele Di Proietto
<diproiet...@vmware.com> wrote:
> No particular reason: in netdev-dpdk.c we tend to use
> spinlocks in the fast path.  I can use an ovs_mutex, if
> you think it’s better
>
>> On 10 Apr 2015, at 02:00, Ethan Jackson <et...@nicira.com> wrote:
>>
>> Could you explain a little more clearly why you want to use an
>> rte_spinlock over an ovs_mutex?  It's not entirely clear from the
>> commit message.
>>
>> Ethan
>>
>> On Thu, Apr 2, 2015 at 9:00 AM, Daniele Di Proietto
>> <diproiet...@vmware.com> wrote:
>>> Right now ethernet and ring devices use a mutex, while vhost devices use
>>> a mutex or a a spinlock to protect statistics.  This commit introduces a
>>> single spinlock that's always used for stats updates.
>>>
>>> Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com>
>>> ---
>>> 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 f69154b..16bdae3 100644
>>> --- a/lib/netdev-dpdk.c
>>> +++ b/lib/netdev-dpdk.c
>>> @@ -221,6 +221,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;
>>> @@ -531,6 +533,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'. */
>>> @@ -812,9 +816,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;
>>> @@ -864,7 +868,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;
>>> }
>>> @@ -906,9 +913,9 @@ __netdev_dpdk_vhost_send(struct netdev *netdev, struct 
>>> dp_packet **pkts,
>>>     int tx_pkts, i;
>>>
>>>     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;
>>>     }
>>>
>>> @@ -917,8 +924,10 @@ __netdev_dpdk_vhost_send(struct netdev *netdev, struct 
>>> dp_packet **pkts,
>>>     tx_pkts = rte_vhost_enqueue_burst(virtio_dev, VIRTIO_RXQ,
>>>                                       (struct rte_mbuf **)pkts, cnt);
>>>
>>> +    rte_spinlock_lock(&vhost_dev->stats_lock);
>>>     vhost_dev->stats.tx_packets += tx_pkts;
>>>     vhost_dev->stats.tx_dropped += (cnt - tx_pkts);
>>> +    rte_spinlock_unlock(&vhost_dev->stats_lock);
>>>     rte_spinlock_unlock(&vhost_dev->txq_lock);
>>>
>>> out:
>>> @@ -1005,9 +1014,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) {
>>> @@ -1086,9 +1095,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);
>>>         }
>>>     }
>>> }
>>> @@ -1223,10 +1232,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;
>>> @@ -1253,7 +1264,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
>>> dev@openvswitch.org
>>> https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailman_listinfo_dev&d=AwIBaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=SmB5nZacmXNq0gKCC1s_Cw5yUNjxgD4v5kJqZ2uWLlE&m=He4qs0CUFm9pZniL_JS-u7We8_1zRob33kFMInD5tOQ&s=3XEhEN7FplXu9h2jxp6byf91p6Ku-F3uGz6ODYhcMvI&e=
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to