On Thu, May 30, 2024 at 6:45 PM David Christensen <d...@linux.ibm.com> wrote: > > From: David Christensen <d...@linux.vnet.ibm.com> > > 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 <tho...@monjalon.net> > Signed-off-by: David Christensen <d...@linux.ibm.com>
Sorry, this patch fell through the cracks.. Could you please check that author == sob ? WARNING:FROM_SIGN_OFF_MISMATCH: From:/Signed-off-by: email address mismatch: 'From: David Christensen <d...@linux.vnet.ibm.com>' != 'Signed-off-by: David Christensen <d...@linux.ibm.com>' [snip] > 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 2024* (and idem in other new files in this patch) [snip] > 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."); We are missing an update of windows/eal.c. [snip] > 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); EAL_LOG(). > + 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); err_msg is a fixed string (and only used once). EAL_LOG(ERR, DPDK on PPC64 requires radix-mmu"); > + > + 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 > +} The rest lgtm, can you send a n+1 for -rc2? Thanks. -- David Marchand