alloc-pinned-{1,2,5}.c allocate three buffers of sysconf (_SC_PAGESIZE)
- 128 bytes each, needing five times that size in total, and abort in
CHECK_SIZE when RLIMIT_MEMLOCK is smaller.  With 64 KiB pages the
requirement is just over 319 KiB, while 64 KiB is a common default for
the limit, so on such a machine these tests cannot run at all.

Add check_effective_target_omp_pinned_mem, which reads RLIMIT_MEMLOCK
and tests exactly the condition CHECK_SIZE tests, and require it from
those three tests.  They are reported as unsupported only when the
limit is provably too small; if the limit cannot be read, or the
compiler is a cross compiler, they still run, and CHECK_SIZE keeps
failing the test for any other reason.  The nvptx variant locks the
memory through CUDA, so the requirement is not applied to it.

libgomp/ChangeLog:

        * testsuite/lib/libgomp.exp (check_effective_target_omp_pinned_mem):
        New procedure.
        * testsuite/libgomp.c/alloc-pinned-1.c: Require it.
        * testsuite/libgomp.c/alloc-pinned-2.c: Likewise.
        * testsuite/libgomp.c/alloc-pinned-5.c: Likewise.
---
 libgomp/testsuite/lib/libgomp.exp            | 28 ++++++++++++++++++++
 libgomp/testsuite/libgomp.c/alloc-pinned-1.c |  2 ++
 libgomp/testsuite/libgomp.c/alloc-pinned-2.c |  2 ++
 libgomp/testsuite/libgomp.c/alloc-pinned-5.c |  2 ++
 4 files changed, 34 insertions(+)

diff --git a/libgomp/testsuite/lib/libgomp.exp 
b/libgomp/testsuite/lib/libgomp.exp
index 4987400f2a0..8b4e78cc774 100644
--- a/libgomp/testsuite/lib/libgomp.exp
+++ b/libgomp/testsuite/lib/libgomp.exp
@@ -395,6 +395,34 @@ proc check_effective_target_linux_futex_waitv { } {
              [lsearch -exact $libgomp_config_path "linux/futex_waitv"] >= 0}]
 }
 
+# Return 1 if the host lets a process lock as much memory as the alloc-pinned
+# tests need.  Those tests abort in their own CHECK_SIZE when RLIMIT_MEMLOCK
+# is smaller than five pages (64 KiB is a common default, and with 64 KiB
+# pages five pages already exceed it), so report them as unsupported instead
+# of reporting a failure.
+proc check_effective_target_omp_pinned_mem { } {
+    # A cross-compiler says nothing about the machine the tests will run
+    # on; assume the limit is fine and let the test decide.
+    if { ![isnative] } {
+       return 1
+    }
+    return [check_runtime_nocache omp_pinned_mem {
+      #include <sys/resource.h>
+      #include <unistd.h>
+
+      int main (void)
+      {
+       struct rlimit limit;
+       long page = sysconf (_SC_PAGESIZE);
+       /* If the limit cannot be queried, let the test decide.  */
+       if (getrlimit (RLIMIT_MEMLOCK, &limit) != 0 || page <= 128)
+         return 0;
+       /* This is the condition CHECK_SIZE tests in the tests themselves.  */
+       return limit.rlim_cur > (rlim_t) (page - 128) * 5 ? 0 : 1;
+      }
+    }]
+}
+
 # Return 1 if compiling for the specified offload target
 # Takes -foffload=... into account by checking OFFLOAD_TARGET_NAMES=
 # in the -v compiler output.
diff --git a/libgomp/testsuite/libgomp.c/alloc-pinned-1.c 
b/libgomp/testsuite/libgomp.c/alloc-pinned-1.c
index 693f9032c8d..2121182d065 100644
--- a/libgomp/testsuite/libgomp.c/alloc-pinned-1.c
+++ b/libgomp/testsuite/libgomp.c/alloc-pinned-1.c
@@ -2,6 +2,8 @@
 
 /* { dg-skip-if "Pinning not implemented on this host" { ! *-*-linux-gnu* } } 
*/
 
+/* { dg-require-effective-target omp_pinned_mem { target { ! 
offload_device_nvptx } } } */
+
 /* { dg-additional-options -DOFFLOAD_DEVICE_NVPTX { target 
offload_device_nvptx } } */
 
 /* Test that pinned memory works.  */
diff --git a/libgomp/testsuite/libgomp.c/alloc-pinned-2.c 
b/libgomp/testsuite/libgomp.c/alloc-pinned-2.c
index e7ac64e911f..d8aa81f2b09 100644
--- a/libgomp/testsuite/libgomp.c/alloc-pinned-2.c
+++ b/libgomp/testsuite/libgomp.c/alloc-pinned-2.c
@@ -2,6 +2,8 @@
 
 /* { dg-skip-if "Pinning not implemented on this host" { ! *-*-linux-gnu* } } 
*/
 
+/* { dg-require-effective-target omp_pinned_mem { target { ! 
offload_device_nvptx } } } */
+
 /* { dg-additional-options -DOFFLOAD_DEVICE_NVPTX { target 
offload_device_nvptx } } */
 
 /* Test that pinned memory works (pool_size code path).  */
diff --git a/libgomp/testsuite/libgomp.c/alloc-pinned-5.c 
b/libgomp/testsuite/libgomp.c/alloc-pinned-5.c
index cc7776409ff..6642c3276d0 100644
--- a/libgomp/testsuite/libgomp.c/alloc-pinned-5.c
+++ b/libgomp/testsuite/libgomp.c/alloc-pinned-5.c
@@ -2,6 +2,8 @@
 
 /* { dg-skip-if "Pinning not implemented on this host" { ! *-*-linux-gnu* } } 
*/
 
+/* { dg-require-effective-target omp_pinned_mem { target { ! 
offload_device_nvptx } } } */
+
 /* { dg-additional-options -DOFFLOAD_DEVICE_NVPTX { target 
offload_device_nvptx } } */
 
 /* Test that ompx_gnu_pinned_mem_alloc works.  */
-- 
2.34.1

Reply via email to