DPDK patches and discussions
 help / color / mirror / Atom feed
From: David Christensen <drc@linux.vnet.ibm.com>
To: thomas@monjalon.net, Ruifeng Wang <ruifeng.wang@arm.com>,
	Bruce Richardson <bruce.richardson@intel.com>,
	Min Zhou <zhoumin@loongson.cn>,
	David Christensen <drc@linux.vnet.ibm.com>,
	Stanislaw Kardach <kda@semihalf.com>,
	Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
Cc: dev@dpdk.org
Subject: [PATCH v4] eal: verify mmu type for DPDK support (ppc64le)
Date: Thu, 30 Nov 2023 14:18:44 -0500	[thread overview]
Message-ID: <20231130191844.612699-1-drc@linux.vnet.ibm.com> (raw)
In-Reply-To: <20231024174315.318408-1-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.

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.

Bugzilla ID: 1221

Suggested-by: Thomas Monjalon <thomas@monjalon.net>
Signed-off-by: David Christensen <drc@linux.vnet.ibm.com>
---
 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         | 68 +++++++++++++++++++++++++++++++++++
 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, 138 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 dca1106aaeec..6fba3d6ba7b8 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 000000000000..3d40bfde386a
--- /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 4d2e80661023..c001c917de1d 100644
--- a/lib/eal/common/eal_private.h
+++ b/lib/eal/common/eal_private.h
@@ -93,6 +93,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 568e06e9ed91..0a6a9edc7213 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 57da058cec60..b22c19ff0492 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 4dcc27babb9b..3acfe6c3bd77 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 000000000000..3d40bfde386a
--- /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 71c7ac870da6..eeeaeee240b7 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 000000000000..2d090362e530
--- /dev/null
+++ b/lib/eal/ppc/rte_mmu.c
@@ -0,0 +1,68 @@
+/* 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(ERR, EAL, "Cannot open %s\n", 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) {
+		fprintf(stderr, "EAL: FATAL: %s\n", err_msg);
+		RTE_LOG(ERR, EAL, "%s\n", 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 dca1106aaeec..6fba3d6ba7b8 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 000000000000..3d40bfde386a
--- /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 d33a240e1a98..e08dffa13dcc 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 000000000000..3d40bfde386a
--- /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.39.3


      parent reply	other threads:[~2023-11-30 19:19 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-10-10 22:51 [PATCH] eal/linux: " David Christensen
2023-10-17 12:39 ` Thomas Monjalon
2023-10-23 21:59   ` David Christensen
2023-11-06 13:54     ` Thomas Monjalon
2023-10-23 23:19 ` [PATCH v2] eal/linux: " David Christensen
2023-10-24  2:02   ` David Christensen
2023-10-24 17:43   ` [PATCH v3] " David Christensen
2023-11-06 13:55     ` Thomas Monjalon
2023-11-30 19:18     ` David Christensen [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231130191844.612699-1-drc@linux.vnet.ibm.com \
    --to=drc@linux.vnet.ibm.com \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=kda@semihalf.com \
    --cc=konstantin.v.ananyev@yandex.ru \
    --cc=ruifeng.wang@arm.com \
    --cc=thomas@monjalon.net \
    --cc=zhoumin@loongson.cn \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).