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 CB23F44114; Thu, 30 May 2024 18:45:05 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id ACD4B40608; Thu, 30 May 2024 18:45:05 +0200 (CEST) Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) by mails.dpdk.org (Postfix) with ESMTP id 5E61B40281 for ; Thu, 30 May 2024 18:45:04 +0200 (CEST) Received: from pps.filterd (m0353726.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 44UG7Fk2018587; Thu, 30 May 2024 16:45:01 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc : content-transfer-encoding : date : from : in-reply-to : message-id : mime-version : references : subject : to; s=pp1; bh=NO2o3panfq/XPZ0owU8ErCymf3OSxIuVub9IsvVoMAw=; b=kYNlsV+h9JaImrixCUt4l2+y+AOxUEZCA/5AqDzmSHJzjpMZ/2a39cRion8zbt9Jynnq uhDMgorGZTruPMTxdDUPNdQWaTNjofCePKTX0GVl4GFhCwYsF9AuIUn511c72sfzDCaX FhK1/vCD0h857ikvbMwDJi31ASP96fxzMV2qz0ASMKlCU7nT8qz5oLtXlufvpxr6TN4c WD8gsB5P1Yvu+hKpU3d/kJD6jqB3iUg0KbQFwvnaRYK+Oer8RUbJvaQWHcXFKOdUeQ7S cPI0V+QVuocmRgux+uudksGA5kRcvW5s1KQMEX8cHWXf/MPNxH9lC86IN+nqv3wQ/0nn Eg== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yevpm02rg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 30 May 2024 16:45:00 +0000 Received: from m0353726.ppops.net (m0353726.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 44UGaghZ002389; Thu, 30 May 2024 16:45:00 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yevpm02rb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 30 May 2024 16:44:59 +0000 Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 44UF1L7f026733; Thu, 30 May 2024 16:44:59 GMT Received: from smtprelay06.dal12v.mail.ibm.com ([172.16.1.8]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 3ydpd2txn0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 30 May 2024 16:44:59 +0000 Received: from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com [10.241.53.104]) by smtprelay06.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 44UGiujR30212678 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 30 May 2024 16:44:58 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8A62C58069; Thu, 30 May 2024 16:44:56 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4BE4758068; Thu, 30 May 2024 16:44:56 +0000 (GMT) Received: from ltcwspoon18.bm.com (unknown [9.40.194.38]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Thu, 30 May 2024 16:44:56 +0000 (GMT) From: David Christensen To: thomas@monjalon.net, Ruifeng Wang , Tyler Retzlaff , Bruce Richardson , Min Zhou , David Christensen , Stanislaw Kardach , Konstantin Ananyev Cc: dev@dpdk.org, David Christensen Subject: [PATCH v5] eal: verify mmu type for DPDK support (ppc64le) Date: Thu, 30 May 2024 12:44:47 -0400 Message-ID: <20240530164448.148044-1-drc@linux.ibm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20231130191844.612699-1-drc@linux.vnet.ibm.com> References: <20231130191844.612699-1-drc@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 X-Proofpoint-GUID: kYE3nVIM4unDdgsLeVbk-t9Tg9bGbR2_ X-Proofpoint-ORIG-GUID: jlfcMMWMu7_XbyLOqVdwnI8WEErKfpLn X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.650,FMLib:17.12.28.16 definitions=2024-05-30_13,2024-05-30_01,2024-05-17_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 lowpriorityscore=0 phishscore=0 mlxlogscore=982 impostorscore=0 mlxscore=0 clxscore=1011 adultscore=0 malwarescore=0 bulkscore=0 spamscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2405010000 definitions=main-2405300124 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: David Christensen IBM POWER systems support more than one type of memory management unit (MMU). The Power ISA 3.0 specification, which applies to P9 and later CPUs, defined a new Radix MMU which, among other things, allows an anonymous memory page mapping to be converted into a hugepage mapping at a specific address. This is a required feature in DPDK so we need to test the MMU type when POWER systems are used and provide a more useful error message for the user when running on an unsupported system such as P8/P9 on PowerVM. All architectures other than ppc64le unconditionally report that the MMU is supported. When running with ppc64le on Linux, the MMU is tested and the actual result is returned, while running with ppc64le on FreeBSD unconditionally reports that the MMU is supported to avoid unnecessary breakage until an actual test can be implemented for that environment (i.e. keeps existing behavior without the patch). Bugzilla ID: 1221 Suggested-by: Thomas Monjalon Signed-off-by: David Christensen --- v5: * Rebase patch to current release, fix new checkpatch warnings v4: * Added test function to "freebsd" v3: * Move test function from "common" tree to "linux" v2: * Replace ifdef with arch specific functions --- lib/eal/arm/meson.build | 1 + lib/eal/arm/rte_mmu.c | 11 ++++++ lib/eal/common/eal_private.h | 7 ++++ lib/eal/freebsd/eal.c | 7 ++++ lib/eal/linux/eal.c | 7 ++++ lib/eal/loongarch/meson.build | 1 + lib/eal/loongarch/rte_mmu.c | 11 ++++++ lib/eal/ppc/meson.build | 1 + lib/eal/ppc/rte_mmu.c | 67 +++++++++++++++++++++++++++++++++++ lib/eal/riscv/meson.build | 1 + lib/eal/riscv/rte_mmu.c | 11 ++++++ lib/eal/x86/meson.build | 1 + lib/eal/x86/rte_mmu.c | 11 ++++++ 13 files changed, 137 insertions(+) create mode 100644 lib/eal/arm/rte_mmu.c create mode 100644 lib/eal/loongarch/rte_mmu.c create mode 100644 lib/eal/ppc/rte_mmu.c create mode 100644 lib/eal/riscv/rte_mmu.c create mode 100644 lib/eal/x86/rte_mmu.c diff --git a/lib/eal/arm/meson.build b/lib/eal/arm/meson.build index dca1106aae..6fba3d6ba7 100644 --- a/lib/eal/arm/meson.build +++ b/lib/eal/arm/meson.build @@ -7,5 +7,6 @@ sources += files( 'rte_cpuflags.c', 'rte_cycles.c', 'rte_hypervisor.c', + 'rte_mmu.c', 'rte_power_intrinsics.c', ) diff --git a/lib/eal/arm/rte_mmu.c b/lib/eal/arm/rte_mmu.c new file mode 100644 index 0000000000..3d40bfde38 --- /dev/null +++ b/lib/eal/arm/rte_mmu.c @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (C) IBM Corporation 2023 + */ + +#include "eal_private.h" + +bool +eal_mmu_supported(void) +{ + return true; +} diff --git a/lib/eal/common/eal_private.h b/lib/eal/common/eal_private.h index 71523cfdb8..7c1eddcb3b 100644 --- a/lib/eal/common/eal_private.h +++ b/lib/eal/common/eal_private.h @@ -94,6 +94,13 @@ int rte_eal_memzone_init(void); */ int rte_eal_cpu_init(void); +/** + * Check for architecture supported MMU. + * + * This function is private to EAL. + */ +bool eal_mmu_supported(void); + /** * Create memseg lists * diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c index bab77118e9..1229230063 100644 --- a/lib/eal/freebsd/eal.c +++ b/lib/eal/freebsd/eal.c @@ -597,6 +597,13 @@ rte_eal_init(int argc, char **argv) return -1; } + /* verify if DPDK supported on architecture MMU */ + if (!eal_mmu_supported()) { + rte_eal_init_alert("unsupported MMU type."); + rte_errno = ENOTSUP; + return -1; + } + if (!rte_atomic_compare_exchange_strong_explicit(&run_once, &has_run, 1, rte_memory_order_relaxed, rte_memory_order_relaxed)) { rte_eal_init_alert("already called initialization."); diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index fd422f1f62..d742cc98e2 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -983,6 +983,13 @@ rte_eal_init(int argc, char **argv) return -1; } + /* verify if DPDK supported on architecture MMU */ + if (!eal_mmu_supported()) { + rte_eal_init_alert("unsupported MMU type."); + rte_errno = ENOTSUP; + return -1; + } + if (!rte_atomic_compare_exchange_strong_explicit(&run_once, &has_run, 1, rte_memory_order_relaxed, rte_memory_order_relaxed)) { rte_eal_init_alert("already called initialization."); diff --git a/lib/eal/loongarch/meson.build b/lib/eal/loongarch/meson.build index 4dcc27babb..3acfe6c3bd 100644 --- a/lib/eal/loongarch/meson.build +++ b/lib/eal/loongarch/meson.build @@ -7,5 +7,6 @@ sources += files( 'rte_cpuflags.c', 'rte_cycles.c', 'rte_hypervisor.c', + 'rte_mmu.c', 'rte_power_intrinsics.c', ) diff --git a/lib/eal/loongarch/rte_mmu.c b/lib/eal/loongarch/rte_mmu.c new file mode 100644 index 0000000000..3d40bfde38 --- /dev/null +++ b/lib/eal/loongarch/rte_mmu.c @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (C) IBM Corporation 2023 + */ + +#include "eal_private.h" + +bool +eal_mmu_supported(void) +{ + return true; +} diff --git a/lib/eal/ppc/meson.build b/lib/eal/ppc/meson.build index 71c7ac870d..eeeaeee240 100644 --- a/lib/eal/ppc/meson.build +++ b/lib/eal/ppc/meson.build @@ -7,5 +7,6 @@ sources += files( 'rte_cpuflags.c', 'rte_cycles.c', 'rte_hypervisor.c', + 'rte_mmu.c', 'rte_power_intrinsics.c', ) diff --git a/lib/eal/ppc/rte_mmu.c b/lib/eal/ppc/rte_mmu.c new file mode 100644 index 0000000000..72d28c5985 --- /dev/null +++ b/lib/eal/ppc/rte_mmu.c @@ -0,0 +1,67 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (C) IBM Corporation 2023 + */ + +#include "stdio.h" +#include "string.h" +#include "rte_log.h" +#include "eal_private.h" + +bool +eal_mmu_supported(void) +{ +#ifdef RTE_EXEC_ENV_LINUX + static const char proc_cpuinfo[] = "/proc/cpuinfo"; + static const char str_mmu[] = "MMU"; + static const char str_radix[] = "Radix"; + static const char err_msg[] = "DPDK on PPC64 requires radix-mmu"; + char buf[512]; + char *ret = NULL; + FILE *f = fopen(proc_cpuinfo, "r"); + + if (f == NULL) { + RTE_LOG_LINE(ERR, EAL, "Cannot open %s", proc_cpuinfo); + return false; + } + + /* + * Example "MMU" in /proc/cpuinfo: + * ... + * model : 8335-GTW + * machine : PowerNV 8335-GTW + * firmware : OPAL + * MMU : Radix + * ... or ... + * model : IBM,9009-22A + * machine : CHRP IBM,9009-22A + * MMU : Hash + */ + while (fgets(buf, sizeof(buf), f) != NULL) { + ret = strstr(buf, str_mmu); + if (ret == NULL) + continue; + ret += sizeof(str_mmu) - 1; + ret = strchr(ret, ':'); + if (ret == NULL) + continue; + ret = strstr(ret, str_radix); + break; + } + fclose(f); + + if (ret == NULL) + RTE_LOG_LINE(ERR, EAL, "%s", err_msg); + + return (ret != NULL); +#elif RTE_EXEC_ENV_FREEBSD + /* + * Method to detect MMU type in FreeBSD not known + * by this author. Return true for now to emulate + * previous behavior and avoid unnecessary failures. + */ + return true; +#else + /* Force false for other execution environments */ + return false; +#endif +} diff --git a/lib/eal/riscv/meson.build b/lib/eal/riscv/meson.build index dca1106aae..6fba3d6ba7 100644 --- a/lib/eal/riscv/meson.build +++ b/lib/eal/riscv/meson.build @@ -7,5 +7,6 @@ sources += files( 'rte_cpuflags.c', 'rte_cycles.c', 'rte_hypervisor.c', + 'rte_mmu.c', 'rte_power_intrinsics.c', ) diff --git a/lib/eal/riscv/rte_mmu.c b/lib/eal/riscv/rte_mmu.c new file mode 100644 index 0000000000..3d40bfde38 --- /dev/null +++ b/lib/eal/riscv/rte_mmu.c @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (C) IBM Corporation 2023 + */ + +#include "eal_private.h" + +bool +eal_mmu_supported(void) +{ + return true; +} diff --git a/lib/eal/x86/meson.build b/lib/eal/x86/meson.build index d33a240e1a..e08dffa13d 100644 --- a/lib/eal/x86/meson.build +++ b/lib/eal/x86/meson.build @@ -7,6 +7,7 @@ sources += files( 'rte_cpuflags.c', 'rte_cycles.c', 'rte_hypervisor.c', + 'rte_mmu.c', 'rte_spinlock.c', 'rte_power_intrinsics.c', ) diff --git a/lib/eal/x86/rte_mmu.c b/lib/eal/x86/rte_mmu.c new file mode 100644 index 0000000000..3d40bfde38 --- /dev/null +++ b/lib/eal/x86/rte_mmu.c @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (C) IBM Corporation 2023 + */ + +#include "eal_private.h" + +bool +eal_mmu_supported(void) +{ + return true; +} -- 2.43.0