From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from rcdn-iport-1.cisco.com (rcdn-iport-1.cisco.com [173.37.86.72]) by dpdk.org (Postfix) with ESMTP id B1A3C2C8 for ; Fri, 7 Jul 2017 02:25:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=5922; q=dns/txt; s=iport; t=1499387120; x=1500596720; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=UKlN97+7gYv76+eUIPnJGnL48l1XMryrOtLgu+odT8c=; b=OeRATi0/nfnnQPzpAyY1Bq+2SOmZ5XPRFV9FRYg9NFUFpR5tLX5tW3Cm h+dP/DwgILQwNMIFFx9avXZhT7D6QjHnyuGqTrJ4ivvBTlpNJpS9lwybi n4jDYMLDuWqzlQ/3oerm9RowE9SBgjoM98iPTVHYyEZpG5S411uEbSsGx 8=; X-IronPort-AV: E=Sophos;i="5.40,319,1496102400"; d="scan'208";a="270427978" Received: from rcdn-core-2.cisco.com ([173.37.93.153]) by rcdn-iport-1.cisco.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 07 Jul 2017 00:25:19 +0000 Received: from cisco.com (savbu-usnic-a.cisco.com [10.193.184.48]) by rcdn-core-2.cisco.com (8.14.5/8.14.5) with ESMTP id v670PJMW028478; Fri, 7 Jul 2017 00:25:19 GMT Received: by cisco.com (Postfix, from userid 392789) id 6DA7B3FAAEAA; Thu, 6 Jul 2017 17:25:19 -0700 (PDT) From: John Daley To: ajgill@cisco.com Cc: prasanna@cisco.com, aekkati@cisco.com, rarakali@cisco.com, John Daley , stable@dpdk.org Date: Thu, 6 Jul 2017 17:24:27 -0700 Message-Id: <20170707002428.29383-2-johndale@cisco.com> X-Mailer: git-send-email 2.12.0 In-Reply-To: <20170707002428.29383-1-johndale@cisco.com> References: <40F88B2B-CE38-4667-903A-E44B90BC99FD@cisco.com> <20170707002428.29383-1-johndale@cisco.com> Subject: [dpdk-stable] [PATCH 1/2] net/enic: fix multi-process operation X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 07 Jul 2017 00:25:21 -0000 - Use rte_malloc() instead of malloc() for the per device 'vdev' structure so that it can be shared across processes. - Only initialize the device if the process type is RTE_PROC_PRIMARY - Only allow the primary process to do queue setup, start/stop, promisc allmulticast, mac add/del, mtu. Fixes: fefed3d1e62c ("enic: new driver") Cc: stable@dpdk.org Signed-off-by: John Daley --- drivers/net/enic/base/vnic_dev.c | 10 ++++++++-- drivers/net/enic/enic_ethdev.c | 35 +++++++++++++++++++++++++++++++++++ drivers/net/enic/enic_main.c | 7 +++++++ 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/drivers/net/enic/base/vnic_dev.c b/drivers/net/enic/base/vnic_dev.c index fc2e4cc36..c5059ff3a 100644 --- a/drivers/net/enic/base/vnic_dev.c +++ b/drivers/net/enic/base/vnic_dev.c @@ -936,7 +936,7 @@ void vnic_dev_unregister(struct vnic_dev *vdev) vdev->free_consistent(vdev->priv, sizeof(struct vnic_devcmd_fw_info), vdev->fw_info, vdev->fw_info_pa); - kfree(vdev); + rte_free(vdev); } } @@ -945,7 +945,13 @@ struct vnic_dev *vnic_dev_register(struct vnic_dev *vdev, unsigned int num_bars) { if (!vdev) { - vdev = kzalloc(sizeof(struct vnic_dev), GFP_ATOMIC); + char name[NAME_MAX]; + snprintf((char *)name, sizeof(name), "%s-vnic", + pdev->device.name); + vdev = (struct vnic_dev *)rte_zmalloc_socket(name, + sizeof(struct vnic_dev), + RTE_CACHE_LINE_SIZE, + pdev->device.numa_node); if (!vdev) return NULL; } diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c index 47b07c921..bfc3dca1d 100644 --- a/drivers/net/enic/enic_ethdev.c +++ b/drivers/net/enic/enic_ethdev.c @@ -181,6 +181,9 @@ static int enicpmd_dev_tx_queue_setup(struct rte_eth_dev *eth_dev, int ret; struct enic *enic = pmd_priv(eth_dev); + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return -E_RTE_SECONDARY; + ENICPMD_FUNC_TRACE(); if (queue_idx >= ENIC_WQ_MAX) { dev_err(enic, @@ -271,6 +274,10 @@ static int enicpmd_dev_rx_queue_setup(struct rte_eth_dev *eth_dev, struct enic *enic = pmd_priv(eth_dev); ENICPMD_FUNC_TRACE(); + + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return -E_RTE_SECONDARY; + /* With Rx scatter support, two RQs are now used on VIC per RQ used * by the application. */ @@ -342,6 +349,9 @@ static int enicpmd_dev_configure(struct rte_eth_dev *eth_dev) int ret; struct enic *enic = pmd_priv(eth_dev); + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return -E_RTE_SECONDARY; + ENICPMD_FUNC_TRACE(); ret = enic_set_vnic_res(enic); if (ret) { @@ -368,6 +378,9 @@ static int enicpmd_dev_start(struct rte_eth_dev *eth_dev) { struct enic *enic = pmd_priv(eth_dev); + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return -E_RTE_SECONDARY; + ENICPMD_FUNC_TRACE(); return enic_enable(enic); } @@ -380,6 +393,9 @@ static void enicpmd_dev_stop(struct rte_eth_dev *eth_dev) struct rte_eth_link link; struct enic *enic = pmd_priv(eth_dev); + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return; + ENICPMD_FUNC_TRACE(); enic_disable(enic); memset(&link, 0, sizeof(link)); @@ -482,7 +498,11 @@ static void enicpmd_dev_promiscuous_enable(struct rte_eth_dev *eth_dev) { struct enic *enic = pmd_priv(eth_dev); + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return; + ENICPMD_FUNC_TRACE(); + enic->promisc = 1; enic_add_packet_filter(enic); } @@ -491,6 +511,9 @@ static void enicpmd_dev_promiscuous_disable(struct rte_eth_dev *eth_dev) { struct enic *enic = pmd_priv(eth_dev); + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return; + ENICPMD_FUNC_TRACE(); enic->promisc = 0; enic_add_packet_filter(enic); @@ -500,6 +523,9 @@ static void enicpmd_dev_allmulticast_enable(struct rte_eth_dev *eth_dev) { struct enic *enic = pmd_priv(eth_dev); + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return; + ENICPMD_FUNC_TRACE(); enic->allmulti = 1; enic_add_packet_filter(enic); @@ -509,6 +535,9 @@ static void enicpmd_dev_allmulticast_disable(struct rte_eth_dev *eth_dev) { struct enic *enic = pmd_priv(eth_dev); + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return; + ENICPMD_FUNC_TRACE(); enic->allmulti = 0; enic_add_packet_filter(enic); @@ -520,6 +549,9 @@ static void enicpmd_add_mac_addr(struct rte_eth_dev *eth_dev, { struct enic *enic = pmd_priv(eth_dev); + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return -E_RTE_SECONDARY; + ENICPMD_FUNC_TRACE(); enic_set_mac_address(enic, mac_addr->addr_bytes); } @@ -528,6 +560,9 @@ static void enicpmd_remove_mac_addr(struct rte_eth_dev *eth_dev, __rte_unused ui { struct enic *enic = pmd_priv(eth_dev); + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return; + ENICPMD_FUNC_TRACE(); enic_del_mac_address(enic); } diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c index b4ca37104..de91ac11d 100644 --- a/drivers/net/enic/enic_main.c +++ b/drivers/net/enic/enic_main.c @@ -1079,6 +1079,9 @@ int enic_set_mtu(struct enic *enic, uint16_t new_mtu) old_mtu = eth_dev->data->mtu; config_mtu = enic->config.mtu; + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return -E_RTE_SECONDARY; + /* only works with Rx scatter disabled */ if (enic->rte_dev->data->dev_conf.rxmode.enable_scatter) return -ENOTSUP; @@ -1148,6 +1151,10 @@ int enic_probe(struct enic *enic) dev_debug(enic, " Initializing ENIC PMD\n"); + /* if this is a secondary process the hardware is already initialized */ + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return 0; + enic->bar0.vaddr = (void *)pdev->mem_resource[0].addr; enic->bar0.len = pdev->mem_resource[0].len; -- 2.12.0