net/failsafe: support device removal
[dpdk.git] / drivers / net / failsafe / failsafe_rxtx.c
index 5e380fe..7311421 100644 (file)
@@ -31,6 +31,7 @@
  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <rte_atomic.h>
 #include <rte_debug.h>
 #include <rte_mbuf.h>
 #include <rte_ethdev.h>
@@ -112,8 +113,10 @@ failsafe_rx_burst(void *queue,
                if (unlikely(fs_rx_unsafe(sdev)))
                        continue;
                sub_rxq = ETH(sdev)->data->rx_queues[rxq->qid];
+               FS_ATOMIC_P(rxq->refcnt[sdev->sid]);
                nb_rx = ETH(sdev)->
                        rx_pkt_burst(sub_rxq, rx_pkts, nb_pkts);
+               FS_ATOMIC_V(rxq->refcnt[sdev->sid]);
                if (nb_rx) {
                        rxq->last_polled = i;
                        return nb_rx;
@@ -146,8 +149,10 @@ failsafe_rx_burst_fast(void *queue,
                sdev = &priv->subs[i];
                RTE_ASSERT(!fs_rx_unsafe(sdev));
                sub_rxq = ETH(sdev)->data->rx_queues[rxq->qid];
+               FS_ATOMIC_P(rxq->refcnt[sdev->sid]);
                nb_rx = ETH(sdev)->
                        rx_pkt_burst(sub_rxq, rx_pkts, nb_pkts);
+               FS_ATOMIC_V(rxq->refcnt[sdev->sid]);
                if (nb_rx) {
                        rxq->last_polled = i;
                        return nb_rx;
@@ -164,13 +169,17 @@ failsafe_tx_burst(void *queue,
        struct sub_device *sdev;
        struct txq *txq;
        void *sub_txq;
+       uint16_t nb_tx;
 
        txq = queue;
        sdev = TX_SUBDEV(txq->priv->dev);
        if (unlikely(fs_tx_unsafe(sdev)))
                return 0;
        sub_txq = ETH(sdev)->data->tx_queues[txq->qid];
-       return ETH(sdev)->tx_pkt_burst(sub_txq, tx_pkts, nb_pkts);
+       FS_ATOMIC_P(txq->refcnt[sdev->sid]);
+       nb_tx = ETH(sdev)->tx_pkt_burst(sub_txq, tx_pkts, nb_pkts);
+       FS_ATOMIC_V(txq->refcnt[sdev->sid]);
+       return nb_tx;
 }
 
 uint16_t
@@ -181,10 +190,14 @@ failsafe_tx_burst_fast(void *queue,
        struct sub_device *sdev;
        struct txq *txq;
        void *sub_txq;
+       uint16_t nb_tx;
 
        txq = queue;
        sdev = TX_SUBDEV(txq->priv->dev);
        RTE_ASSERT(!fs_tx_unsafe(sdev));
        sub_txq = ETH(sdev)->data->tx_queues[txq->qid];
-       return ETH(sdev)->tx_pkt_burst(sub_txq, tx_pkts, nb_pkts);
+       FS_ATOMIC_P(txq->refcnt[sdev->sid]);
+       nb_tx = ETH(sdev)->tx_pkt_burst(sub_txq, tx_pkts, nb_pkts);
+       FS_ATOMIC_V(txq->refcnt[sdev->sid]);
+       return nb_tx;
 }