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