[LTP] [PATCH v6] Origin: https://github.com/libhugetlbfs/libhugetlbfs/blob/master/tests/shm-getraw.c

Pavithra pavrampu@linux.ibm.com
Thu Sep 25 08:00:45 CEST 2025


From: Pavithra <pavrampu@linux.vnet.ibm.com>

The test creates a shared memory segment, then attaches it to the process’s address space.
It writes a string to the shared memory from raw device and detaches the shared memory
segment and finally removes it.
The purpose of this test is to ensure that the shared memory subsystem is working correctly
with hugepages. It checks that shared memory segments can be created, attached, written to,
read from, detached, and removed without errors

Signed-off-by: Pavithra <pavrampu@linux.vnet.ibm.com>
---
 runtest/syscalls-ipc                          |  1 +
 testcases/kernel/mem/.gitignore               |  1 +
 .../kernel/syscalls/ipc/shmget/shmget07.c     | 73 +++++++++++++++++++
 3 files changed, 75 insertions(+)
 create mode 100644 testcases/kernel/syscalls/ipc/shmget/shmget07.c

diff --git a/runtest/syscalls-ipc b/runtest/syscalls-ipc
index 8960c487c..4159f2331 100644
--- a/runtest/syscalls-ipc
+++ b/runtest/syscalls-ipc
@@ -66,3 +66,4 @@ shmget03 shmget03
 shmget04 shmget04
 shmget05 shmget05
 shmget06 shmget06
+shmget07 shmget07
diff --git a/testcases/kernel/mem/.gitignore b/testcases/kernel/mem/.gitignore
index b4455de51..f9438606e 100644
--- a/testcases/kernel/mem/.gitignore
+++ b/testcases/kernel/mem/.gitignore
@@ -50,6 +50,7 @@
 /hugetlb/hugeshmget/hugeshmget03
 /hugetlb/hugeshmget/hugeshmget05
 /hugetlb/hugeshmget/hugeshmget06
+/hugetlb/hugeshmget/hugeshmget07
 /ksm/ksm01
 /ksm/ksm02
 /ksm/ksm03
diff --git a/testcases/kernel/syscalls/ipc/shmget/shmget07.c b/testcases/kernel/syscalls/ipc/shmget/shmget07.c
new file mode 100644
index 000000000..b1bee06f9
--- /dev/null
+++ b/testcases/kernel/syscalls/ipc/shmget/shmget07.c
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * Copyright (C) 2005-2006 David Gibson & Adam Litke, IBM Corporation.
+ */
+
+/*\
+ * [Descripiton]
+ *
+ * Origin: https://github.com/libhugetlbfs/libhugetlbfs/blob/master/tests/shm-getraw.c
+ *
+ * The test creates a shared memory segment, then attaches it to the process’s address space.
+ * It writes a string to the shared memory from raw device and detaches the shared memory
+ * segment and finally removes it.
+ * The purpose of this test is to ensure that the shared memory subsystem is working correctly
+ * with hugepages. It checks that shared memory segments can be created, attached, written to,
+ * read from, detached, and removed without errors
+ *
+ */
+
+#include "../../../mem/hugetlb/lib/hugetlb.h"
+#include "tst_safe_sysv_ipc.h"
+
+#define MNTPOINT "hugetlbfs/"
+#define NR_HUGEPAGES 2
+
+static int shmid = -1;
+static size_t size;
+static size_t i;
+
+static char *shmaddr;
+static int raw_fd;
+static long hpage_size;
+
+static void setup(void)
+{
+	hpage_size = tst_get_hugepage_size();
+}
+
+static void cleanup(void)
+{
+	if (shmid >= 0)
+		SAFE_SHMCTL(shmid, IPC_RMID, NULL);
+}
+
+static void run_test(void)
+{
+	size = hpage_size * NR_HUGEPAGES;
+	raw_fd = SAFE_OPEN("/dev/zero", O_RDONLY);
+
+	shmid = SAFE_SHMGET(IPC_PRIVATE, size, SHM_HUGETLB|SHM_R|SHM_W);
+
+	shmaddr = SAFE_SHMAT(shmid, 0, SHM_RND);
+	tst_res(TINFO, "shmaddr: %p\n", shmaddr);
+
+	/* Read a page from device and write to shm segment */
+
+	for (i = 0; i < size; i += hpage_size) {
+		TST_RET = read(raw_fd, shmaddr, hpage_size);
+		TST_EXP_VAL(TST_RET, hpage_size, "read returned %ld", TST_RET);
+		if (TST_RET != hpage_size)
+			tst_res(TFAIL | TERRNO, "Can't read full page from raw device!");
+	}
+
+	SAFE_SHMDT(shmaddr);
+}
+
+static struct tst_test test = {
+	.needs_root = 1,
+	.setup = setup,
+	.cleanup = cleanup,
+	.test_all = run_test,
+	.hugepages = {2, TST_NEEDS},
+};
-- 
2.43.5


More information about the ltp mailing list