Skip to content

Commit

Permalink
Migrating the libhugetlbfs/testcases/shm-gettest.c test
Browse files Browse the repository at this point in the history
Test Description: This testcase creates shared memory segments
backed by hugepages, writes  specific patterns to each segment,
verifies pattern and detaches a shared memory segments in a loop.

This looping test was added to verify the functionality of
large page backed shared memory segments. A segment is created,
written, verified, and detached a specified number of times.

Signed-off-by: Sachin P Bappalige <[email protected]>
Reviewed-by: Cyril Hrubis <[email protected]>
  • Loading branch information
Sachin P Bappalige authored and metan-ucw committed Sep 10, 2024
1 parent cc9730e commit 7210022
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 0 deletions.
1 change: 1 addition & 0 deletions runtest/hugetlb
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,4 @@ hugeshmget01 hugeshmget01 -i 10
hugeshmget02 hugeshmget02 -i 10
hugeshmget03 hugeshmget03 -i 10
hugeshmget05 hugeshmget05 -i 10
hugeshmget06 hugeshmget06 -i 10
1 change: 1 addition & 0 deletions testcases/kernel/mem/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
/hugetlb/hugeshmget/hugeshmget02
/hugetlb/hugeshmget/hugeshmget03
/hugetlb/hugeshmget/hugeshmget05
/hugetlb/hugeshmget/hugeshmget06
/ksm/ksm01
/ksm/ksm02
/ksm/ksm03
Expand Down
76 changes: 76 additions & 0 deletions testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget06.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2005-2006, IBM Corporation.
* Author: David Gibson & Adam Litke
*/

/*\
* [Description]
*
* This testcase creates shared memory segments backed by hugepages,
* writes specific patterns to each segment, verifies pattern,
* and detaches a shared memory segments in a loop.
* It ensures that the hugepage backed shared memory functionalities
* works correctly by validating the data written to segment.
*/

#include "hugetlb.h"
#include "tst_safe_sysv_ipc.h"

#define NR_HUGEPAGES 4

static long hpage_size;
static int shmid = -1;

static void run_test(void)
{
size_t i, j;
char pattern;
char *shmaddr;

shmaddr = SAFE_SHMAT(shmid, 0, SHM_RND);
tst_res(TINFO, "shmaddr: %p", shmaddr);

for (i = 0; i < NR_HUGEPAGES; i++) {
pattern = 65 + (i % 26);
tst_res(TDEBUG, "Touching %p with %c",
shmaddr + (i * hpage_size), pattern);
memset(shmaddr + (i * hpage_size), pattern, hpage_size);
}

for (i = 0; i < NR_HUGEPAGES; i++) {
pattern = 65 + (i % 26);
tst_res(TDEBUG, "Verifying %p", (shmaddr + (i * hpage_size)));
for (j = 0; j < (size_t)hpage_size; j++)
if (*(shmaddr + (i * hpage_size) + j) != pattern) {
tst_res(TFAIL, "Got wrong byte 0x%02x expected 0x%02x",
*(shmaddr + (i * hpage_size) + j),
pattern);
return;
}
}
SAFE_SHMDT((const void *)shmaddr);
tst_res(TPASS, "shm hugepages works correctly");
}

static void setup(void)
{
hpage_size = tst_get_hugepage_size();
tst_res(TINFO, "hugepage size is %ld", hpage_size);
shmid = SAFE_SHMGET(IPC_PRIVATE, NR_HUGEPAGES * hpage_size, SHM_HUGETLB|IPC_CREAT|SHM_R|SHM_W);
tst_res(TINFO, "shmid: 0x%x", shmid);
}

static void cleanup(void)
{
if (shmid >= 0)
SAFE_SHMCTL(shmid, IPC_RMID, NULL);
}

static struct tst_test test = {
.needs_root = 1,
.setup = setup,
.cleanup = cleanup,
.test_all = run_test,
.hugepages = {NR_HUGEPAGES, TST_NEEDS},
};

0 comments on commit 7210022

Please sign in to comment.