net/mlx5: fix port attach in secondary process
[dpdk.git] / drivers / net / mlx5 / linux / mlx5_mp_os.c
index 60fdee2..8011ca8 100644 (file)
@@ -115,6 +115,7 @@ struct rte_mp_msg mp_res;
        const struct mlx5_mp_param *param =
                (const struct mlx5_mp_param *)mp_msg->param;
        struct rte_eth_dev *dev;
+       struct mlx5_proc_priv *ppriv;
        struct mlx5_priv *priv;
        int ret;
 
@@ -132,6 +133,20 @@ struct rte_mp_msg mp_res;
                rte_mb();
                dev->rx_pkt_burst = mlx5_select_rx_function(dev);
                dev->tx_pkt_burst = mlx5_select_tx_function(dev);
+               ppriv = (struct mlx5_proc_priv *)dev->process_private;
+               /* If Tx queue number changes, re-initialize UAR. */
+               if (ppriv->uar_table_sz != priv->txqs_n) {
+                       mlx5_tx_uar_uninit_secondary(dev);
+                       mlx5_proc_priv_uninit(dev);
+                       ret = mlx5_proc_priv_init(dev);
+                       if (ret)
+                               return -rte_errno;
+                       ret = mlx5_tx_uar_init_secondary(dev, mp_msg->fds[0]);
+                       if (ret) {
+                               mlx5_proc_priv_uninit(dev);
+                               return -rte_errno;
+                       }
+               }
                mp_init_msg(&priv->mp_id, &mp_res, param->type);
                res->result = 0;
                ret = rte_mp_reply(&mp_res, peer);
@@ -183,6 +198,10 @@ mp_req_on_rxtx(struct rte_eth_dev *dev, enum mlx5_mp_req_type type)
                return;
        }
        mp_init_msg(&priv->mp_id, &mp_req, type);
+       if (type == MLX5_MP_REQ_START_RXTX) {
+               mp_req.num_fds = 1;
+               mp_req.fds[0] = ((struct ibv_context *)priv->sh->ctx)->cmd_fd;
+       }
        ret = rte_mp_request_sync(&mp_req, &mp_rep, &ts);
        if (ret) {
                if (rte_errno != ENOTSUP)