From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from alln-iport-2.cisco.com (alln-iport-2.cisco.com [173.37.142.89]) by dpdk.org (Postfix) with ESMTP id 6D7AA271 for ; Thu, 6 Jul 2017 22:19:37 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=5929; q=dns/txt; s=iport; t=1499372377; x=1500581977; h=from:to:cc:subject:date:message-id; bh=fmRJ2HwvNLZ+sjXSDzBqVK/Z70Eom7/CiH5lpiPlHN0=; b=mCQsPWs6BjpIBUuqTSch3iH4iKeGzIHKRedOVN0jzo4Zw9ouwmVVErCL sfTUKr6+zk9Lf5VlYP07IAsF6Cq4PKrjGxtrVSKCN6YMYcmTgzJ50PqA+ FUOwSitsDVxQrP6pI2ylFQ88XHafWoKvO/KLu8woq4lfT9EcmD8D2fJI9 w=; X-IronPort-AV: E=Sophos;i="5.40,319,1496102400"; d="scan'208";a="446296686" Received: from rcdn-core-3.cisco.com ([173.37.93.154]) by alln-iport-2.cisco.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 06 Jul 2017 20:19:36 +0000 Received: from cisco.com (savbu-usnic-a.cisco.com [10.193.184.48]) by rcdn-core-3.cisco.com (8.14.5/8.14.5) with ESMTP id v66KJarm020447; Thu, 6 Jul 2017 20:19:36 GMT Received: by cisco.com (Postfix, from userid 392789) id 0E4613FAAF54; Thu, 6 Jul 2017 13:19:36 -0700 (PDT) From: John Daley To: johnda888@gmail.com Cc: John Daley , stable@dpdk.org Date: Thu, 6 Jul 2017 13:19:23 -0700 Message-Id: <20170706201923.25913-1-johndale@cisco.com> X-Mailer: git-send-email 2.12.0 Subject: [dpdk-stable] [PATCH] 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: Thu, 06 Jul 2017 20:19:38 -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 49b36555b..162e9c2f2 100644 --- a/drivers/net/enic/base/vnic_dev.c +++ b/drivers/net/enic/base/vnic_dev.c @@ -1063,7 +1063,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); } } @@ -1072,7 +1072,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 da8fec2d0..85a46abe4 100644 --- a/drivers/net/enic/enic_ethdev.c +++ b/drivers/net/enic/enic_ethdev.c @@ -196,6 +196,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, @@ -310,6 +313,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. */ @@ -378,6 +385,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) { @@ -404,6 +414,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); } @@ -416,6 +429,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)); @@ -513,7 +529,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); } @@ -522,6 +542,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); @@ -531,6 +554,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); @@ -540,6 +566,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); @@ -551,6 +580,9 @@ static int 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(); return enic_set_mac_address(enic, mac_addr->addr_bytes); } @@ -559,6 +591,9 @@ static void enicpmd_remove_mac_addr(struct rte_eth_dev *eth_dev, uint32_t index) { struct enic *enic = pmd_priv(eth_dev); + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return; + ENICPMD_FUNC_TRACE(); enic_del_mac_address(enic, index); } diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c index 40dbec7fa..64d3b636d 100644 --- a/drivers/net/enic/enic_main.c +++ b/drivers/net/enic/enic_main.c @@ -1180,6 +1180,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; + if (new_mtu > enic->max_mtu) { dev_err(enic, "MTU not updated: requested (%u) greater than max (%u)\n", @@ -1331,6 +1334,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