16acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak/****************************************************************************** 26acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * 31378205b23aad2d399f74f0ab2e97a1cd3f8ecf9subrata_modak * Copyright © International Business Machines Corp., 2006, 2008 46acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * 56acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * This program is free software; you can redistribute it and/or modify 66acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * it under the terms of the GNU General Public License as published by 76acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * the Free Software Foundation; either version 2 of the License, or 86acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * (at your option) any later version. 96acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * 106acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * This program is distributed in the hope that it will be useful, 116acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * but WITHOUT ANY WARRANTY; without even the implied warranty of 126acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 136acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * the GNU General Public License for more details. 146acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * 156acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * You should have received a copy of the GNU General Public License 166acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * along with this program; if not, write to the Free Software 174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 186acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * 196acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * NAME 206acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * gtod_infinite.c 216acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * 226acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * DESCRIPTION 236acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * This 'test' is designed to run forever. It must manually be killed, 246acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * so it is not ideally suited tobe part of a validation suite of tests. 256acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * This test was initially designed to look for 'delays' between two 266acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * calls to clock_gettime(), and helped locate SMI induced delays on 276acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * several hardware platforms. 286acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * 296acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * As mentioned above, this test is designed to be run on a system for 306acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * an unspecified period of time. It would not be unusual to let this 316acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * test run for several days. 326acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * 336acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * During startup, the test will print out the 'maximum' delay between 346acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * clock_gettime() calls. It starts with a predefined maximum of 356acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * START_MAX(300ns) to eliminate noise during startup. In addition, 366acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * it will print out every delay that exceeds REPORT_MIN (1000000ns). 376acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * 386acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * USAGE: 396acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * Use run_auto.sh script in current directory to build and run test. 406acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * 416acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * AUTHOR 426acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * Darren Hart <dvhltc@us.ibm.com> 436acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * 446acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * HISTORY 456acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * 2006-Aug-17: Initial version by Darren Hart <dvhltc@us.ibm.com> 466acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak * 476acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak *****************************************************************************/ 486acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak 496acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak#include <stdio.h> 506acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak#include <stdlib.h> 516acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak#include <time.h> 526acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak#include <sched.h> 536acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak#include <librttest.h> 54573e34845191e12a3c99d7c07ecb77979bc63a1esubrata_modak#include <sys/mman.h> 55503be94bd541805fabdaa662da73682787ee9875subrata_modak#include <unistd.h> 56503be94bd541805fabdaa662da73682787ee9875subrata_modak#include <signal.h> 576acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak 58d7d59695de101af8b218209a8a5eff30f0735450subrata_modak#define CLOCK_TO_USE CLOCK_MONOTONIC 596acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak 606acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak#define START_MAX 3000 616acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak#define REPORT_MIN 1000000 626acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak 63354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic unsigned int max_window = 0; /* infinite, don't use a window */ 64354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic unsigned int test_duration = 0; /* infinite duration */ 65354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic int test_stop = 0; /* 1 to stop */ 666acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak 676acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modakvoid usage(void) 686acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak{ 69ba9a5b94b0384f161070d2376e0f17ec1f1d0ef5subrata_modak rt_help(); 70573e34845191e12a3c99d7c07ecb77979bc63a1esubrata_modak printf("gtod_infinite specific options:\n"); 71354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf 72354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (" -wWINDOW iterations in max value window (default inf)\n"); 73503be94bd541805fabdaa662da73682787ee9875subrata_modak printf(" -tDURATION test duration in finite hours (default inf)\n"); 746acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak} 756acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak 766acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modakint parse_args(int c, char *v) 776acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak{ 78ba9a5b94b0384f161070d2376e0f17ec1f1d0ef5subrata_modak int handled = 1; 79ba9a5b94b0384f161070d2376e0f17ec1f1d0ef5subrata_modak switch (c) { 80354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao case 'h': 81354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao usage(); 82354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao exit(0); 83354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao case 'w': 84354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao max_window = atoi(v); 85354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao break; 86354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao case 't': 87354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao test_duration = atoi(v); 88354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao break; 89354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao default: 90354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao handled = 0; 91354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao break; 92ba9a5b94b0384f161070d2376e0f17ec1f1d0ef5subrata_modak } 93ba9a5b94b0384f161070d2376e0f17ec1f1d0ef5subrata_modak return handled; 946acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak} 956acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak 96503be94bd541805fabdaa662da73682787ee9875subrata_modakvoid alarm_handler(int sig) 97503be94bd541805fabdaa662da73682787ee9875subrata_modak{ 98503be94bd541805fabdaa662da73682787ee9875subrata_modak /* Stop test execution */ 99503be94bd541805fabdaa662da73682787ee9875subrata_modak test_stop = 1; 100503be94bd541805fabdaa662da73682787ee9875subrata_modak} 101503be94bd541805fabdaa662da73682787ee9875subrata_modak 1026acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modakint main(int argc, char *argv[]) 1036acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak{ 104354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao int /* i, */ rc; 1056acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak struct timespec ts, p_ts; 1066acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak nsec_t s_time, e_time, diff_time; 1076acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak nsec_t max_time = START_MAX; 108354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao// cpu_set_t mask; 1096acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak struct sched_param param; 1106acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak time_t tt; 1113bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak unsigned int wi; 112503be94bd541805fabdaa662da73682787ee9875subrata_modak struct sigaction sact; 1136acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak setup(); 1146acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak 115503be94bd541805fabdaa662da73682787ee9875subrata_modak /* Set signal handler for SIGALRM */ 116503be94bd541805fabdaa662da73682787ee9875subrata_modak sigfillset(&sact.sa_mask); 117503be94bd541805fabdaa662da73682787ee9875subrata_modak sact.sa_handler = alarm_handler; 118503be94bd541805fabdaa662da73682787ee9875subrata_modak rc = sigaction(SIGALRM, &sact, NULL); 119503be94bd541805fabdaa662da73682787ee9875subrata_modak if (rc) { 120503be94bd541805fabdaa662da73682787ee9875subrata_modak perror("sigaction"); 121503be94bd541805fabdaa662da73682787ee9875subrata_modak exit(1); 122503be94bd541805fabdaa662da73682787ee9875subrata_modak } 1236acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak/* 124ba9a5b94b0384f161070d2376e0f17ec1f1d0ef5subrata_modak CPU_ZERO(&mask); 125ba9a5b94b0384f161070d2376e0f17ec1f1d0ef5subrata_modak CPU_SET(0, &mask); 126ba9a5b94b0384f161070d2376e0f17ec1f1d0ef5subrata_modak rc = sched_setaffinity(0, sizeof(mask), &mask); 127ba9a5b94b0384f161070d2376e0f17ec1f1d0ef5subrata_modak if (rc) { 1286acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak perror("sched_setaffinity"); 129ba9a5b94b0384f161070d2376e0f17ec1f1d0ef5subrata_modak exit(1); 130ba9a5b94b0384f161070d2376e0f17ec1f1d0ef5subrata_modak } 1316acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak*/ 132503be94bd541805fabdaa662da73682787ee9875subrata_modak rt_init("hw:t:", parse_args, argc, argv); 1336acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak 134354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao mlockall(MCL_CURRENT | MCL_FUTURE); 135573e34845191e12a3c99d7c07ecb77979bc63a1esubrata_modak 1363bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak if (max_window > 0) { 137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao printf("%d iterations in max calculation window\n", max_window); 1383bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak } 1393bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak 140ba9a5b94b0384f161070d2376e0f17ec1f1d0ef5subrata_modak param.sched_priority = sched_get_priority_min(SCHED_FIFO) + 80; 141ba9a5b94b0384f161070d2376e0f17ec1f1d0ef5subrata_modak rc = sched_setscheduler(0, SCHED_FIFO, ¶m); 1426acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak if (rc) { 1436acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak perror("sched_setscheduler"); 1446acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak exit(1); 1456acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak } 1466acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak 1476acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak rc = clock_gettime(CLOCK_TO_USE, &p_ts); 1486acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak if (rc) { 1496acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak perror("clock_gettime"); 1506acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak exit(1); 1516acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak } 1526acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak 153503be94bd541805fabdaa662da73682787ee9875subrata_modak /* Set alarm for test duration, if specified */ 154503be94bd541805fabdaa662da73682787ee9875subrata_modak if (test_duration > 0) { 155354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao rc = alarm(test_duration * 60 * 60); 156503be94bd541805fabdaa662da73682787ee9875subrata_modak if (rc) { 157503be94bd541805fabdaa662da73682787ee9875subrata_modak perror("alarm"); 158503be94bd541805fabdaa662da73682787ee9875subrata_modak exit(1); 159503be94bd541805fabdaa662da73682787ee9875subrata_modak } 160503be94bd541805fabdaa662da73682787ee9875subrata_modak } 161503be94bd541805fabdaa662da73682787ee9875subrata_modak 1623bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak wi = 0; 163df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper while (test_stop != 1) { 164573e34845191e12a3c99d7c07ecb77979bc63a1esubrata_modak rc = clock_gettime(CLOCK_TO_USE, &p_ts); 1656acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak rc = clock_gettime(CLOCK_TO_USE, &ts); 1666acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak if (rc) { 1676acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak perror("clock_gettime"); 1686acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak exit(1); 1696acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak } 1706acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak 1716acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak ts_to_nsec(&p_ts, &s_time); 172ba9a5b94b0384f161070d2376e0f17ec1f1d0ef5subrata_modak ts_to_nsec(&ts, &e_time); 1736acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak 1746acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak diff_time = e_time - s_time; 1753bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak 1763bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak if (max_window > 0 || 177354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao ((diff_time > max_time) || (diff_time > REPORT_MIN))) { 1786acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak if (diff_time > max_time) 1796acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak max_time = diff_time; 180573e34845191e12a3c99d7c07ecb77979bc63a1esubrata_modak 1813bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak if (max_window == 0 || ++wi == max_window) { 182354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tt = (time_t) ts.tv_sec; 1833bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak printf("Task delayed for %lld nsec!!! %s", 1843bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak max_time, ctime(&tt)); 1853bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak fflush(stdout); 1863bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak 1873bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak if (wi == max_window) { 1883bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak max_time = 0; 1893bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak wi = 0; 1903bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak } 1913bfea97aab99e85f83066f47bb842cb5f6190e7bsubrata_modak } 1926acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak 1936acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak } 1946acdc8efa73ceb0c3b515cd34c333d929e8b4273subrata_modak } 19537550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman 196ef78227f9275d780649e14a8785c6913c18b7462Cyril Hrubis return 0; 197ef78227f9275d780649e14a8785c6913c18b7462Cyril Hrubis} 198