[v5] eal: verify mmu type for DPDK support (ppc64le)

Message ID 20240530164448.148044-1-drc@linux.ibm.com (mailing list archive)
State Changes Requested
Delegated to: David Marchand
Headers
Series [v5] eal: verify mmu type for DPDK support (ppc64le) |

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/loongarch-compilation success Compilation OK
ci/loongarch-unit-testing success Unit Testing PASS
ci/github-robot: build success github build: passed
ci/Intel-compilation success Compilation OK
ci/intel-Testing success Testing PASS
ci/intel-Functional success Functional PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-unit-arm64-testing success Testing PASS
ci/iol-abi-testing success Testing PASS
ci/iol-compile-amd64-testing success Testing PASS
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-broadcom-Functional success Functional Testing PASS
ci/iol-compile-arm64-testing success Testing PASS
ci/iol-unit-amd64-testing success Testing PASS
ci/iol-sample-apps-testing success Testing PASS

Commit Message

David Christensen May 30, 2024, 4:44 p.m. UTC
  From: David Christensen <drc@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 <thomas@monjalon.net>
Signed-off-by: David Christensen <drc@linux.ibm.com>
---
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

--
2.43.0
  

Comments

David Marchand June 28, 2024, 12:10 p.m. UTC | #1
On Thu, May 30, 2024 at 6:45 PM David Christensen <drc@linux.ibm.com> wrote:
>
> From: David Christensen <drc@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 <thomas@monjalon.net>
> Signed-off-by: David Christensen <drc@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 <drc@linux.vnet.ibm.com>' !=
'Signed-off-by: David Christensen <drc@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.
  

Patch

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;
+}