From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 0380647065 for ; Mon, 22 Dec 2025 07:17:01 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E533040264; Mon, 22 Dec 2025 07:17:00 +0100 (CET) Received: from PA4PR04CU001.outbound.protection.outlook.com (mail-francecentralazon11013066.outbound.protection.outlook.com [40.107.162.66]) by mails.dpdk.org (Postfix) with ESMTP id B258140264 for ; Mon, 22 Dec 2025 07:16:58 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=b33lh2/V4iUpEsQKgqA9Z0dF7ngJwDJq9g1ZvLU3vs9jAy+TGcEHt1La4XNUsJqL8S1tA+P+WzHAMlmPgIJ7ToYqBHJPLL2rG6o8CXdkbz+z0XKY0QOMcwhhUCmyurPD8zmCsUz4Zh1IsE07OXpxGs1++LFj5lr2wnJjGSGy1t1A5u2rAXBav7uNxvHz2imR35rmYjRuMC5Qx6kg6zGohmS6YvS+Qcqwzgf/s7cvsYqTkCtfwXED/dxKDYOoRH6bWJ2Ww4xfiMu0xcdWj+uF9LEXk/waM4BUC1gVajzbv/tDBWsh1z5Hl7cIoYVDI9SBCBaZMVFTTTgz5wvY7OIucg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=52nKyQet55+jsifFHY87L2THWVJUpy0gmgs6B7dY9pU=; b=gLzz96kFwqN6MFExIfJ2Q9jFaxJpx4jaxzsyOghiATivRrtCCTfSJ6J5igkMeFQQRxxm0FBYWfz2F8Wo/pB5Liui83bEfwK4ArCgas93A6/xBm6vKSn2EljgpFAN14iFBL6gzbDhc6RSEN+kk2V7jdeVCxx7+fXEUBMwzNxqoc2hpQOCR+EYsa1YngCr0jCFLwjXV6GO+T/q3mnb9cEVD0R5G6fkK/hk/6FdptXHqe6JYYSdvrEoxdAvrP7vsa58mtVZ7IJsQ4wq4IMhSajfGfO2hLw+46hw1T1ZJ0svvGnxL6NN3buDKrfs0hEE6WusvH78/+NQlHaqO5CJpS7eew== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=52nKyQet55+jsifFHY87L2THWVJUpy0gmgs6B7dY9pU=; b=VaMKz6ZCNz+oOeu3sPBqJoJa0Kz0q8KcQ4gMQxDSsH3Mcodi6wnDAYcqTvNqfYsQJlUuQ5zCFd1JLzD8N4gFvWXfpsIRS62pgweWt9deNvi2jM1UOU35e7H1CQPDhVwu2QEsaga63caL1EqkvvljRZ8JaASU+AHD33gYtC/vcjNknnQbNLyqbc2udZ0l5zqhcY/udJ7pE0XidwYNGiV9avCCi4dcbz9ma09yUnsIsELjeL/rdSUtnujcEX5WDkyRHZVnVGBRliIUS50inSqgeCr5YH74XHJL6WDAKjzQ51IsUeP3Eir4BWLqfoJWSxTs/j/avKMN/eiP9mGvV/NLOw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AS8PR04MB8198.eurprd04.prod.outlook.com (2603:10a6:20b:3b0::14) by DU0PR04MB9300.eurprd04.prod.outlook.com (2603:10a6:10:357::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9434.11; Mon, 22 Dec 2025 06:16:57 +0000 Received: from AS8PR04MB8198.eurprd04.prod.outlook.com ([fe80::c52d:9751:36a3:78f9]) by AS8PR04MB8198.eurprd04.prod.outlook.com ([fe80::c52d:9751:36a3:78f9%6]) with mapi id 15.20.9434.009; Mon, 22 Dec 2025 06:16:57 +0000 From: Gagandeep Singh To: stable@dpdk.org Cc: hemant.agrawal@nxp.com, Gagandeep Singh Subject: [PATCH 23.11] bus/dpaa: improve cleanup Date: Mon, 22 Dec 2025 11:46:07 +0530 Message-Id: <20251222061607.2685380-1-g.singh@nxp.com> X-Mailer: git-send-email 2.25.1 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: SG2PR03CA0131.apcprd03.prod.outlook.com (2603:1096:4:91::35) To AS8PR04MB8198.eurprd04.prod.outlook.com (2603:10a6:20b:3b0::14) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8PR04MB8198:EE_|DU0PR04MB9300:EE_ X-MS-Office365-Filtering-Correlation-Id: 16c8d5fb-64e0-4ded-be9a-08de4121b589 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|19092799006|1800799024|376014|52116014|38350700014|7053199007; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?jHaWGtCUYOzkkRx6rnunI98IxnOkrc8+4Z7pWO7+iebjLIoZV4651idRISpr?= =?us-ascii?Q?w7KlzN0Y2gsMHL/RnwnRe62A5DMaVAqmggIqiiFiUjjKRPwzT2AXndWF00CR?= =?us-ascii?Q?B0XVzc8bAUHeT5T4+I5UdTZidP5a3RR6bc4CRHndWNxOd6FXyXYkXwJ/pzcN?= =?us-ascii?Q?Ggyw9//7WFdbelWRJqYDR9McIoP/JOmB3E6wzig6tCnXMYrIxZv7/P/KLab8?= =?us-ascii?Q?+JAOe2j332lDcK5uxwdCnhN+Xp/scoOi9Os1bWnRXsDw+0NmZ5ODmCTJALE3?= =?us-ascii?Q?sUB6Cu3MjEIhpXRavWUmZwajnleM2jrIudNH2a4y6R0KGi/zLunjIrQoGy77?= =?us-ascii?Q?WFEcfz5hReoMvp64J47r/+xjnfrS5E6OW9WxFuwTO48QTVS2GHvM8XDkVNkw?= =?us-ascii?Q?nPoMAWqBsPbKDyj+7lvN/yXPbo94kdwxT/qta4VLnAjW4s6ZfG2Un/MPMLCe?= =?us-ascii?Q?5Xlqz3gHuoYNCASpD92ExWMHR/tDNzaBgV1u2AQ1nClf8/1CsvuBeThUXLN+?= =?us-ascii?Q?8oMih32YR/mwbi2Q5ttsFirWPo8e9yqQp2LT2JeKa7C9NEl9dcqjZ4ktDpBM?= =?us-ascii?Q?W2cnSu2RJfI1+/IySwGPBqr2XFG03dx73y7fhO9/m/ynTvJho/O8dkqXvdLk?= =?us-ascii?Q?NPOznufZD8a/F1GETp9/M9YiJX6YHVs92k56i9un7r08O6sr1WyOLmY4IgJV?= =?us-ascii?Q?gnaulNuKMmYz0tgASf/SV/rd6EMdc8+3nOPeUUg3XtLgMCBMkT+0ng41iti9?= =?us-ascii?Q?wu+t865jC3CwPZ/agp8+b2k7GFZc36jR6YRuLJfakQz1esvSKbqd3hvzSHzG?= =?us-ascii?Q?O5sXQoHaeXO/K9MDbMlGijRtCCZnV8hFfAqTM2S0HsrwltGa9B9kXpiotlYI?= =?us-ascii?Q?BZTm+cR9Rmg8DoQOsG0vJKQNSejAJ7JnoQK4MPiJZMgt9cA6nsMN8qxpO84R?= =?us-ascii?Q?zMY4wUGnwAWQwj2jFWgW8n77iwiUJM7pgqu1x42J582v/HW6rX6ossstN5Mg?= =?us-ascii?Q?eZR/ygXixXIDMqaMNNt69Z92n5i0jjsIbmq/WQH2nm7qTEBcv9zBgfao+PEn?= =?us-ascii?Q?eC9PClE/f4g0HvvgwwNc0Cre8ZWeXsoV1G+Y4fuQqOdUwXs90HDWVFwO0nRE?= =?us-ascii?Q?s+cLqa7Hh5zaZht39ptkmSWaUopLcSKkngTEVRaygD+1Ko7NzCewXox7x20B?= =?us-ascii?Q?dg0UX7udPLbuLBe+gf2YuJmYoX6+5E9FS1ipK1HePLBiL/N3ZnjZcyBpaLfc?= =?us-ascii?Q?xwIsJ1Id4XqcNV8TNR5eKF8U2urhF0n52ntVU8qafoCq2WJvOPcFgjPENEm6?= =?us-ascii?Q?2NRwcf2YE/HjZaf0IZib9DxmA9zuALz4FC3Ei7Zp7PdxwTiSG0cjQXHJ3TLj?= =?us-ascii?Q?YUJJtVsN9hbY5SZBTlgZjRGVojDfbbwev5EJpnrnDbiloaTb0P2qgBJZKqaG?= =?us-ascii?Q?vuXu7hCUdraxA5v63zDhYxUyn3A3HaVA/jHMDTFuRWi+2AWBaZKHY8sHyBOe?= =?us-ascii?Q?79ZUftN/r9tStMTWS0+UhF/7cdQj8/Vc1Igx?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:AS8PR04MB8198.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(19092799006)(1800799024)(376014)(52116014)(38350700014)(7053199007); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?0FNxDgGDB7XqzPknVua0Z7RhRaY9g+OnGFfwqEfHMVBqXmTNCkVztK8dbGpc?= =?us-ascii?Q?x78oQ4qCZDowGZV41qR5mp+inSzwmfUc3hoL3hAMNA+1fsYAovdPKKFlCHg5?= =?us-ascii?Q?oBTiXkdm+SAmqXHUujUb+lsTWnw1fZdoNC4PDOLrW7kwlRi4u17kUnweIE62?= =?us-ascii?Q?zW5IqQC+0un2+URMeCFLm/OSUG2FLmwNy5x1biYlbDRLTPFsqRB5GrPI3Vt3?= =?us-ascii?Q?CbQbqAj7xCZMbiXZUp0SX/frpjG9EMD61OucizCxPVWdYLdrZpMxoKpQaLAP?= =?us-ascii?Q?2DkDFwxs/UdT4U9fotf8GWreJjMMMjMpA3NcsWb21ACcL8QJCDV6JY6+DwUG?= =?us-ascii?Q?POG8n5GA4kh3XfNQ4lfzBqv/rkafvVpbcpp8UDDS+hihmSKGMWDle3W4cR7g?= =?us-ascii?Q?o61wLEX6GSl3b9AYrp37j7FQdKIOPjMJzpPdHKw615s0e98hgUbD63QNInkw?= =?us-ascii?Q?BPS10KKgW7txuPYpKZX08UWkMcU0nd+oeNNy8BrRpYe6+KRZ062cb5AVqIeW?= =?us-ascii?Q?E8hUQfw4UOQtWeGaRwPreA/tUwP9DrLUyZZDjCluaC67HJZ7gZb4YJxVtcvi?= =?us-ascii?Q?5MpBSNskPrnisGAND/Dss6Ocn13NrI9hsmKjKijPQcchTzui6iaPCSPGAi/I?= =?us-ascii?Q?qLBcVXyM7iRff+NlqARFtqOvocL9ojVnKHHAOkbPdDbIs3w9JILFMPEAGMLG?= =?us-ascii?Q?eWgG0J6GvHq/j/ZVNj2JzloM/FESJrf9aIXJMbbqO8kYGgOHD3GUyMzuaQLn?= =?us-ascii?Q?LwThcCaB4JK56J2fWlFXFPaBVcJtSx/Q3+0Xp0SLMqDdQ5A5/YHzFF9+/M3i?= =?us-ascii?Q?JCmMAzXDilZnIrUGId0IqaF86R9CdVOKzVy1jBAM7mBd/JlAva39v2DwJFd9?= =?us-ascii?Q?NVmI2gYQUClj/PnUCzgz0kiZuclBNYlMegx+uaAVXJpPnsa1SofGQRDYEaiO?= =?us-ascii?Q?fOJ85r8v+qpVKDKnTwaimv61xiE+J0BAUEb07bmICmqI3AksFmdBouFlOAKT?= =?us-ascii?Q?T5SHDPTWx9vJx9BLkOuGW1MXgvymXA6lbNP6qejn1huwceAifDpsJ45IKsPh?= =?us-ascii?Q?wg4bufMkrFv61htwBlQAOvxgDXIGluavwpBZevRKctvJc9JsdNWzg/t8hEBY?= =?us-ascii?Q?h0DllXrZnLmQZmcXK1wPe8G1cT9GxatTSAfD0ygPrsgjAvXuD+p3nrX8SRJb?= =?us-ascii?Q?oUXkpGlb/CJ6C3jqk/4uCU6lOlIwRWcemxz+CxZPmrNuyQOHloIZDIgILmY5?= =?us-ascii?Q?gnvODYHdRPH36gKRo5Jp3ikkXFPHqhuUGyVtXXSzoQTP/s6LgMec2KDessdd?= =?us-ascii?Q?YY1FnCUN7hQiGHbOZkAseaXePHfrrvucwrT/VePt+a5lE6cURqmq/uHmPThX?= =?us-ascii?Q?dkVKS0cn1Cvt8Xwy37Jb0Gpf+VyG9EZ7zh+7mQWcJFvcqno312ti8AqTCj3N?= =?us-ascii?Q?YriPljP5FBBxXOwQyALFPmTy5KA0amC84DjYMxAQz5fLUtHNu0kRELfc9uSY?= =?us-ascii?Q?rYGET3pdGynEbU+N9K47WBiDBGmAjqKiFUlXc8wxMcnheU1UGFl8RWE94f7Z?= =?us-ascii?Q?Bkh4mymnVO7hxNSC3xKBSbqpM1OiGnyCZlJgBUnHS+o9VNCdgftOx/VFFhUu?= =?us-ascii?Q?itmu9KSmc7UlwouT4DxnX8vsY/ttdOv7F7YveC9/EWXXyHkSC97pQJ76uqOi?= =?us-ascii?Q?XZjlO7iIjyKDyMb2mKi1CoH+Aat73xxkQI7Naf3cOKTPY8qH?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 16c8d5fb-64e0-4ded-be9a-08de4121b589 X-MS-Exchange-CrossTenant-AuthSource: AS8PR04MB8198.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Dec 2025 06:16:57.2572 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 34zLirF+dByi1FGAX7FR7hOXgWJ+SUSa9CLI+lbl8wJwzZkmE+vAxlpLTMDawaVP X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR04MB9300 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org [ upstream commit 78ea4b4fcb52f786aeb1c470c730ea3e54e239d5 ] This patch addresses DPAA driver issues with the introduction of rte_eal_cleanup, which caused driver-specific destructors to fail due to memory cleanup. To resolve this, we remove the driver destructor and relocate the code to the bus cleanup function. So, this patch also implements DPAA bus cleanup. Fixes: ff9e112d7870 ("net/dpaa: add NXP DPAA PMD driver skeleton") Cc: stable@dpdk.org Signed-off-by: Gagandeep Singh --- drivers/bus/dpaa/base/qbman/qman_driver.c | 2 - drivers/bus/dpaa/dpaa_bus.c | 58 ++++++ drivers/net/dpaa/dpaa_ethdev.c | 234 +++++++++++++++------- 3 files changed, 219 insertions(+), 75 deletions(-) diff --git a/drivers/bus/dpaa/base/qbman/qman_driver.c b/drivers/bus/dpaa/base/qbman/qman_driver.c index 7a129a2d86..cdce6b777b 100644 --- a/drivers/bus/dpaa/base/qbman/qman_driver.c +++ b/drivers/bus/dpaa/base/qbman/qman_driver.c @@ -228,8 +228,6 @@ int fsl_qman_fq_portal_destroy(struct qman_portal *qp) if (ret) pr_err("qman_free_global_portal() (%d)\n", ret); - kfree(qp); - process_portal_irq_unmap(cfg->irq); addr.cena = cfg->addr_virt[DPAA_PORTAL_CE]; diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c index aaf2a5f43e..2f718ad7f1 100644 --- a/drivers/bus/dpaa/dpaa_bus.c +++ b/drivers/bus/dpaa/dpaa_bus.c @@ -43,6 +43,7 @@ #include #include +#define RTE_PRIORITY_102 102 struct rte_dpaa_bus { struct rte_bus bus; TAILQ_HEAD(, rte_dpaa_device) device_list; @@ -56,6 +57,9 @@ struct netcfg_info *dpaa_netcfg; /* define a variable to hold the portal_key, once created.*/ static pthread_key_t dpaa_portal_key; +/* dpaa lcore specific portals */ +struct dpaa_portal *dpaa_portals[RTE_MAX_LCORE] = {NULL}; +static int dpaa_bus_global_init; unsigned int dpaa_svr_family; @@ -377,6 +381,7 @@ int rte_dpaa_portal_init(void *arg) return ret; } + dpaa_portals[lcore] = DPAA_PER_LCORE_PORTAL; DPAA_BUS_LOG(DEBUG, "QMAN thread initialized"); @@ -434,6 +439,8 @@ dpaa_portal_finish(void *arg) rte_free(dpaa_io_portal); dpaa_io_portal = NULL; DPAA_PER_LCORE_PORTAL = NULL; + dpaa_portals[rte_lcore_id()] = NULL; + DPAA_BUS_DEBUG("Portal cleanup done for lcore = %d", rte_lcore_id()); } static int @@ -712,6 +719,7 @@ rte_dpaa_bus_probe(void) break; } } + dpaa_bus_global_init = 1; return 0; } @@ -819,6 +827,55 @@ dpaa_bus_dev_iterate(const void *start, const char *str, return NULL; } +static int +dpaa_bus_cleanup(void) +{ + struct rte_dpaa_device *dev, *tmp_dev; + + BUS_INIT_FUNC_TRACE(); + RTE_TAILQ_FOREACH_SAFE(dev, &rte_dpaa_bus.device_list, next, tmp_dev) { + struct rte_dpaa_driver *drv = dev->driver; + int ret = 0; + + if (!rte_dev_is_probed(&dev->device)) + continue; + if (!drv || !drv->remove) + continue; + ret = drv->remove(dev); + if (ret < 0) { + rte_errno = errno; + return -1; + } + dev->driver = NULL; + dev->device.driver = NULL; + } + dpaa_portal_finish((void *)DPAA_PER_LCORE_PORTAL); + dpaa_bus_global_init = 0; + DPAA_BUS_DEBUG("Bus cleanup done"); + + return 0; +} + +/* Adding destructor for double check in case non-gracefully + * exit. + */ +RTE_FINI_PRIO(dpaa_cleanup, 102) +{ + unsigned int lcore_id; + + if (!dpaa_bus_global_init) + return; + + /* cleanup portals in case non-graceful exit */ + RTE_LCORE_FOREACH_WORKER(lcore_id) { + /* Check for non zero id */ + dpaa_portal_finish((void *)dpaa_portals[lcore_id]); + } + dpaa_portal_finish((void *)DPAA_PER_LCORE_PORTAL); + dpaa_bus_global_init = 0; + DPAA_BUS_DEBUG("Worker thread clean up done"); +} + static struct rte_dpaa_bus rte_dpaa_bus = { .bus = { .scan = rte_dpaa_bus_scan, @@ -829,6 +886,7 @@ static struct rte_dpaa_bus rte_dpaa_bus = { .plug = dpaa_bus_plug, .unplug = dpaa_bus_unplug, .dev_iterate = dpaa_bus_dev_iterate, + .cleanup = dpaa_bus_cleanup, }, .device_list = TAILQ_HEAD_INITIALIZER(rte_dpaa_bus.device_list), .driver_list = TAILQ_HEAD_INITIALIZER(rte_dpaa_bus.driver_list), diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c index 6fdbe80334..64f51b3517 100644 --- a/drivers/net/dpaa/dpaa_ethdev.c +++ b/drivers/net/dpaa/dpaa_ethdev.c @@ -52,6 +52,7 @@ #define CHECK_INTERVAL 100 /* 100ms */ #define MAX_REPEAT_TIME 90 /* 9s (90 * 100ms) in total */ +#define RTE_PRIORITY_103 103 /* Supported Rx offloads */ static uint64_t dev_rx_offloads_sup = @@ -287,10 +288,11 @@ dpaa_eth_dev_configure(struct rte_eth_dev *dev) } if (!(default_q || fmc_q)) { - if (dpaa_fm_config(dev, - eth_conf->rx_adv_conf.rss_conf.rss_hf)) { + ret = dpaa_fm_config(dev, + eth_conf->rx_adv_conf.rss_conf.rss_hf); + if (ret) { dpaa_write_fm_config_to_file(); - DPAA_PMD_ERR("FM port configuration: Failed\n"); + DPAA_PMD_ERR("FM port configuration: Failed(%d)", ret); return -1; } dpaa_write_fm_config_to_file(); @@ -481,6 +483,7 @@ static int dpaa_eth_dev_close(struct rte_eth_dev *dev) struct rte_intr_handle *intr_handle; struct rte_eth_link *link = &dev->data->dev_link; struct dpaa_if *dpaa_intf = dev->data->dev_private; + struct qman_fq *fq; int loop; int ret; @@ -490,14 +493,17 @@ static int dpaa_eth_dev_close(struct rte_eth_dev *dev) return 0; if (!dpaa_intf) { - DPAA_PMD_WARN("Already closed or not started"); - return -1; + DPAA_PMD_DEBUG("Already closed or not started"); + return -ENOENT; } /* DPAA FM deconfig */ if (!(default_q || fmc_q)) { - if (dpaa_fm_deconfig(dpaa_intf, dev->process_private)) - DPAA_PMD_WARN("DPAA FM deconfig failed\n"); + ret = dpaa_fm_deconfig(dpaa_intf, dev->process_private); + if (ret) { + DPAA_PMD_WARN("%s: FM deconfig failed(%d)", + dev->data->name, ret); + } } dpaa_dev = container_of(rdev, struct rte_dpaa_device, device); @@ -505,17 +511,33 @@ static int dpaa_eth_dev_close(struct rte_eth_dev *dev) __fif = container_of(fif, struct __fman_if, __if); ret = dpaa_eth_dev_stop(dev); + if (ret) { + DPAA_PMD_WARN("%s: stop device failed(%d)", + dev->data->name, ret); + } /* Reset link to autoneg */ - if (link->link_status && !link->link_autoneg) - dpaa_restart_link_autoneg(__fif->node_name); + if (link->link_status && !link->link_autoneg) { + ret = dpaa_restart_link_autoneg(__fif->node_name); + if (ret) { + DPAA_PMD_WARN("%s: restart link failed(%d)", + dev->data->name, ret); + } + } if (intr_handle && rte_intr_fd_get(intr_handle) && dev->data->dev_conf.intr_conf.lsc != 0) { - dpaa_intr_disable(__fif->node_name); - rte_intr_callback_unregister(intr_handle, - dpaa_interrupt_handler, - (void *)dev); + ret = dpaa_intr_disable(__fif->node_name); + if (ret) { + DPAA_PMD_WARN("%s: disable interrupt failed(%d)", + dev->data->name, ret); + } + ret = rte_intr_callback_unregister(intr_handle, + dpaa_interrupt_handler, (void *)dev); + if (ret) { + DPAA_PMD_WARN("%s: unregister interrupt failed(%d)", + dev->data->name, ret); + } } /* release configuration memory */ @@ -523,26 +545,63 @@ static int dpaa_eth_dev_close(struct rte_eth_dev *dev) /* Release RX congestion Groups */ if (dpaa_intf->cgr_rx) { - for (loop = 0; loop < dpaa_intf->nb_rx_queues; loop++) - qman_delete_cgr(&dpaa_intf->cgr_rx[loop]); + for (loop = 0; loop < dpaa_intf->nb_rx_queues; loop++) { + ret = qman_delete_cgr(&dpaa_intf->cgr_rx[loop]); + if (ret) { + DPAA_PMD_WARN("%s: delete rxq%d's cgr err(%d)", + dev->data->name, loop, ret); + } + } } rte_free(dpaa_intf->cgr_rx); dpaa_intf->cgr_rx = NULL; /* Release TX congestion Groups */ if (dpaa_intf->cgr_tx) { - for (loop = 0; loop < MAX_DPAA_CORES; loop++) - qman_delete_cgr(&dpaa_intf->cgr_tx[loop]); + for (loop = 0; loop < MAX_DPAA_CORES; loop++) { + ret = qman_delete_cgr(&dpaa_intf->cgr_tx[loop]); + if (ret) { + DPAA_PMD_WARN("%s: delete txq%d's cgr err(%d)", + dev->data->name, loop, ret); + } + } rte_free(dpaa_intf->cgr_tx); dpaa_intf->cgr_tx = NULL; } + /* Freeing queue specific portals */ + for (loop = 0; loop < dpaa_intf->nb_rx_queues; loop++) { + if (!dpaa_intf->rx_queues) + break; + + fq = &dpaa_intf->rx_queues[loop]; + if (fq->qp_initialized) { + rte_dpaa_portal_fq_close(fq); + fq->qp_initialized = 0; + } + } + rte_free(dpaa_intf->rx_queues); dpaa_intf->rx_queues = NULL; rte_free(dpaa_intf->tx_queues); dpaa_intf->tx_queues = NULL; + if (dpaa_intf->port_handle) { + ret = dpaa_fm_deconfig(dpaa_intf, fif); + if (ret) { + DPAA_PMD_WARN("%s: FM deconfig failed(%d)", + dev->data->name, ret); + } + } + if (fif->num_profiles) { + ret = dpaa_port_vsp_cleanup(dpaa_intf, fif); + if (ret) { + DPAA_PMD_WARN("%s: cleanup VSP failed(%d)", + dev->data->name, ret); + } + } + return ret; } @@ -1363,6 +1422,8 @@ dpaa_flow_ctrl_set(struct rte_eth_dev *dev, { struct dpaa_if *dpaa_intf = dev->data->dev_private; struct rte_eth_fc_conf *net_fc; + struct fman_if *fm_if = dev->process_private; + int ret; PMD_INIT_FUNC_TRACE(); @@ -1381,19 +1442,31 @@ dpaa_flow_ctrl_set(struct rte_eth_dev *dev, return -EINVAL; } - if (fc_conf->mode == RTE_ETH_FC_NONE) { + if (fc_conf->mode == RTE_ETH_FC_NONE) return 0; - } else if (fc_conf->mode == RTE_ETH_FC_TX_PAUSE || - fc_conf->mode == RTE_ETH_FC_FULL) { - fman_if_set_fc_threshold(dev->process_private, + + if (fc_conf->mode != RTE_ETH_FC_TX_PAUSE && + fc_conf->mode != RTE_ETH_FC_FULL) + goto save_fc; + + ret = fman_if_set_fc_threshold(fm_if, fc_conf->high_water, fc_conf->low_water, dpaa_intf->bp_info->bpid); - if (fc_conf->pause_time) - fman_if_set_fc_quanta(dev->process_private, - fc_conf->pause_time); + if (ret) { + DPAA_PMD_ERR("Set %s's fc on bpid(%d) err(%d)", + dev->data->name, dpaa_intf->bp_info->bpid, + ret); + } + if (fc_conf->pause_time) { + ret = fman_if_set_fc_quanta(fm_if, fc_conf->pause_time); + if (ret) { + DPAA_PMD_ERR("Set %s's fc pause time err(%d)", + dev->data->name, ret); + } } +save_fc: /* Save the information in dpaa device */ net_fc->pause_time = fc_conf->pause_time; net_fc->high_water = fc_conf->high_water; @@ -1486,13 +1559,15 @@ dpaa_dev_rss_hash_update(struct rte_eth_dev *dev, { struct rte_eth_dev_data *data = dev->data; struct rte_eth_conf *eth_conf = &data->dev_conf; + int ret; PMD_INIT_FUNC_TRACE(); if (!(default_q || fmc_q)) { - if (dpaa_fm_config(dev, rss_conf->rss_hf)) { - DPAA_PMD_ERR("FM port configuration: Failed\n"); - return -1; + ret = dpaa_fm_config(dev, rss_conf->rss_hf); + if (ret) { + DPAA_PMD_ERR("FM port configuration: Failed(%d)", ret); + return ret; } eth_conf->rx_adv_conf.rss_conf.rss_hf = rss_conf->rss_hf; } else { @@ -1954,8 +2029,8 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev) /* Each device can not have more than DPAA_MAX_NUM_PCD_QUEUES RX * queues. */ - if (num_rx_fqs < 0 || num_rx_fqs > DPAA_MAX_NUM_PCD_QUEUES) { - DPAA_PMD_ERR("Invalid number of RX queues\n"); + if (num_rx_fqs > DPAA_MAX_NUM_PCD_QUEUES) { + DPAA_PMD_ERR("Invalid number of RX queues(%d)", num_rx_fqs); return -EINVAL; } @@ -2197,8 +2272,8 @@ rte_dpaa_probe(struct rte_dpaa_driver *dpaa_drv, eth_dev->dev_ops = &dpaa_devops; ret = dpaa_dev_init_secondary(eth_dev); - if (ret != 0) { - RTE_LOG(ERR, PMD, "secondary dev init failed\n"); + if (ret) { + DPAA_PMD_ERR("secondary dev init failed(%d)", ret); return ret; } @@ -2213,9 +2288,10 @@ rte_dpaa_probe(struct rte_dpaa_driver *dpaa_drv, } if (!(default_q || fmc_q)) { - if (dpaa_fm_init()) { - DPAA_PMD_ERR("FM init failed\n"); - return -1; + ret = dpaa_fm_init(); + if (ret) { + DPAA_PMD_ERR("FM init failed(%d)", ret); + return ret; } } @@ -2290,59 +2366,71 @@ rte_dpaa_probe(struct rte_dpaa_driver *dpaa_drv, return diag; } -static int -rte_dpaa_remove(struct rte_dpaa_device *dpaa_dev) +/* Adding destructor for double check in case non-gracefully + * exit. + */ +RTE_FINI_PRIO(dpaa_finish, 103) { - struct rte_eth_dev *eth_dev; - int ret; + struct dpaa_if *dpaa_intf; + int loop; + struct qman_fq *fq; + uint16_t portid; + struct rte_eth_dev *dev; PMD_INIT_FUNC_TRACE(); - eth_dev = dpaa_dev->eth_dev; - dpaa_eth_dev_close(eth_dev); - dpaa_valid_dev--; - if (!dpaa_valid_dev) - rte_mempool_free(dpaa_tx_sg_pool); - ret = rte_eth_dev_release_port(eth_dev); - - return ret; -} - -static void __attribute__((destructor(102))) dpaa_finish(void) -{ /* For secondary, primary will do all the cleanup */ if (rte_eal_process_type() != RTE_PROC_PRIMARY) return; + if (!is_global_init) + return; + if (!(default_q || fmc_q)) { - unsigned int i; - - for (i = 0; i < RTE_MAX_ETHPORTS; i++) { - if (rte_eth_devices[i].dev_ops == &dpaa_devops) { - struct rte_eth_dev *dev = &rte_eth_devices[i]; - struct dpaa_if *dpaa_intf = - dev->data->dev_private; - struct fman_if *fif = - dev->process_private; - if (dpaa_intf->port_handle) - if (dpaa_fm_deconfig(dpaa_intf, fif)) - DPAA_PMD_WARN("DPAA FM " - "deconfig failed\n"); - if (fif->num_profiles) { - if (dpaa_port_vsp_cleanup(dpaa_intf, - fif)) - DPAA_PMD_WARN("DPAA FM vsp cleanup failed\n"); - } + if (dpaa_fm_term()) + DPAA_PMD_WARN("DPAA FM term failed"); + + DPAA_PMD_INFO("DPAA fman cleaned up"); + } + + RTE_ETH_FOREACH_DEV(portid) { + dev = &rte_eth_devices[portid]; + if (strcmp(dev->device->driver->name, + rte_dpaa_pmd.driver.name)) + continue; + dpaa_intf = dev->data->dev_private; + /* Freeing queue specific portals */ + for (loop = 0; loop < dpaa_intf->nb_rx_queues; loop++) { + if (!dpaa_intf->rx_queues) + break; + + fq = &dpaa_intf->rx_queues[loop]; + if (fq->qp_initialized) { + rte_dpaa_portal_fq_close(fq); + fq->qp_initialized = 0; } } - if (is_global_init) - if (dpaa_fm_term()) - DPAA_PMD_WARN("DPAA FM term failed\n"); + } + is_global_init = 0; +} + +static int +rte_dpaa_remove(struct rte_dpaa_device *dpaa_dev) +{ + struct rte_eth_dev *eth_dev; + int ret; - is_global_init = 0; + PMD_INIT_FUNC_TRACE(); - DPAA_PMD_INFO("DPAA fman cleaned up"); + eth_dev = dpaa_dev->eth_dev; + dpaa_eth_dev_close(eth_dev); + ret = rte_eth_dev_release_port(eth_dev); + dpaa_valid_dev--; + if (!dpaa_valid_dev) { + rte_mempool_free(dpaa_tx_sg_pool); + dpaa_finish(); } + return ret; } static struct rte_dpaa_driver rte_dpaa_pmd = { -- 2.25.1