From: Tarun Sahu <tsahu@linux.ibm.com>
To: ltp@lists.linux.it
Cc: geetika@linux.ibm.com, sbhat@linux.ibm.com,
aneesh.kumar@linux.ibm.com, vaibhav@linux.ibm.com
Subject: [LTP] [PATCH 3/8] Hugetlb: Migrating libhugetlbfs huge_below_4GB_normal_above
Date: Thu, 1 Dec 2022 17:32:43 +0530 [thread overview]
Message-ID: <20221201120248.139396-4-tsahu@linux.ibm.com> (raw)
In-Reply-To: <20221201120248.139396-1-tsahu@linux.ibm.com>
Migrating the libhugetlbfs/testcases/huge_below_4GB_normal_above.c test
Test Description: Designed to pick up a bug on ppc64 where
touches_hugepage_low_range() could give false positives because of the
peculiar (undefined) behaviour of << for large shifts
Signed-off-by: Tarun Sahu <tsahu@linux.ibm.com>
---
runtest/hugetlb | 1 +
testcases/kernel/mem/.gitignore | 1 +
.../kernel/mem/hugetlb/hugemmap/hugemmap14.c | 156 ++++++++++++++++++
3 files changed, 158 insertions(+)
create mode 100644 testcases/kernel/mem/hugetlb/hugemmap/hugemmap14.c
diff --git a/runtest/hugetlb b/runtest/hugetlb
index 2029ee4b3..796ebe7fa 100644
--- a/runtest/hugetlb
+++ b/runtest/hugetlb
@@ -15,6 +15,7 @@ hugemmap10 hugemmap10
hugemmap11 hugemmap11
hugemmap12 hugemmap12
hugemmap13 hugemmap13
+hugemmap14 hugemmap14
hugemmap05_1 hugemmap05 -m
hugemmap05_2 hugemmap05 -s
hugemmap05_3 hugemmap05 -s -m
diff --git a/testcases/kernel/mem/.gitignore b/testcases/kernel/mem/.gitignore
index 5955ed613..3106579ce 100644
--- a/testcases/kernel/mem/.gitignore
+++ b/testcases/kernel/mem/.gitignore
@@ -14,6 +14,7 @@
/hugetlb/hugemmap/hugemmap11
/hugetlb/hugemmap/hugemmap12
/hugetlb/hugemmap/hugemmap13
+/hugetlb/hugemmap/hugemmap14
/hugetlb/hugeshmat/hugeshmat01
/hugetlb/hugeshmat/hugeshmat02
/hugetlb/hugeshmat/hugeshmat03
diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap14.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap14.c
new file mode 100644
index 000000000..8ccd141f8
--- /dev/null
+++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap14.c
@@ -0,0 +1,156 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * Copyright (C) 2005-2006 David Gibson & Adam Litke, IBM Corporation.
+ * Author: David Gibson & Adam Litke
+ */
+
+/*\
+ * [Description]
+ *
+ * Designed to pick up a bug on ppc64 where touches_hugepage_low_range()
+ * could give false positives because of the peculiar (undefined)
+ * behaviour of << for large shifts
+ *
+ * WARNING: The offsets and addresses used within are specifically
+ * calculated to trigger the bug as it existed. Don't mess with them
+ * unless you *really* know what you're doing.
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <sys/mount.h>
+#include <limits.h>
+#include <sys/param.h>
+#include <sys/types.h>
+
+#include "hugetlb.h"
+
+#define FOURGB (1UL << 32)
+#define MNTPOINT "hugetlbfs/"
+static int fd = -1;
+static unsigned long hpage_size;
+static int page_size;
+
+static void run_test(void)
+{
+ void *p, *q = NULL, *r = NULL;
+ unsigned long lowaddr, highaddr;
+ unsigned long below_start;
+ unsigned long above_end;
+
+ /*
+ * We use a low address right below 4GB so we can test for
+ * off-by-one errors
+ */
+ lowaddr = FOURGB - hpage_size;
+ tst_res(TINFO, "Mapping hugepage at %lx...", lowaddr);
+ p = mmap((void *)lowaddr, hpage_size, PROT_READ|PROT_WRITE,
+ MAP_SHARED|MAP_FIXED, fd, 0);
+ if (p == MAP_FAILED) {
+ /* This is last low slice - 256M just before 4G */
+ below_start = FOURGB - 256L*1024*1024;
+ above_end = FOURGB;
+
+ if (range_is_mapped(below_start, above_end) == 1) {
+ tst_res(TINFO|TERRNO, "region (4G-256M)-4G is not free & "
+ "mmap() failed expected");
+ tst_res(TPASS, "Successful but inconclusive");
+ } else
+ tst_res(TFAIL|TERRNO, "mmap() huge failed unexpected");
+ goto cleanup;
+ }
+ if (p != (void *)lowaddr) {
+ tst_res(TFAIL, "Wrong address with MAP_FIXED huge");
+ goto cleanup;
+ }
+ memset(p, 0, hpage_size);
+
+ /* Test for off by one errors */
+ highaddr = FOURGB;
+ tst_res(TINFO, "Mapping normal page at %lx...", highaddr);
+ q = mmap((void *)highaddr, page_size, PROT_READ|PROT_WRITE,
+ MAP_SHARED|MAP_FIXED|MAP_ANONYMOUS, 0, 0);
+ if (q == MAP_FAILED) {
+ below_start = FOURGB;
+ above_end = FOURGB + page_size;
+
+ if (range_is_mapped(below_start, above_end) == 1) {
+ tst_res(TINFO|TERRNO, "region 4G-(4G+page) is not free & "
+ "mmap() failed expected");
+ tst_res(TPASS, "Successful but inconclusive");
+ } else
+ tst_res(TFAIL|TERRNO, "mmap() normal 1 failed unexpected");
+ goto cleanup;
+ }
+ if (q != (void *)highaddr) {
+ tst_res(TFAIL, "Wrong address with MAP_FIXED normal 1");
+ goto cleanup;
+ }
+ memset(q, 0, page_size);
+
+ /*
+ * Why this address? Well on ppc64, we're working with 256MB
+ * segment numbers, hence >>28. In practice the shift
+ * instructions only start wrapping around with shifts 128 or
+ * greater.
+ */
+ highaddr = ((lowaddr >> 28) + 128) << 28;
+ tst_res(TINFO, "Mapping normal page at %lx...", highaddr);
+ r = mmap((void *)highaddr, page_size, PROT_READ|PROT_WRITE,
+ MAP_SHARED|MAP_FIXED|MAP_ANONYMOUS, 0, 0);
+ if (r == MAP_FAILED) {
+ below_start = highaddr;
+ above_end = highaddr + page_size;
+
+ if (range_is_mapped(below_start, above_end) == 1) {
+ tst_res(TINFO|TERRNO, "region haddr-(haddr+page) not free & "
+ "mmap() failed unexpected");
+ tst_res(TPASS, "Successful but inconclusive");
+ }
+ tst_res(TFAIL|TERRNO, "mmap() normal 2 failed unexpected");
+ goto cleanup;
+ }
+ if (r != (void *)highaddr) {
+ tst_res(TFAIL, "Wrong address with MAP_FIXED normal 2");
+ goto cleanup;
+ }
+ memset(r, 0, page_size);
+ tst_res(TPASS, "Successful");
+
+cleanup:
+ if (p && p != MAP_FAILED)
+ SAFE_MUNMAP(p, hpage_size);
+ if (q && q != MAP_FAILED)
+ SAFE_MUNMAP(q, page_size);
+ if (r && r != MAP_FAILED)
+ SAFE_MUNMAP(r, page_size);
+}
+
+static void setup(void)
+{
+ page_size = getpagesize();
+ hpage_size = SAFE_READ_MEMINFO("Hugepagesize:")*1024;
+
+ if (sizeof(void *) <= 4)
+ tst_brk(TCONF, "Machine must be >32 bit");
+ if (hpage_size > FOURGB)
+ tst_brk(TCONF, "Huge page size is too large");
+ fd = tst_creat_unlinked(MNTPOINT, 0);
+}
+
+static void cleanup(void)
+{
+ if (fd > 0)
+ SAFE_CLOSE(fd);
+}
+
+static struct tst_test test = {
+ .needs_root = 1,
+ .mntpoint = MNTPOINT,
+ .needs_hugetlbfs = 1,
+ .needs_tmpdir = 1,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = run_test,
+ .hugepages = {2, TST_NEEDS},
+};
--
2.31.1
--
Mailing list info: https://lists.linux.it/listinfo/ltp
next prev parent reply other threads:[~2022-12-01 12:03 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-20 19:15 [LTP] [PATCH v5 0/7][PART 2] Hugetlb:Migrating the libhugetlbfs tests Tarun Sahu
2022-11-20 19:15 ` [LTP] [PATCH v5 1/7] Hugetlb: Add new argument flags in tst_creat_unlinked Tarun Sahu
2022-11-24 11:55 ` Cyril Hrubis
2022-11-20 19:15 ` [LTP] [PATCH v5 2/7] Hugetlb: Migrating libhugetlbfs counters Tarun Sahu
2022-11-20 19:15 ` [LTP] [PATCH v5 3/7] Hugetlb: Migrating libhugetlbfs directio Tarun Sahu
2022-11-20 19:15 ` [LTP] [PATCH v5 4/7] Hugetlb: Safe macro for posix_fadvise call Tarun Sahu
2022-11-24 11:59 ` Cyril Hrubis
2022-11-25 17:34 ` Tarun Sahu
2022-11-25 18:59 ` Cyril Hrubis
2022-11-20 19:15 ` [LTP] [PATCH v5 5/7] Hugetlb: Migrating libhugetlbfs fadvise_reserve Tarun Sahu
2022-11-20 19:15 ` [LTP] [PATCH v5 6/7] Hugetlb: Migrating libhugetlbfs fallocate_align Tarun Sahu
2022-11-24 14:51 ` Cyril Hrubis
2022-11-20 19:15 ` [LTP] [PATCH v5 7/7] Hugetlb: Migrating libhugetlbfs fallocate_basic Tarun Sahu
2022-11-25 22:37 ` [LTP] [PATCH v6 1/2] Hugetlb: Safe macro for posix_fadvise call Tarun Sahu
2022-11-25 22:37 ` [LTP] [PATCH v6 2/2] Hugetlb: Migrating libhugetlbfs fadvise_reserve Tarun Sahu
2022-11-29 16:21 ` [LTP] [PATCH v6 1/2] Hugetlb: Safe macro for posix_fadvise call Cyril Hrubis
2022-12-01 8:35 ` Tarun Sahu
2022-12-01 12:02 ` [LTP] [PATCH 0/8][PART 3] Hugetlb:Migrating the libhugetlbfs tests Tarun Sahu
2022-12-01 12:02 ` [LTP] [PATCH 1/8] Hugetlb: Migrating libhugetlbfs fork-cow Tarun Sahu
2022-12-01 12:02 ` [LTP] [PATCH 2/8] Hugetlb: Migrating libhugetlbfs huge_at_4GB_normal_below Tarun Sahu
2022-12-01 12:02 ` Tarun Sahu [this message]
2022-12-01 12:02 ` [LTP] [PATCH 4/8] Hugetlb: Migrating libhugetlbfs icache-hygiene Tarun Sahu
2022-12-01 12:02 ` [LTP] [PATCH 5/8] Hugetlb: Migrating libhugetlbfs madvise_reserve Tarun Sahu
2022-12-01 12:02 ` [LTP] [PATCH 6/8] Hugetlb: Migrating libhugetlbfs map_high_truncate_2 Tarun Sahu
2022-12-01 12:02 ` [LTP] [PATCH 7/8] Hugetlb: Migrating libhugetlbfs misalign Tarun Sahu
2022-12-01 12:02 ` [LTP] [PATCH 8/8] Hugetlb: Migrating libhugetlbfs misaligned_offset Tarun Sahu
-- strict thread matches above, loose matches on Subject: below --
2022-12-01 12:28 [LTP] [PATCH 0/8][PART 3] Hugetlb:Migrating the libhugetlbfs tests Tarun Sahu
2022-12-01 12:28 ` [LTP] [PATCH 3/8] Hugetlb: Migrating libhugetlbfs huge_below_4GB_normal_above Tarun Sahu
2022-12-06 8:57 ` Richard Palethorpe
2022-12-07 12:51 ` Tarun Sahu
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=20221201120248.139396-4-tsahu@linux.ibm.com \
--to=tsahu@linux.ibm.com \
--cc=aneesh.kumar@linux.ibm.com \
--cc=geetika@linux.ibm.com \
--cc=ltp@lists.linux.it \
--cc=sbhat@linux.ibm.com \
--cc=vaibhav@linux.ibm.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.