| // SPDX-License-Identifier: LGPL-2.1-or-later |
| /* |
| * Copyright (C) 2005-2006 IBM Corporation. |
| * Author: David Gibson & Adam Litke |
| */ |
| |
| /*\ |
| * [Description] |
| * |
| * This baseline test validates that a mapping of a certain size can be |
| * created, correctly. Once created, all the pages are filled with a |
| * pattern and rechecked to test for corruption. The mapping is then |
| * released. This process is repeated for a specified number of |
| * iterations. |
| */ |
| |
| #include "hugetlb.h" |
| |
| #define NR_HUGEPAGES 2 |
| #define MNTPOINT "hugetlbfs/" |
| |
| static unsigned long hpage_size; |
| static int fd = -1; |
| |
| static void run_test(unsigned int iter) |
| { |
| char *m; |
| size_t i, j; |
| char pattern = 'A'; |
| size_t size = NR_HUGEPAGES*hpage_size; |
| |
| fd = tst_creat_unlinked(MNTPOINT, 0); |
| m = SAFE_MMAP(NULL, size, (PROT_READ|PROT_WRITE), MAP_SHARED, fd, 0); |
| |
| for (i = 0; i < NR_HUGEPAGES; i++) { |
| for (j = 0; j < hpage_size; j++) { |
| if (*(m+(i*hpage_size)+j) != 0) { |
| tst_res(TFAIL, "Iter %u: Verifying the mmap area failed. " |
| "Got %c, expected 0", iter, |
| *(m+(i*hpage_size)+j)); |
| goto cleanup; |
| } |
| } |
| } |
| |
| for (i = 0; i < NR_HUGEPAGES; i++) { |
| pattern = 65+(i%26); |
| memset(m+(i*hpage_size), pattern, hpage_size); |
| } |
| |
| for (i = 0; i < NR_HUGEPAGES; i++) { |
| pattern = 65+(i%26); |
| for (j = 0; j < hpage_size; j++) { |
| if (*(m+(i*hpage_size)+j) != pattern) { |
| tst_res(TFAIL, "Iter %u: Verifying the mmap area failed. " |
| "got: %c, expected: %c", iter, |
| *(m+(i*hpage_size)+j), pattern); |
| goto cleanup; |
| } |
| } |
| } |
| |
| tst_res(TPASS, "Iter %u: Successfully verified the mmap area.", iter); |
| |
| cleanup: |
| SAFE_MUNMAP(m, size); |
| SAFE_CLOSE(fd); |
| } |
| |
| static void setup(void) |
| { |
| hpage_size = tst_get_hugepage_size(); |
| } |
| |
| static void cleanup(void) |
| { |
| if (fd >= 0) |
| SAFE_CLOSE(fd); |
| } |
| |
| static struct tst_test test = { |
| .tcnt = 2, |
| .needs_root = 1, |
| .mntpoint = MNTPOINT, |
| .needs_hugetlbfs = 1, |
| .needs_tmpdir = 1, |
| .setup = setup, |
| .cleanup = cleanup, |
| .test = run_test, |
| .hugepages = {NR_HUGEPAGES, TST_NEEDS}, |
| }; |