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