From patchwork Thu Aug 24 14:03:40 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xueming Li X-Patchwork-Id: 27873 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 2B2177D4A; Thu, 24 Aug 2017 16:05:21 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 1FE037D0B for ; Thu, 24 Aug 2017 16:05:18 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from xuemingl@mellanox.com) with ESMTPS (AES256-SHA encrypted); 24 Aug 2017 17:03:57 +0300 Received: from dev-r630-06.mtbc.labs.mlnx (dev-r630-06.mtbc.labs.mlnx [10.12.205.222]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id v7OE3t7W024860; Thu, 24 Aug 2017 17:03:56 +0300 Received: from dev-r630-06.mtbc.labs.mlnx (localhost [127.0.0.1]) by dev-r630-06.mtbc.labs.mlnx (8.14.7/8.14.7) with ESMTP id v7OE3tHg095527; Thu, 24 Aug 2017 22:03:55 +0800 Received: (from xuemingl@localhost) by dev-r630-06.mtbc.labs.mlnx (8.14.7/8.14.7/Submit) id v7OE3rk8095526; Thu, 24 Aug 2017 22:03:53 +0800 From: Xueming Li To: Nelio Laranjeiro Cc: Xueming Li , dev@dpdk.org Date: Thu, 24 Aug 2017 22:03:40 +0800 Message-Id: <20170824140341.95471-1-xuemingl@mellanox.com> X-Mailer: git-send-email 2.13.3 Subject: [dpdk-dev] [PATCH v1 1/2] net/mlx5: change eth device reference for secondary process X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" rte_eth_dev created by primary process were not available in secondary process, it was not possible to use the primary process local memory object from a secondary process. This patch modify the reference of primary rte_eth_dev object, use local rte_eth_dev secondary process instead. Cc: Nelio Laranjeiro Signed-off-by: Xueming Li Acked-by: Nelio Laranjeiro --- drivers/net/mlx5/mlx5.h | 6 ++--- drivers/net/mlx5/mlx5_ethdev.c | 52 ++++++++++++++++++++++------------------- drivers/net/mlx5/mlx5_fdir.c | 3 +++ drivers/net/mlx5/mlx5_rss.c | 3 +++ drivers/net/mlx5/mlx5_rxq.c | 2 ++ drivers/net/mlx5/mlx5_trigger.c | 4 ++-- 6 files changed, 41 insertions(+), 29 deletions(-) diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 684a603..2dee07c 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -95,7 +95,7 @@ struct mlx5_xstats_ctrl { }; struct priv { - struct rte_eth_dev *dev; /* Ethernet device. */ + struct rte_eth_dev *dev; /* Ethernet device of master process. */ struct ibv_context *ctx; /* Verbs context. */ struct ibv_device_attr_ex device_attr; /* Device properties. */ struct ibv_pd *pd; /* Protection Domain. */ @@ -223,8 +223,8 @@ int mlx5_ibv_device_to_pci_addr(const struct ibv_device *, int mlx5_set_link_down(struct rte_eth_dev *dev); int mlx5_set_link_up(struct rte_eth_dev *dev); struct priv *mlx5_secondary_data_setup(struct priv *priv); -void priv_select_tx_function(struct priv *); -void priv_select_rx_function(struct priv *); +void mlx5_dev_select_tx_function(struct rte_eth_dev *dev); +void mlx5_dev_select_rx_function(struct rte_eth_dev *dev); /* mlx5_mac.c */ diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c index f5167e0..fce7dd5 100644 --- a/drivers/net/mlx5/mlx5_ethdev.c +++ b/drivers/net/mlx5/mlx5_ethdev.c @@ -1038,7 +1038,7 @@ struct priv * * burst function again. */ if (!ret) - priv_select_rx_function(priv); + mlx5_dev_select_rx_function(dev); out: priv_unlock(priv); assert(ret >= 0); @@ -1347,7 +1347,7 @@ struct priv * /** * Change the link state (UP / DOWN). * - * @param priv + * @param dev * Pointer to Ethernet device structure. * @param up * Nonzero for link up, otherwise link down. @@ -1356,17 +1356,17 @@ struct priv * * 0 on success, errno value on failure. */ static int -priv_set_link(struct priv *priv, int up) +mlx5_dev_set_link(struct rte_eth_dev *dev, int up) { - struct rte_eth_dev *dev = priv->dev; + struct priv *priv = dev->data->dev_private; int err; if (up) { err = priv_set_flags(priv, ~IFF_UP, IFF_UP); if (err) return err; - priv_select_tx_function(priv); - priv_select_rx_function(priv); + mlx5_dev_select_tx_function(dev); + mlx5_dev_select_rx_function(dev); } else { err = priv_set_flags(priv, ~IFF_UP, ~IFF_UP); if (err) @@ -1393,7 +1393,7 @@ struct priv * int err; priv_lock(priv); - err = priv_set_link(priv, 0); + err = mlx5_dev_set_link(dev, 0); priv_unlock(priv); return err; } @@ -1414,7 +1414,7 @@ struct priv * int err; priv_lock(priv); - err = priv_set_link(priv, 1); + err = mlx5_dev_set_link(dev, 1); priv_unlock(priv); return err; } @@ -1560,8 +1560,8 @@ struct priv * rte_mb(); priv->dev->data = &sd->data; rte_mb(); - priv_select_tx_function(priv); - priv_select_rx_function(priv); + mlx5_dev_select_tx_function(priv->dev); + mlx5_dev_select_rx_function(priv->dev); priv_unlock(priv); end: /* More sanity checks. */ @@ -1579,30 +1579,32 @@ struct priv * /** * Configure the TX function to use. * - * @param priv - * Pointer to private structure. + * @param dev + * Pointer to device structure. */ void -priv_select_tx_function(struct priv *priv) +mlx5_dev_select_tx_function(struct rte_eth_dev *dev) { - priv->dev->tx_pkt_burst = mlx5_tx_burst; + struct priv *priv = dev->data->dev_private; + + dev->tx_pkt_burst = mlx5_tx_burst; /* Select appropriate TX function. */ if (priv->mps == MLX5_MPW_ENHANCED) { if (priv_check_vec_tx_support(priv) > 0) { if (priv_check_raw_vec_tx_support(priv) > 0) - priv->dev->tx_pkt_burst = mlx5_tx_burst_raw_vec; + dev->tx_pkt_burst = mlx5_tx_burst_raw_vec; else - priv->dev->tx_pkt_burst = mlx5_tx_burst_vec; + dev->tx_pkt_burst = mlx5_tx_burst_vec; DEBUG("selected Enhanced MPW TX vectorized function"); } else { - priv->dev->tx_pkt_burst = mlx5_tx_burst_empw; + dev->tx_pkt_burst = mlx5_tx_burst_empw; DEBUG("selected Enhanced MPW TX function"); } } else if (priv->mps && priv->txq_inline) { - priv->dev->tx_pkt_burst = mlx5_tx_burst_mpw_inline; + dev->tx_pkt_burst = mlx5_tx_burst_mpw_inline; DEBUG("selected MPW inline TX function"); } else if (priv->mps) { - priv->dev->tx_pkt_burst = mlx5_tx_burst_mpw; + dev->tx_pkt_burst = mlx5_tx_burst_mpw; DEBUG("selected MPW TX function"); } } @@ -1610,17 +1612,19 @@ struct priv * /** * Configure the RX function to use. * - * @param priv - * Pointer to private structure. + * @param dev + * Pointer to device structure. */ void -priv_select_rx_function(struct priv *priv) +mlx5_dev_select_rx_function(struct rte_eth_dev *dev) { + struct priv *priv = dev->data->dev_private; + if (priv_check_vec_rx_support(priv) > 0) { priv_prep_vec_rx_function(priv); - priv->dev->rx_pkt_burst = mlx5_rx_burst_vec; + dev->rx_pkt_burst = mlx5_rx_burst_vec; DEBUG("selected RX vectorized function"); } else { - priv->dev->rx_pkt_burst = mlx5_rx_burst; + dev->rx_pkt_burst = mlx5_rx_burst; } } diff --git a/drivers/net/mlx5/mlx5_fdir.c b/drivers/net/mlx5/mlx5_fdir.c index 6acc053..0f3b70a 100644 --- a/drivers/net/mlx5/mlx5_fdir.c +++ b/drivers/net/mlx5/mlx5_fdir.c @@ -1075,6 +1075,9 @@ struct mlx5_fdir_filter { int ret = EINVAL; struct priv *priv = dev->data->dev_private; + if (mlx5_is_secondary()) + return -E_RTE_SECONDARY; + switch (filter_type) { case RTE_ETH_FILTER_GENERIC: if (filter_op != RTE_ETH_FILTER_GET) diff --git a/drivers/net/mlx5/mlx5_rss.c b/drivers/net/mlx5/mlx5_rss.c index a2dd7d1..7fd1ac1 100644 --- a/drivers/net/mlx5/mlx5_rss.c +++ b/drivers/net/mlx5/mlx5_rss.c @@ -357,6 +357,9 @@ int ret; struct priv *priv = dev->data->dev_private; + if (mlx5_is_secondary()) + return -E_RTE_SECONDARY; + mlx5_dev_stop(dev); priv_lock(priv); ret = priv_dev_rss_reta_update(priv, reta_conf, reta_size); diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c index da9f2f7..18e711e 100644 --- a/drivers/net/mlx5/mlx5_rxq.c +++ b/drivers/net/mlx5/mlx5_rxq.c @@ -1376,6 +1376,8 @@ unsigned int count = 0; struct rte_intr_handle *intr_handle = priv->dev->intr_handle; + assert(!mlx5_is_secondary()); + if (!priv->dev->data->dev_conf.intr_conf.rxq) return 0; priv_rx_intr_vec_disable(priv); diff --git a/drivers/net/mlx5/mlx5_trigger.c b/drivers/net/mlx5/mlx5_trigger.c index 595a9e0..5e7f979 100644 --- a/drivers/net/mlx5/mlx5_trigger.c +++ b/drivers/net/mlx5/mlx5_trigger.c @@ -73,8 +73,8 @@ return 0; } /* Update Rx/Tx callback. */ - priv_select_tx_function(priv); - priv_select_rx_function(priv); + mlx5_dev_select_tx_function(dev); + mlx5_dev_select_rx_function(dev); DEBUG("%p: allocating and configuring hash RX queues", (void *)dev); err = priv_create_hash_rxqs(priv); if (!err)