net/netvsc: manage VF port under read/write lock
[dpdk.git] / drivers / net / netvsc / hn_rxtx.c
index 773ba31..31fae55 100644 (file)
@@ -1388,12 +1388,16 @@ hn_xmit_pkts(void *ptxq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
                hn_process_events(hv, txq->queue_id, 0);
 
        /* Transmit over VF if present and up */
+       rte_rwlock_read_lock(&hv->vf_lock);
        vf_dev = hn_get_vf_dev(hv);
        if (vf_dev && vf_dev->data->dev_started) {
                void *sub_q = vf_dev->data->tx_queues[queue_id];
 
-               return (*vf_dev->tx_pkt_burst)(sub_q, tx_pkts, nb_pkts);
+               nb_tx = (*vf_dev->tx_pkt_burst)(sub_q, tx_pkts, nb_pkts);
+               rte_rwlock_read_unlock(&hv->vf_lock);
+               return nb_tx;
        }
+       rte_rwlock_read_unlock(&hv->vf_lock);
 
        for (nb_tx = 0; nb_tx < nb_pkts; nb_tx++) {
                struct rte_mbuf *m = tx_pkts[nb_tx];
@@ -1500,11 +1504,13 @@ hn_recv_pkts(void *prxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
                                           (void **)rx_pkts, nb_pkts, NULL);
 
        /* If VF is available, check that as well */
+       rte_rwlock_read_lock(&hv->vf_lock);
        vf_dev = hn_get_vf_dev(hv);
        if (vf_dev && vf_dev->data->dev_started)
                nb_rcv += hn_recv_vf(vf_dev->data->port_id, rxq,
                                     rx_pkts + nb_rcv, nb_pkts - nb_rcv);
 
+       rte_rwlock_read_unlock(&hv->vf_lock);
        return nb_rcv;
 }