1f08c3bdfSopenharmony_ci/******************************************************************************/
2f08c3bdfSopenharmony_ci/*                                                                            */
3f08c3bdfSopenharmony_ci/* Copyright (c) International Business Machines  Corp., 2008                 */
4f08c3bdfSopenharmony_ci/*                                                                            */
5f08c3bdfSopenharmony_ci/* This program is free software;  you can redistribute it and/or modify      */
6f08c3bdfSopenharmony_ci/* it under the terms of the GNU General Public License as published by       */
7f08c3bdfSopenharmony_ci/* the Free Software Foundation; either version 2 of the License, or          */
8f08c3bdfSopenharmony_ci/* (at your option) any later version.                                        */
9f08c3bdfSopenharmony_ci/*                                                                            */
10f08c3bdfSopenharmony_ci/* This program is distributed in the hope that it will be useful,            */
11f08c3bdfSopenharmony_ci/* but WITHOUT ANY WARRANTY;  without even the implied warranty of            */
12f08c3bdfSopenharmony_ci/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See                  */
13f08c3bdfSopenharmony_ci/* the GNU General Public License for more details.                           */
14f08c3bdfSopenharmony_ci/*                                                                            */
15f08c3bdfSopenharmony_ci/* You should have received a copy of the GNU General Public License          */
16f08c3bdfSopenharmony_ci/* along with this program;  if not, write to the Free Software               */
17f08c3bdfSopenharmony_ci/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    */
18f08c3bdfSopenharmony_ci/*                                                                            */
19f08c3bdfSopenharmony_ci/******************************************************************************/
20f08c3bdfSopenharmony_ci
21f08c3bdfSopenharmony_ci/******************************************************************************/
22f08c3bdfSopenharmony_ci/*                                                                            */
23f08c3bdfSopenharmony_ci/* File:        memctl_test01.c                                               */
24f08c3bdfSopenharmony_ci/*                                                                            */
25f08c3bdfSopenharmony_ci/* Description: This is a c program that allocates memory in chunks of size   */
26f08c3bdfSopenharmony_ci/*              as given by the calling script. The program touches all the   */
27f08c3bdfSopenharmony_ci/*              allocated pages by writing a string on each page.             */
28f08c3bdfSopenharmony_ci/*                                                                            */
29f08c3bdfSopenharmony_ci/* Total Tests: 3                                                             */
30f08c3bdfSopenharmony_ci/*                                                                            */
31f08c3bdfSopenharmony_ci/* Test Name:   mem_controller_test01-03                                      */
32f08c3bdfSopenharmony_ci/*                                                                            */
33f08c3bdfSopenharmony_ci/*                                                                            */
34f08c3bdfSopenharmony_ci/* Test Assertion                                                             */
35f08c3bdfSopenharmony_ci/*              Please refer to the file memctl_testplan.txt                  */
36f08c3bdfSopenharmony_ci/*                                                                            */
37f08c3bdfSopenharmony_ci/* Author:      Sudhir Kumar skumar@linux.vnet.ibm.com                        */
38f08c3bdfSopenharmony_ci/*                                                                            */
39f08c3bdfSopenharmony_ci/* History:                                                                   */
40f08c3bdfSopenharmony_ci/* Created      12/03/2008  Sudhir Kumar <skumar@linux.vnet.ibm.com>          */
41f08c3bdfSopenharmony_ci/* Modified     11/05/2008  Sudhir Kumar <skumar@linux.vnet.ibm.com>          */
42f08c3bdfSopenharmony_ci/*                                                                            */
43f08c3bdfSopenharmony_ci/******************************************************************************/
44f08c3bdfSopenharmony_ci
45f08c3bdfSopenharmony_ci#include <stdio.h>
46f08c3bdfSopenharmony_ci#include <string.h>
47f08c3bdfSopenharmony_ci#include <unistd.h>
48f08c3bdfSopenharmony_ci
49f08c3bdfSopenharmony_ci#include "libcontrollers.h"
50f08c3bdfSopenharmony_ci#include "test.h"
51f08c3bdfSopenharmony_ci
52f08c3bdfSopenharmony_cichar *TCID = "memory_controller_test01-03";
53f08c3bdfSopenharmony_ciint TST_TOTAL = 3;
54f08c3bdfSopenharmony_ci
55f08c3bdfSopenharmony_cipid_t scriptpid;
56f08c3bdfSopenharmony_citypedef size_t record_t;
57f08c3bdfSopenharmony_cirecord_t **array_of_chunks;
58f08c3bdfSopenharmony_cirecord_t tmp;
59f08c3bdfSopenharmony_ciint num_of_chunks, chunk_size, test_num, limit;
60f08c3bdfSopenharmony_ci
61f08c3bdfSopenharmony_civoid cleanup();
62f08c3bdfSopenharmony_civoid signal_handler_sigusr1(int signal);
63f08c3bdfSopenharmony_civoid signal_handler_sigusr2(int signal);
64f08c3bdfSopenharmony_ciint allocate_memory(void);
65f08c3bdfSopenharmony_ci
66f08c3bdfSopenharmony_ciint main(void)
67f08c3bdfSopenharmony_ci{
68f08c3bdfSopenharmony_ci	int ret;
69f08c3bdfSopenharmony_ci	char mygroup[FILENAME_MAX], mytaskfile[FILENAME_MAX];
70f08c3bdfSopenharmony_ci	char *mygroup_p, *script_pid_p, *test_num_p, *chunk_size_p;
71f08c3bdfSopenharmony_ci	char *num_chunks_p;
72f08c3bdfSopenharmony_ci	struct sigaction newaction1, newaction2, oldaction1, oldaction2;
73f08c3bdfSopenharmony_ci
74f08c3bdfSopenharmony_ci	/* Capture variables from the script environment */
75f08c3bdfSopenharmony_ci	test_num_p = getenv("TEST_NUM");
76f08c3bdfSopenharmony_ci	mygroup_p = getenv("MYGROUP");
77f08c3bdfSopenharmony_ci	script_pid_p = getenv("SCRIPT_PID");
78f08c3bdfSopenharmony_ci	chunk_size_p = getenv("CHUNK_SIZE");
79f08c3bdfSopenharmony_ci	num_chunks_p = getenv("NUM_CHUNKS");
80f08c3bdfSopenharmony_ci
81f08c3bdfSopenharmony_ci	if (test_num_p != NULL && mygroup_p != NULL && script_pid_p != NULL &&
82f08c3bdfSopenharmony_ci	    chunk_size_p != NULL && num_chunks_p != NULL) {
83f08c3bdfSopenharmony_ci		scriptpid = atoi(script_pid_p);
84f08c3bdfSopenharmony_ci		test_num = atoi(test_num_p);
85f08c3bdfSopenharmony_ci		chunk_size = atoi(chunk_size_p);
86f08c3bdfSopenharmony_ci		num_of_chunks = atoi(num_chunks_p);
87f08c3bdfSopenharmony_ci		sprintf(mygroup, "%s", mygroup_p);
88f08c3bdfSopenharmony_ci	} else {
89f08c3bdfSopenharmony_ci		tst_brkm(TBROK, cleanup,
90f08c3bdfSopenharmony_ci			 "invalid parameters received from script\n");
91f08c3bdfSopenharmony_ci	}
92f08c3bdfSopenharmony_ci
93f08c3bdfSopenharmony_ci	/* XXX (garrcoop): this section really needs error handling. */
94f08c3bdfSopenharmony_ci
95f08c3bdfSopenharmony_ci	/* Signal handling for SIGUSR1 received from script */
96f08c3bdfSopenharmony_ci	sigemptyset(&newaction1.sa_mask);
97f08c3bdfSopenharmony_ci	newaction1.sa_handler = signal_handler_sigusr1;
98f08c3bdfSopenharmony_ci	newaction1.sa_flags = 0;
99f08c3bdfSopenharmony_ci	sigaction(SIGUSR1, &newaction1, &oldaction1);
100f08c3bdfSopenharmony_ci
101f08c3bdfSopenharmony_ci	/* Signal handling for SIGUSR2 received from script */
102f08c3bdfSopenharmony_ci	sigemptyset(&newaction2.sa_mask);
103f08c3bdfSopenharmony_ci	newaction2.sa_handler = signal_handler_sigusr2;
104f08c3bdfSopenharmony_ci	newaction2.sa_flags = 0;
105f08c3bdfSopenharmony_ci	sigaction(SIGUSR2, &newaction2, &oldaction2);
106f08c3bdfSopenharmony_ci
107f08c3bdfSopenharmony_ci	sprintf(mytaskfile, "%s", mygroup);
108f08c3bdfSopenharmony_ci	strcat(mytaskfile, "/tasks");
109f08c3bdfSopenharmony_ci	/* Assign the task to it's group */
110f08c3bdfSopenharmony_ci	write_to_file(mytaskfile, "a", getpid());	/* Assign the task to it's group */
111f08c3bdfSopenharmony_ci
112f08c3bdfSopenharmony_ci	ret = allocate_memory();	/*should i check ret? */
113f08c3bdfSopenharmony_ci
114f08c3bdfSopenharmony_ci	cleanup();
115f08c3bdfSopenharmony_ci
116f08c3bdfSopenharmony_ci	tst_exit();
117f08c3bdfSopenharmony_ci}
118f08c3bdfSopenharmony_ci
119f08c3bdfSopenharmony_ci/*
120f08c3bdfSopenharmony_ci * Function: cleanup()
121f08c3bdfSopenharmony_ci * signals for system cleanup in case test breaks
122f08c3bdfSopenharmony_ci */
123f08c3bdfSopenharmony_civoid cleanup(void)
124f08c3bdfSopenharmony_ci{
125f08c3bdfSopenharmony_ci	if (kill(scriptpid, SIGUSR1) == -1)
126f08c3bdfSopenharmony_ci		tst_resm(TWARN | TERRNO, "kill failed");
127f08c3bdfSopenharmony_ci}
128f08c3bdfSopenharmony_ci
129f08c3bdfSopenharmony_ci/*
130f08c3bdfSopenharmony_ci * Function: signal_handler_sigusr1()
131f08c3bdfSopenharmony_ci * signal handler for the new action
132f08c3bdfSopenharmony_ci */
133f08c3bdfSopenharmony_ci
134f08c3bdfSopenharmony_civoid signal_handler_sigusr1(int signal)
135f08c3bdfSopenharmony_ci{
136f08c3bdfSopenharmony_ci	int i;
137f08c3bdfSopenharmony_ci	(void) signal;
138f08c3bdfSopenharmony_ci	for (i = 0; i < num_of_chunks; ++i)
139f08c3bdfSopenharmony_ci		free(array_of_chunks[i]);
140f08c3bdfSopenharmony_ci	free(array_of_chunks);
141f08c3bdfSopenharmony_ci	exit(0);
142f08c3bdfSopenharmony_ci}
143f08c3bdfSopenharmony_ci
144f08c3bdfSopenharmony_ci/*
145f08c3bdfSopenharmony_ci * Function: signal_handler_sigusr2()
146f08c3bdfSopenharmony_ci * signal handler for the new action
147f08c3bdfSopenharmony_ci */
148f08c3bdfSopenharmony_ci
149f08c3bdfSopenharmony_civoid signal_handler_sigusr2(int signal)
150f08c3bdfSopenharmony_ci{
151f08c3bdfSopenharmony_ci	int i;
152f08c3bdfSopenharmony_ci	(void) signal;
153f08c3bdfSopenharmony_ci	for (i = 0; i < num_of_chunks; ++i)
154f08c3bdfSopenharmony_ci		free(array_of_chunks[i]);
155f08c3bdfSopenharmony_ci	free(array_of_chunks);
156f08c3bdfSopenharmony_ci	if (test_num == 4) {
157f08c3bdfSopenharmony_ci		/* Allocate different amount of memory for second step */
158f08c3bdfSopenharmony_ci		chunk_size = 5242880;	/* 5 MB chunks */
159f08c3bdfSopenharmony_ci		num_of_chunks = 15;
160f08c3bdfSopenharmony_ci	}
161f08c3bdfSopenharmony_ci	allocate_memory();
162f08c3bdfSopenharmony_ci}
163f08c3bdfSopenharmony_ci
164f08c3bdfSopenharmony_ciint allocate_memory(void)
165f08c3bdfSopenharmony_ci{
166f08c3bdfSopenharmony_ci	int i, j;
167f08c3bdfSopenharmony_ci	/*
168f08c3bdfSopenharmony_ci	 * Allocate array which contains base addresses of all chunks
169f08c3bdfSopenharmony_ci	 */
170f08c3bdfSopenharmony_ci	array_of_chunks = malloc(sizeof(record_t *) * num_of_chunks);
171f08c3bdfSopenharmony_ci	if (array_of_chunks == NULL)
172f08c3bdfSopenharmony_ci		tst_brkm(TBROK, cleanup,
173f08c3bdfSopenharmony_ci			 "Memory allocation failed for array_of_chunks");
174f08c3bdfSopenharmony_ci	/*
175f08c3bdfSopenharmony_ci	 * Allocate chunks of memory
176f08c3bdfSopenharmony_ci	 */
177f08c3bdfSopenharmony_ci
178f08c3bdfSopenharmony_ci	for (i = 0; i < num_of_chunks; ++i) {
179f08c3bdfSopenharmony_ci		array_of_chunks[i] = malloc(chunk_size);
180f08c3bdfSopenharmony_ci		if (array_of_chunks[i] == NULL)
181f08c3bdfSopenharmony_ci			tst_brkm(TBROK, cleanup,
182f08c3bdfSopenharmony_ci				 "Memory allocation failed for chunks. Try smaller chunk size");
183f08c3bdfSopenharmony_ci	}
184f08c3bdfSopenharmony_ci
185f08c3bdfSopenharmony_ci	/*
186f08c3bdfSopenharmony_ci	 * Touch all the pages of allocated memory by writing some string
187f08c3bdfSopenharmony_ci	 */
188f08c3bdfSopenharmony_ci	limit = chunk_size / sizeof(record_t);
189f08c3bdfSopenharmony_ci
190f08c3bdfSopenharmony_ci	for (i = 0; i < num_of_chunks; ++i)
191f08c3bdfSopenharmony_ci		for (j = 0; j < limit; ++j)
192f08c3bdfSopenharmony_ci			array_of_chunks[i][j] = 0xaa;
193f08c3bdfSopenharmony_ci
194f08c3bdfSopenharmony_ci	/*
195f08c3bdfSopenharmony_ci	 * Just keep on accessing the allocated pages and do nothing relevant
196f08c3bdfSopenharmony_ci	 */
197f08c3bdfSopenharmony_ci	while (1) {
198f08c3bdfSopenharmony_ci		for (i = 0; i < num_of_chunks; ++i)
199f08c3bdfSopenharmony_ci			for (j = 0; j < limit; ++j)
200f08c3bdfSopenharmony_ci				tmp = array_of_chunks[i][j];
201f08c3bdfSopenharmony_ci	}
202f08c3bdfSopenharmony_ci	return 0;
203f08c3bdfSopenharmony_ci}
204