1f08c3bdfSopenharmony_ci/******************************************************************************/ 2f08c3bdfSopenharmony_ci/* */ 3f08c3bdfSopenharmony_ci/* Copyright (c) International Business Machines Corp., 2007 */ 4f08c3bdfSopenharmony_ci/* Copyright (c) Linux Test Project, 2016 */ 5f08c3bdfSopenharmony_ci/* */ 6f08c3bdfSopenharmony_ci/* This program is free software: you can redistribute it and/or modify */ 7f08c3bdfSopenharmony_ci/* it under the terms of the GNU General Public License as published by */ 8f08c3bdfSopenharmony_ci/* the Free Software Foundation, either version 3 of the License, or */ 9f08c3bdfSopenharmony_ci/* (at your option) any later version. */ 10f08c3bdfSopenharmony_ci/* */ 11f08c3bdfSopenharmony_ci/* This program is distributed in the hope that it will be useful, */ 12f08c3bdfSopenharmony_ci/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ 13f08c3bdfSopenharmony_ci/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ 14f08c3bdfSopenharmony_ci/* GNU General Public License for more details. */ 15f08c3bdfSopenharmony_ci/* */ 16f08c3bdfSopenharmony_ci/* You should have received a copy of the GNU General Public License */ 17f08c3bdfSopenharmony_ci/* along with this program. If not, see <http://www.gnu.org/licenses/>. */ 18f08c3bdfSopenharmony_ci/* */ 19f08c3bdfSopenharmony_ci/******************************************************************************/ 20f08c3bdfSopenharmony_ci 21f08c3bdfSopenharmony_ci/******************************************************************************/ 22f08c3bdfSopenharmony_ci/* */ 23f08c3bdfSopenharmony_ci/* File: support_numa.c */ 24f08c3bdfSopenharmony_ci/* */ 25f08c3bdfSopenharmony_ci/* Description: Allocates memory and touches it to verify numa */ 26f08c3bdfSopenharmony_ci/* */ 27f08c3bdfSopenharmony_ci/* Author: Sivakumar Chinnaiah Sivakumar.C@in.ibm.com */ 28f08c3bdfSopenharmony_ci/* */ 29f08c3bdfSopenharmony_ci/******************************************************************************/ 30f08c3bdfSopenharmony_ci 31f08c3bdfSopenharmony_ci#include <stdio.h> 32f08c3bdfSopenharmony_ci#include <stdlib.h> 33f08c3bdfSopenharmony_ci#include <errno.h> 34f08c3bdfSopenharmony_ci#include <unistd.h> 35f08c3bdfSopenharmony_ci#include <signal.h> 36f08c3bdfSopenharmony_ci#include <limits.h> 37f08c3bdfSopenharmony_ci#include <string.h> 38f08c3bdfSopenharmony_ci#include <sys/types.h> 39f08c3bdfSopenharmony_ci#include <sys/stat.h> 40f08c3bdfSopenharmony_ci#include <fcntl.h> 41f08c3bdfSopenharmony_ci#include "lapi/mmap.h" 42f08c3bdfSopenharmony_ci 43f08c3bdfSopenharmony_ci/* Global Variables */ 44f08c3bdfSopenharmony_ci#define MB (1<<20) 45f08c3bdfSopenharmony_ci#define PAGE_SIZE getpagesize() 46f08c3bdfSopenharmony_ci#define barrier() __asm__ __volatile__("": : :"memory") 47f08c3bdfSopenharmony_ci#define TEST_SFILE "ltp_numa_testfile" 48f08c3bdfSopenharmony_ci#define STR "abcdefghijklmnopqrstuvwxyz12345\n" 49f08c3bdfSopenharmony_ci 50f08c3bdfSopenharmony_cistatic void help(void) 51f08c3bdfSopenharmony_ci{ 52f08c3bdfSopenharmony_ci printf("Input: Describe input arguments to this program\n"); 53f08c3bdfSopenharmony_ci printf(" argv[1] == \"alloc_1MB\" then allocate 1MB of memory\n"); 54f08c3bdfSopenharmony_ci printf(" argv[1] == \"alloc_2HPSZ_THP\" then allocate 2HUGE PAGE SIZE of THP memory\n"); 55f08c3bdfSopenharmony_ci printf(" argv[1] == \"alloc_1huge_page\" then allocate 1HUGE PAGE SIZE of memory\n"); 56f08c3bdfSopenharmony_ci printf(" argv[1] == \"pause\" then pause the program to catch sigint\n"); 57f08c3bdfSopenharmony_ci printf("Exit: On failure - Exits with non-zero value\n"); 58f08c3bdfSopenharmony_ci printf(" On success - exits with 0 exit value\n"); 59f08c3bdfSopenharmony_ci 60f08c3bdfSopenharmony_ci exit(1); 61f08c3bdfSopenharmony_ci} 62f08c3bdfSopenharmony_ci 63f08c3bdfSopenharmony_cistatic int read_hugepagesize(void) 64f08c3bdfSopenharmony_ci{ 65f08c3bdfSopenharmony_ci FILE *fp; 66f08c3bdfSopenharmony_ci char line[BUFSIZ], buf[BUFSIZ]; 67f08c3bdfSopenharmony_ci int val; 68f08c3bdfSopenharmony_ci 69f08c3bdfSopenharmony_ci fp = fopen("/proc/meminfo", "r"); 70f08c3bdfSopenharmony_ci if (fp == NULL) { 71f08c3bdfSopenharmony_ci fprintf(stderr, "Failed to open /proc/meminfo"); 72f08c3bdfSopenharmony_ci return 0; 73f08c3bdfSopenharmony_ci } 74f08c3bdfSopenharmony_ci 75f08c3bdfSopenharmony_ci while (fgets(line, BUFSIZ, fp) != NULL) { 76f08c3bdfSopenharmony_ci if (sscanf(line, "%64s %d", buf, &val) == 2) 77f08c3bdfSopenharmony_ci if (strcmp(buf, "Hugepagesize:") == 0) { 78f08c3bdfSopenharmony_ci fclose(fp); 79f08c3bdfSopenharmony_ci return 1024 * val; 80f08c3bdfSopenharmony_ci } 81f08c3bdfSopenharmony_ci } 82f08c3bdfSopenharmony_ci 83f08c3bdfSopenharmony_ci fclose(fp); 84f08c3bdfSopenharmony_ci fprintf(stderr, "can't find \"%s\" in %s", "Hugepagesize:", "/proc/meminfo"); 85f08c3bdfSopenharmony_ci 86f08c3bdfSopenharmony_ci return 0; 87f08c3bdfSopenharmony_ci} 88f08c3bdfSopenharmony_ci 89f08c3bdfSopenharmony_ciint main(int argc, char *argv[]) 90f08c3bdfSopenharmony_ci{ 91f08c3bdfSopenharmony_ci int i, hpsz; 92f08c3bdfSopenharmony_ci char *buf = NULL; 93f08c3bdfSopenharmony_ci 94f08c3bdfSopenharmony_ci if (argc != 2) { 95f08c3bdfSopenharmony_ci fprintf(stderr, "Here expect only one number(i.e. 2) as the parameter\n"); 96f08c3bdfSopenharmony_ci exit(1); 97f08c3bdfSopenharmony_ci } 98f08c3bdfSopenharmony_ci 99f08c3bdfSopenharmony_ci if (!strcmp(argv[1], "alloc_1MB")) { 100f08c3bdfSopenharmony_ci buf = malloc(MB); 101f08c3bdfSopenharmony_ci if (!buf) { 102f08c3bdfSopenharmony_ci fprintf(stderr, "Memory is not available\n"); 103f08c3bdfSopenharmony_ci exit(1); 104f08c3bdfSopenharmony_ci } 105f08c3bdfSopenharmony_ci for (i = 0; i < MB; i += PAGE_SIZE) { 106f08c3bdfSopenharmony_ci buf[i] = 'a'; 107f08c3bdfSopenharmony_ci barrier(); 108f08c3bdfSopenharmony_ci } 109f08c3bdfSopenharmony_ci 110f08c3bdfSopenharmony_ci raise(SIGSTOP); 111f08c3bdfSopenharmony_ci 112f08c3bdfSopenharmony_ci free(buf); 113f08c3bdfSopenharmony_ci } else if (!strcmp(argv[1], "alloc_2HPSZ_THP")) { 114f08c3bdfSopenharmony_ci ssize_t size = 2 * read_hugepagesize(); 115f08c3bdfSopenharmony_ci if (size == 0) 116f08c3bdfSopenharmony_ci exit(1); 117f08c3bdfSopenharmony_ci 118f08c3bdfSopenharmony_ci buf = mmap(NULL, size, PROT_READ | PROT_WRITE, 119f08c3bdfSopenharmony_ci MAP_PRIVATE | MAP_ANONYMOUS, 120f08c3bdfSopenharmony_ci -1, 0); 121f08c3bdfSopenharmony_ci if (buf == MAP_FAILED) { 122f08c3bdfSopenharmony_ci perror("mmap failed"); 123f08c3bdfSopenharmony_ci exit(1); 124f08c3bdfSopenharmony_ci } 125f08c3bdfSopenharmony_ci 126f08c3bdfSopenharmony_ci memset(buf, 'a', size); 127f08c3bdfSopenharmony_ci 128f08c3bdfSopenharmony_ci raise(SIGSTOP); 129f08c3bdfSopenharmony_ci 130f08c3bdfSopenharmony_ci munmap(buf, size); 131f08c3bdfSopenharmony_ci } else if (!strcmp(argv[1], "alloc_1huge_page")) { 132f08c3bdfSopenharmony_ci hpsz = read_hugepagesize(); 133f08c3bdfSopenharmony_ci if (hpsz == 0) 134f08c3bdfSopenharmony_ci exit(1); 135f08c3bdfSopenharmony_ci 136f08c3bdfSopenharmony_ci buf = mmap(NULL, hpsz, PROT_READ | PROT_WRITE, 137f08c3bdfSopenharmony_ci MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, 138f08c3bdfSopenharmony_ci -1, 0); 139f08c3bdfSopenharmony_ci 140f08c3bdfSopenharmony_ci if (buf == MAP_FAILED) { 141f08c3bdfSopenharmony_ci perror("mmap failed"); 142f08c3bdfSopenharmony_ci exit(1); 143f08c3bdfSopenharmony_ci } 144f08c3bdfSopenharmony_ci 145f08c3bdfSopenharmony_ci memset(buf, 'a', hpsz); 146f08c3bdfSopenharmony_ci 147f08c3bdfSopenharmony_ci raise(SIGSTOP); 148f08c3bdfSopenharmony_ci 149f08c3bdfSopenharmony_ci munmap(buf, hpsz); 150f08c3bdfSopenharmony_ci } else if (!strcmp(argv[1], "pause")) { 151f08c3bdfSopenharmony_ci raise(SIGSTOP); 152f08c3bdfSopenharmony_ci } else { 153f08c3bdfSopenharmony_ci help(); 154f08c3bdfSopenharmony_ci } 155f08c3bdfSopenharmony_ci 156f08c3bdfSopenharmony_ci return 0; 157f08c3bdfSopenharmony_ci} 158