> Subject: [PATCH] ethdev: introduce generic dummy packet burst function
> 
> Multiple PMDs have dummy/noop Rx/Tx packet burst functions.
> 
> These dummy functions are very simple, introduce a common function in
> the ethdev and update drivers to use it instead of each driver having
> its own functions.
> 
> Signed-off-by: Ferruh Yigit <ferruh.yi...@intel.com>
> ---
> Cc: Ciara Loftus <ciara.lof...@intel.com>
> ---

[snip]

> diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
> index 3f3c4a7c7214..910b76a92c42 100644
> --- a/drivers/net/mlx4/mlx4.c
> +++ b/drivers/net/mlx4/mlx4.c
> @@ -350,8 +350,8 @@ mlx4_dev_stop(struct rte_eth_dev *dev)
>               return 0;
>       DEBUG("%p: detaching flows from all RX queues", (void *)dev);
>       priv->started = 0;
> -     dev->tx_pkt_burst = mlx4_tx_burst_removed;
> -     dev->rx_pkt_burst = mlx4_rx_burst_removed;
> +     dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
> +     dev->rx_pkt_burst = rte_eth_pkt_burst_dummy;
>       rte_wmb();
>       /* Disable datapath on secondary process. */
>       mlx4_mp_req_stop_rxtx(dev);
> @@ -383,8 +383,8 @@ mlx4_dev_close(struct rte_eth_dev *dev)
>       DEBUG("%p: closing device \"%s\"",
>             (void *)dev,
>             ((priv->ctx != NULL) ? priv->ctx->device->name : ""));
> -     dev->rx_pkt_burst = mlx4_rx_burst_removed;
> -     dev->tx_pkt_burst = mlx4_tx_burst_removed;
> +     dev->rx_pkt_burst = rte_eth_pkt_burst_dummy;
> +     dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
>       rte_wmb();
>       /* Disable datapath on secondary process. */
>       mlx4_mp_req_stop_rxtx(dev);
> diff --git a/drivers/net/mlx4/mlx4_mp.c b/drivers/net/mlx4/mlx4_mp.c
> index 8fcfb5490ee9..1da64910aadd 100644
> --- a/drivers/net/mlx4/mlx4_mp.c
> +++ b/drivers/net/mlx4/mlx4_mp.c
> @@ -150,8 +150,8 @@ mp_secondary_handle(const struct rte_mp_msg
> *mp_msg, const void *peer)
>               break;
>       case MLX4_MP_REQ_STOP_RXTX:
>               INFO("port %u stopping datapath", dev->data->port_id);
> -             dev->tx_pkt_burst = mlx4_tx_burst_removed;
> -             dev->rx_pkt_burst = mlx4_rx_burst_removed;
> +             dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
> +             dev->rx_pkt_burst = rte_eth_pkt_burst_dummy;
>               rte_mb();
>               mp_init_msg(dev, &mp_res, param->type);
>               res->result = 0;
> diff --git a/drivers/net/mlx4/mlx4_rxtx.c b/drivers/net/mlx4/mlx4_rxtx.c
> index ed9e41fcdea9..059e432a63fc 100644
> --- a/drivers/net/mlx4/mlx4_rxtx.c
> +++ b/drivers/net/mlx4/mlx4_rxtx.c
> @@ -1338,55 +1338,3 @@ mlx4_rx_burst(void *dpdk_rxq, struct rte_mbuf
> **pkts, uint16_t pkts_n)
>       rxq->stats.ipackets += i;
>       return i;
>  }
> -
> -/**
> - * Dummy DPDK callback for Tx.
> - *
> - * This function is used to temporarily replace the real callback during
> - * unsafe control operations on the queue, or in case of error.
> - *
> - * @param dpdk_txq
> - *   Generic pointer to Tx queue structure.
> - * @param[in] pkts
> - *   Packets to transmit.
> - * @param pkts_n
> - *   Number of packets in array.
> - *
> - * @return
> - *   Number of packets successfully transmitted (<= pkts_n).
> - */
> -uint16_t
> -mlx4_tx_burst_removed(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t
> pkts_n)
> -{
> -     (void)dpdk_txq;
> -     (void)pkts;
> -     (void)pkts_n;
> -     rte_mb();

The mlx4 and mlx5 PMDs lose a call to rte_mb() when switching over to the new 
dummy functions. Maybe the maintainer can comment on whether that's an issue or 
not? Other than that LGTM.

Ciara

> -     return 0;
> -}
> -
> -/**
> - * Dummy DPDK callback for Rx.
> - *
> - * This function is used to temporarily replace the real callback during
> - * unsafe control operations on the queue, or in case of error.
> - *
> - * @param dpdk_rxq
> - *   Generic pointer to Rx queue structure.
> - * @param[out] pkts
> - *   Array to store received packets.
> - * @param pkts_n
> - *   Maximum number of packets in array.
> - *
> - * @return
> - *   Number of packets successfully received (<= pkts_n).
> - */
> -uint16_t
> -mlx4_rx_burst_removed(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t
> pkts_n)
> -{
> -     (void)dpdk_rxq;
> -     (void)pkts;
> -     (void)pkts_n;
> -     rte_mb();
> -     return 0;
> -}
> diff --git a/drivers/net/mlx4/mlx4_rxtx.h b/drivers/net/mlx4/mlx4_rxtx.h
> index 83e9534cd0a7..70f3cd868058 100644
> --- a/drivers/net/mlx4/mlx4_rxtx.h
> +++ b/drivers/net/mlx4/mlx4_rxtx.h
> @@ -149,10 +149,6 @@ uint16_t mlx4_tx_burst(void *dpdk_txq, struct
> rte_mbuf **pkts,
>                      uint16_t pkts_n);
>  uint16_t mlx4_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts,
>                      uint16_t pkts_n);
> -uint16_t mlx4_tx_burst_removed(void *dpdk_txq, struct rte_mbuf **pkts,
> -                            uint16_t pkts_n);
> -uint16_t mlx4_rx_burst_removed(void *dpdk_rxq, struct rte_mbuf **pkts,
> -                            uint16_t pkts_n);
> 
>  /* mlx4_txq.c */
> 
> diff --git a/drivers/net/mlx5/linux/mlx5_mp_os.c
> b/drivers/net/mlx5/linux/mlx5_mp_os.c
> index c448a3e9eb87..e607089e0e20 100644
> --- a/drivers/net/mlx5/linux/mlx5_mp_os.c
> +++ b/drivers/net/mlx5/linux/mlx5_mp_os.c
> @@ -192,8 +192,8 @@ struct rte_mp_msg mp_res;
>               break;
>       case MLX5_MP_REQ_STOP_RXTX:
>               DRV_LOG(INFO, "port %u stopping datapath", dev->data-
> >port_id);
> -             dev->rx_pkt_burst = removed_rx_burst;
> -             dev->tx_pkt_burst = removed_tx_burst;
> +             dev->rx_pkt_burst = rte_eth_pkt_burst_dummy;
> +             dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
>               rte_mb();
>               mp_init_msg(&priv->mp_id, &mp_res, param->type);
>               res->result = 0;
> diff --git a/drivers/net/mlx5/linux/mlx5_os.c
> b/drivers/net/mlx5/linux/mlx5_os.c
> index aecdc5a68abb..bbe05bb837e0 100644
> --- a/drivers/net/mlx5/linux/mlx5_os.c
> +++ b/drivers/net/mlx5/linux/mlx5_os.c
> @@ -1623,8 +1623,8 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
>       DRV_LOG(DEBUG, "port %u MTU is %u", eth_dev->data->port_id,
>               priv->mtu);
>       /* Initialize burst functions to prevent crashes before link-up. */
> -     eth_dev->rx_pkt_burst = removed_rx_burst;
> -     eth_dev->tx_pkt_burst = removed_tx_burst;
> +     eth_dev->rx_pkt_burst = rte_eth_pkt_burst_dummy;
> +     eth_dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
>       eth_dev->dev_ops = &mlx5_dev_ops;
>       eth_dev->rx_descriptor_status = mlx5_rx_descriptor_status;
>       eth_dev->tx_descriptor_status = mlx5_tx_descriptor_status;
> diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
> index 67eda41a60a5..5571e9067787 100644
> --- a/drivers/net/mlx5/mlx5.c
> +++ b/drivers/net/mlx5/mlx5.c
> @@ -1559,8 +1559,8 @@ mlx5_dev_close(struct rte_eth_dev *dev)
>       mlx5_action_handle_flush(dev);
>       mlx5_flow_meter_flush(dev, NULL);
>       /* Prevent crashes when queues are still in use. */
> -     dev->rx_pkt_burst = removed_rx_burst;
> -     dev->tx_pkt_burst = removed_tx_burst;
> +     dev->rx_pkt_burst = rte_eth_pkt_burst_dummy;
> +     dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
>       rte_wmb();
>       /* Disable datapath on secondary process. */
>       mlx5_mp_os_req_stop_rxtx(dev);
> diff --git a/drivers/net/mlx5/mlx5_rx.c b/drivers/net/mlx5/mlx5_rx.c
> index f388fcc31395..11ea935d72f0 100644
> --- a/drivers/net/mlx5/mlx5_rx.c
> +++ b/drivers/net/mlx5/mlx5_rx.c
> @@ -252,7 +252,7 @@ mlx5_rx_queue_count(void *rx_queue)
>       dev = &rte_eth_devices[rxq->port_id];
> 
>       if (dev->rx_pkt_burst == NULL ||
> -         dev->rx_pkt_burst == removed_rx_burst) {
> +         dev->rx_pkt_burst == rte_eth_pkt_burst_dummy) {
>               rte_errno = ENOTSUP;
>               return -rte_errno;
>       }
> @@ -1153,31 +1153,6 @@ mlx5_rx_burst_mprq(void *dpdk_rxq, struct
> rte_mbuf **pkts, uint16_t pkts_n)
>       return i;
>  }
> 
> -/**
> - * Dummy DPDK callback for RX.
> - *
> - * This function is used to temporarily replace the real callback during
> - * unsafe control operations on the queue, or in case of error.
> - *
> - * @param dpdk_rxq
> - *   Generic pointer to RX queue structure.
> - * @param[out] pkts
> - *   Array to store received packets.
> - * @param pkts_n
> - *   Maximum number of packets in array.
> - *
> - * @return
> - *   Number of packets successfully received (<= pkts_n).
> - */
> -uint16_t
> -removed_rx_burst(void *dpdk_rxq __rte_unused,
> -              struct rte_mbuf **pkts __rte_unused,
> -              uint16_t pkts_n __rte_unused)
> -{
> -     rte_mb();
> -     return 0;
> -}
> -
>  /*
>   * Vectorized Rx routines are not compiled in when required vector
> instructions
>   * are not supported on a target architecture.
> diff --git a/drivers/net/mlx5/mlx5_rx.h b/drivers/net/mlx5/mlx5_rx.h
> index cb5d51340db7..7e417819f7e8 100644
> --- a/drivers/net/mlx5/mlx5_rx.h
> +++ b/drivers/net/mlx5/mlx5_rx.h
> @@ -275,8 +275,6 @@ __rte_noinline int mlx5_rx_err_handle(struct
> mlx5_rxq_data *rxq, uint8_t vec);
>  void mlx5_mprq_buf_free(struct mlx5_mprq_buf *buf);
>  uint16_t mlx5_rx_burst_mprq(void *dpdk_rxq, struct rte_mbuf **pkts,
>                           uint16_t pkts_n);
> -uint16_t removed_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts,
> -                       uint16_t pkts_n);
>  int mlx5_rx_descriptor_status(void *rx_queue, uint16_t offset);
>  uint32_t mlx5_rx_queue_count(void *rx_queue);
>  void mlx5_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
> diff --git a/drivers/net/mlx5/mlx5_trigger.c
> b/drivers/net/mlx5/mlx5_trigger.c
> index 74c9c0a4fff8..3a59237b1a7a 100644
> --- a/drivers/net/mlx5/mlx5_trigger.c
> +++ b/drivers/net/mlx5/mlx5_trigger.c
> @@ -1244,8 +1244,8 @@ mlx5_dev_stop(struct rte_eth_dev *dev)
> 
>       dev->data->dev_started = 0;
>       /* Prevent crashes when queues are still in use. */
> -     dev->rx_pkt_burst = removed_rx_burst;
> -     dev->tx_pkt_burst = removed_tx_burst;
> +     dev->rx_pkt_burst = rte_eth_pkt_burst_dummy;
> +     dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
>       rte_wmb();
>       /* Disable datapath on secondary process. */
>       mlx5_mp_os_req_stop_rxtx(dev);
> diff --git a/drivers/net/mlx5/mlx5_tx.c b/drivers/net/mlx5/mlx5_tx.c
> index fd2cf2096753..8453b2701a9f 100644
> --- a/drivers/net/mlx5/mlx5_tx.c
> +++ b/drivers/net/mlx5/mlx5_tx.c
> @@ -135,31 +135,6 @@ mlx5_tx_error_cqe_handle(struct mlx5_txq_data
> *__rte_restrict txq,
>       return 0;
>  }
> 
> -/**
> - * Dummy DPDK callback for TX.
> - *
> - * This function is used to temporarily replace the real callback during
> - * unsafe control operations on the queue, or in case of error.
> - *
> - * @param dpdk_txq
> - *   Generic pointer to TX queue structure.
> - * @param[in] pkts
> - *   Packets to transmit.
> - * @param pkts_n
> - *   Number of packets in array.
> - *
> - * @return
> - *   Number of packets successfully transmitted (<= pkts_n).
> - */
> -uint16_t
> -removed_tx_burst(void *dpdk_txq __rte_unused,
> -              struct rte_mbuf **pkts __rte_unused,
> -              uint16_t pkts_n __rte_unused)
> -{
> -     rte_mb();
> -     return 0;
> -}
> -
>  /**
>   * Update completion queue consuming index via doorbell
>   * and flush the completed data buffers.
> diff --git a/drivers/net/mlx5/mlx5_tx.h b/drivers/net/mlx5/mlx5_tx.h
> index 099e72935a3a..31eb0a1ce28e 100644
> --- a/drivers/net/mlx5/mlx5_tx.h
> +++ b/drivers/net/mlx5/mlx5_tx.h
> @@ -221,8 +221,6 @@ void mlx5_txq_dynf_timestamp_set(struct
> rte_eth_dev *dev);
> 
>  /* mlx5_tx.c */
> 
> -uint16_t removed_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts,
> -                       uint16_t pkts_n);
>  void mlx5_tx_handle_completion(struct mlx5_txq_data *__rte_restrict txq,
>                              unsigned int olx __rte_unused);
>  int mlx5_tx_descriptor_status(void *tx_queue, uint16_t offset);
> diff --git a/drivers/net/mlx5/windows/mlx5_os.c
> b/drivers/net/mlx5/windows/mlx5_os.c
> index ac0af0ff7d43..7f3532426f1f 100644
> --- a/drivers/net/mlx5/windows/mlx5_os.c
> +++ b/drivers/net/mlx5/windows/mlx5_os.c
> @@ -574,8 +574,8 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
>       DRV_LOG(DEBUG, "port %u MTU is %u.", eth_dev->data->port_id,
>               priv->mtu);
>       /* Initialize burst functions to prevent crashes before link-up. */
> -     eth_dev->rx_pkt_burst = removed_rx_burst;
> -     eth_dev->tx_pkt_burst = removed_tx_burst;
> +     eth_dev->rx_pkt_burst = rte_eth_pkt_burst_dummy;
> +     eth_dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
>       eth_dev->dev_ops = &mlx5_dev_ops;
>       eth_dev->rx_descriptor_status = mlx5_rx_descriptor_status;
>       eth_dev->tx_descriptor_status = mlx5_tx_descriptor_status;
> diff --git a/drivers/net/pfe/pfe_ethdev.c b/drivers/net/pfe/pfe_ethdev.c
> index edf32aa70da6..c2991ab1ccaa 100644
> --- a/drivers/net/pfe/pfe_ethdev.c
> +++ b/drivers/net/pfe/pfe_ethdev.c
> @@ -235,22 +235,6 @@ pfe_xmit_pkts(void *tx_queue, struct rte_mbuf
> **tx_pkts, uint16_t nb_pkts)
>       return nb_pkts;
>  }
> 
> -static uint16_t
> -pfe_dummy_xmit_pkts(__rte_unused void *tx_queue,
> -             __rte_unused struct rte_mbuf **tx_pkts,
> -             __rte_unused uint16_t nb_pkts)
> -{
> -     return 0;
> -}
> -
> -static uint16_t
> -pfe_dummy_recv_pkts(__rte_unused void *rxq,
> -             __rte_unused struct rte_mbuf **rx_pkts,
> -             __rte_unused uint16_t nb_pkts)
> -{
> -     return 0;
> -}
> -
>  static int
>  pfe_eth_open(struct rte_eth_dev *dev)
>  {
> @@ -383,8 +367,8 @@ pfe_eth_stop(struct rte_eth_dev *dev/*, int
> wake*/)
>       gemac_disable(priv->EMAC_baseaddr);
>       gpi_disable(priv->GPI_baseaddr);
> 
> -     dev->rx_pkt_burst = &pfe_dummy_recv_pkts;
> -     dev->tx_pkt_burst = &pfe_dummy_xmit_pkts;
> +     dev->rx_pkt_burst = rte_eth_pkt_burst_dummy;
> +     dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
> 
>       return 0;
>  }
> diff --git a/drivers/net/qede/qede_ethdev.c
> b/drivers/net/qede/qede_ethdev.c
> index a1122a297e6b..ea6b71f09355 100644
> --- a/drivers/net/qede/qede_ethdev.c
> +++ b/drivers/net/qede/qede_ethdev.c
> @@ -322,8 +322,8 @@ qede_assign_rxtx_handlers(struct rte_eth_dev *dev,
> bool is_dummy)
>       bool use_tx_offload = false;
> 
>       if (is_dummy) {
> -             dev->rx_pkt_burst = qede_rxtx_pkts_dummy;
> -             dev->tx_pkt_burst = qede_rxtx_pkts_dummy;
> +             dev->rx_pkt_burst = rte_eth_pkt_burst_dummy;
> +             dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
>               return;
>       }
> 
> diff --git a/drivers/net/qede/qede_rxtx.c b/drivers/net/qede/qede_rxtx.c
> index 7088c57b501d..85784f4a82a6 100644
> --- a/drivers/net/qede/qede_rxtx.c
> +++ b/drivers/net/qede/qede_rxtx.c
> @@ -2734,15 +2734,6 @@ qede_xmit_pkts_cmt(void *p_fp_cmt, struct
> rte_mbuf **tx_pkts, uint16_t nb_pkts)
>       return eng0_pkts + eng1_pkts;
>  }
> 
> -uint16_t
> -qede_rxtx_pkts_dummy(__rte_unused void *p_rxq,
> -                  __rte_unused struct rte_mbuf **pkts,
> -                  __rte_unused uint16_t nb_pkts)
> -{
> -     return 0;
> -}
> -
> -
>  /* this function does a fake walk through over completion queue
>   * to calculate number of BDs used by HW.
>   * At the end, it restores the state of completion queue.
> diff --git a/drivers/net/qede/qede_rxtx.h b/drivers/net/qede/qede_rxtx.h
> index 11ed1d9b9c50..013a4a07c716 100644
> --- a/drivers/net/qede/qede_rxtx.h
> +++ b/drivers/net/qede/qede_rxtx.h
> @@ -272,9 +272,6 @@ uint16_t qede_recv_pkts_cmt(void *p_rxq, struct
> rte_mbuf **rx_pkts,
>  uint16_t
>  qede_recv_pkts_regular(void *p_rxq, struct rte_mbuf **rx_pkts,
>                      uint16_t nb_pkts);
> -uint16_t qede_rxtx_pkts_dummy(void *p_rxq,
> -                           struct rte_mbuf **pkts,
> -                           uint16_t nb_pkts);
> 
>  int qede_start_queues(struct rte_eth_dev *eth_dev);
> 
> diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h
> index 8f0ac0adf0ae..075f97a4b37a 100644
> --- a/lib/ethdev/ethdev_driver.h
> +++ b/lib/ethdev/ethdev_driver.h
> @@ -1432,6 +1432,25 @@ rte_eth_linkstatus_get(const struct rte_eth_dev
> *dev,
>       *dst = __atomic_load_n(src, __ATOMIC_SEQ_CST);
>  }
> 
> +/**
> + * @internal
> + * Dummy DPDK callback for Rx/Tx packet burst.
> + *
> + * @param queue
> + *  Pointer to Rx/Tx queue
> + * @param pkts
> + *  Packet array
> + * @param nb_pkts
> + *  Number of packets in packet array
> + */
> +static inline uint16_t
> +rte_eth_pkt_burst_dummy(void *queue __rte_unused,
> +             struct rte_mbuf **pkts __rte_unused,
> +             uint16_t nb_pkts __rte_unused)
> +{
> +     return 0;
> +}
> +
>  /**
>   * Allocate an unique switch domain identifier.
>   *
> --
> 2.34.1

Reply via email to