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 BD56E46C0D for ; Fri, 25 Jul 2025 14:55:41 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9D2E840144; Fri, 25 Jul 2025 14:55:41 +0200 (CEST) Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) by mails.dpdk.org (Postfix) with ESMTP id 6D19640144 for ; Fri, 25 Jul 2025 14:55:40 +0200 (CEST) Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-2349f096605so24251805ad.3 for ; Fri, 25 Jul 2025 05:55:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=uetpeshawar-edu-pk.20230601.gappssmtp.com; s=20230601; t=1753448139; x=1754052939; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=6pPxKaBDqAP3QahJb5MsRlvGdSd85f5P3UVuLDjBnMo=; b=PeiXiw8x9flLIBKZqEoWQEcSct0+bcBgqyfm2noWYpdLqLhWB6PnCzraKLIwyHqDsx arGAJr6vVcqAbEbSJkzvSS7E8Ab6kOKTunM/IRXnK9+y9EsFsL5bo0Vd9jvKOQcHHKB8 YkTMGzUJ0pDIag60Il+RIiu1wxeEUkJ83tR337sEFbQXourrBz62abk0I7cVt/5yPeyO eCq2oJM0nE3n3bMAPmvgUz6u9d36phoeuHCntr0p8x9dusNCw9st0/ARVohJraLMiv9j La2AheLbWcHLyb6tpiECGcIYmTG3ictTHJfw42YdP5vNhWk5JwbHyuaJGqB+k1Gru1qm rBvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753448139; x=1754052939; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=6pPxKaBDqAP3QahJb5MsRlvGdSd85f5P3UVuLDjBnMo=; b=uTPoedGgnJjgd8yFVyuCczdJyGMoh6UiEtVbDkQ1XGY0rcKcKTZH11bLIGVj69IsUB cZNZL42iTPB0d6x6lKUuS+fUr2/VhRNTrGNia4UbthOMGkeqYgcXBQj5OrjgRTW4wuzm Gn6SlLbyJ9wOPny55M18JUPGK4wU5TuZSO6BrWwVe4vXK1gIRVoIPu81inXeWY4yCJS1 l2Ca3BozFN+pJP9ff0sAf/qPbW4DRgyxe878B4N9Vf2XIFRaqxzDjpnNzFuJFp7yjolQ eRP26BG31gKDaqnAk8OfLn81cPfYb07DJxVmwk3ccSLpr4tvO35GQMWHfAYrlMEchtdR LcEA== X-Forwarded-Encrypted: i=1; AJvYcCXQVXQMUPPEXPTvocfuQPKNKYmueAGaQHRaR+b2XR60hHa+v4MFMZGIrH3RsXltFBXueEmCEwQ=@dpdk.org X-Gm-Message-State: AOJu0YzM2ALdf/W9G+ZWpuKwv/bBhdU0yGXtH2Kf3xOyWOHk1mLmTRd0 6hNz0r6l1/GPUUHcMKmzsZEVKS416DyFJjLqu40j3k1gzKHWFpKiWY7d56BQHxQ5aPA= X-Gm-Gg: ASbGnctzT4lhPZmJ20f+DwYR7WJIQnt1wYh0tFjBc4FHiop/uqrv6t5YZGhfitUR/ud OHX0iYQUcVmJVwBPAfjfXF5yNjUJDkSt6QaeRqSJXN43n8RxWPG54vDMjZ1dy4sGwNSNpPgtjhK Z5Q774AeG/Cya1NhkMWcL/TUUjj1H8m1YSr0uKlAt3zA6ya/IRh8jK918JfuZMw72Ra9ApyqU8C tbBleJ1KEGVgOyAZ4GLj5ljxlj5e1EuBAGf2zo0kHeEWGJkfIye7K42/hikjVNa9NlQYvaYiP/d 8FXVUpdKgACIJQ2MIaW6BlvNP/NTa60UaEl4TB8yOxNtvFwSQBR9TD+SeV1Dsz4Xl93AoWqi2+J amzHe9t4QME1zkfI4F9VTDcTeG0F7uHC7Y8EU0mCwsfCM3ZaS X-Google-Smtp-Source: AGHT+IED3kIwy5imDgwiipTo1eADMcF4dz3if/RrnmPtpmjcppmM9tQv7fh+V2dNUu3pJ1BML9skpQ== X-Received: by 2002:a17:902:e84d:b0:235:1966:93a9 with SMTP id d9443c01a7336-23fb309bc81mr30555025ad.3.1753448139345; Fri, 25 Jul 2025 05:55:39 -0700 (PDT) Received: from localhost.localdomain ([64.62.143.197]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-23fa49167ffsm36626845ad.204.2025.07.25.05.55.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Jul 2025 05:55:38 -0700 (PDT) From: Khadem Ullah <14pwcse1224@uetpeshawar.edu.pk> To: stephen@networkplumber.org, thomas@monjalon.net, ferruh.yigit@amd.com, andrew.rybchenko@oktetlabs.ru Cc: dev@dpdk.org, stable@dpdk.org, Khadem Ullah <14pwcse1224@uetpeshawar.edu.pk> Subject: [PATCH] [PATCH v4] lib/ethdev: fix segfault in secondary process by validating dev_private pointer Date: Fri, 25 Jul 2025 08:55:26 -0400 Message-ID: <20250725125526.2340233-1-14pwcse1224@uetpeshawar.edu.pk> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250723131049.1703172-1-14pwcse1224@uetpeshawar.edu.pk> References: <20250723131049.1703172-1-14pwcse1224@uetpeshawar.edu.pk> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 In secondary processes, directly accessing 'dev->data->dev_private' can cause a segmentation fault if the primary process has exited or if the shared memory is no longer accessible. The secondary process not only crashes on device close but also segfaults when executing commands like "show device info all" after the primary has exited. This patch adds a mechanism in testpmd to monitor the primary process from the secondary using `rte_eal_primary_proc_alive()`, and introduces safety checks before dereferencing 'dev_private'. The `rte_mem_virt2phy()` call is also guarded to avoid access to invalid memory regions, with `unlikely()` hints to minimize impact in the fast path. Fixes: bdad90d12ec8 ("ethdev: change device info get callback to return int") Cc: stable@dpdk.org Signed-off-by: Khadem Ullah <14pwcse1224@uetpeshawar.edu.pk> --- app/test-pmd/testpmd.c | 56 ++++++++++++++++++++++++++++++++++++++--- lib/ethdev/rte_ethdev.c | 15 ++++++++++- 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index bb88555328..25e55de281 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -101,13 +101,17 @@ uint16_t verbose_level = 0; /**< Silent by default. */ int testpmd_logtype; /**< Log type for testpmd logs */ +static volatile uint8_t quit_signal; + +/* Maximum delay for exiting after primary process. */ +#define MONITOR_INTERVAL (500 * 1000) + /* use main core for command line ? */ uint8_t interactive = 0; uint8_t auto_start = 0; uint8_t tx_first; char cmdline_filename[PATH_MAX] = {0}; bool echo_cmdline_file; - /* * NUMA support configuration. * When set, the NUMA support attempts to dispatch the allocation of the @@ -2281,7 +2285,7 @@ run_pkt_fwd_on_lcore(struct fwd_lcore *fc, packet_fwd_t pkt_fwd) fc->total_cycles += tsc - prev_tsc; prev_tsc = tsc; } - } while (! fc->stopped); + } while (!fc->stopped && !quit_signal); } static int @@ -4329,9 +4333,51 @@ static void signal_handler(int signum __rte_unused) { f_quit = 1; + quit_signal = 1; prompt_exit(); } + +/* Alarm signal handler, used to check that primary process */ +static void +monitor_primary(void *arg __rte_unused) +{ + if (rte_atomic_load_explicit(&quit_signal, rte_memory_order_relaxed)) + return; + + if (rte_eal_primary_proc_alive(NULL)) { + rte_eal_alarm_set(MONITOR_INTERVAL, monitor_primary, NULL); + } else { + fprintf(stderr, + "Primary process is no longer active, exiting...\n"); + quit_signal = 1; + f_quit = 1; + prompt_exit(); + } +} + +/* Setup handler to check when primary exits. */ +static void +enable_primary_monitor(void) +{ + int ret; + + /* Once primary exits, so will pdump. */ + ret = rte_eal_alarm_set(MONITOR_INTERVAL, monitor_primary, NULL); + if (ret < 0) + fprintf(stderr, "Fail to enable monitor:%d\n", ret); +} + +static void +disable_primary_monitor(void) +{ + int ret; + + ret = rte_eal_alarm_cancel(monitor_primary, NULL); + if (ret < 0) + fprintf(stderr, "Fail to disable monitor:%d\n", ret); +} + int main(int argc, char** argv) { @@ -4362,7 +4408,8 @@ main(int argc, char** argv) if (diag < 0) rte_exit(EXIT_FAILURE, "Cannot init EAL: %s\n", rte_strerror(rte_errno)); - + if (rte_eal_process_type() == RTE_PROC_SECONDARY) + enable_primary_monitor(); /* allocate port structures, and init them */ init_port(); @@ -4571,7 +4618,8 @@ main(int argc, char** argv) if (ret != 0) rte_exit(EXIT_FAILURE, "Cannot unregister for ethdev events"); - + if (rte_eal_process_type() == RTE_PROC_SECONDARY) + disable_primary_monitor(); ret = rte_eal_cleanup(); if (ret != 0) rte_exit(EXIT_FAILURE, diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index dd7c00bc94..343e156a4f 100644 --- a/lib/ethdev/rte_ethdev.c +++ b/lib/ethdev/rte_ethdev.c @@ -4079,6 +4079,13 @@ rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info) if (dev->dev_ops->dev_infos_get == NULL) return -ENOTSUP; + if (rte_eal_process_type() == RTE_PROC_SECONDARY && + unlikely(rte_mem_virt2phy(dev->data->dev_private) == RTE_BAD_PHYS_ADDR)) { + RTE_ETHDEV_LOG_LINE(ERR, + "Secondary: dev_private not accessible (primary exited?)"); + rte_errno = ENODEV; + return -rte_errno; + } diag = dev->dev_ops->dev_infos_get(dev, dev_info); if (diag != 0) { /* Cleanup already filled in device information */ @@ -4307,7 +4314,13 @@ rte_eth_macaddr_get(uint16_t port_id, struct rte_ether_addr *mac_addr) port_id); return -EINVAL; } - + if (rte_eal_process_type() == RTE_PROC_SECONDARY && + (dev->data->mac_addrs == NULL)) { + RTE_ETHDEV_LOG_LINE(ERR, + "Secondary: dev_private not accessible (primary exited?)"); + rte_errno = ENODEV; + return -rte_errno; + } rte_ether_addr_copy(&dev->data->mac_addrs[0], mac_addr); rte_eth_trace_macaddr_get(port_id, mac_addr); -- 2.43.0