1*716fd348SMartin Matuska /* 2*716fd348SMartin Matuska * CDDL HEADER START 3*716fd348SMartin Matuska * 4*716fd348SMartin Matuska * The contents of this file are subject to the terms of the 5*716fd348SMartin Matuska * Common Development and Distribution License (the "License"). 6*716fd348SMartin Matuska * You may not use this file except in compliance with the License. 7*716fd348SMartin Matuska * 8*716fd348SMartin Matuska * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*716fd348SMartin Matuska * or http://opensource.org/licenses/CDDL-1.0. 10*716fd348SMartin Matuska * See the License for the specific language governing permissions 11*716fd348SMartin Matuska * and limitations under the License. 12*716fd348SMartin Matuska * 13*716fd348SMartin Matuska * When distributing Covered Code, include this CDDL HEADER in each 14*716fd348SMartin Matuska * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*716fd348SMartin Matuska * If applicable, add the following below this CDDL HEADER, with the 16*716fd348SMartin Matuska * fields enclosed by brackets "[]" replaced with your own identifying 17*716fd348SMartin Matuska * information: Portions Copyright [yyyy] [name of copyright owner] 18*716fd348SMartin Matuska * 19*716fd348SMartin Matuska * CDDL HEADER END 20*716fd348SMartin Matuska */ 21*716fd348SMartin Matuska 22*716fd348SMartin Matuska #include <stdlib.h> 23*716fd348SMartin Matuska #include <stdio.h> 24*716fd348SMartin Matuska #include <string.h> 25*716fd348SMartin Matuska #include <sys/mman.h> 26*716fd348SMartin Matuska #include <sys/stat.h> 27*716fd348SMartin Matuska #include <sys/time.h> 28*716fd348SMartin Matuska #include <fcntl.h> 29*716fd348SMartin Matuska #include <unistd.h> 30*716fd348SMartin Matuska #include <time.h> 31*716fd348SMartin Matuska 32*716fd348SMartin Matuska static void 33*716fd348SMartin Matuska cleanup(char *file) 34*716fd348SMartin Matuska { 35*716fd348SMartin Matuska remove(file); 36*716fd348SMartin Matuska } 37*716fd348SMartin Matuska 38*716fd348SMartin Matuska int 39*716fd348SMartin Matuska main(int argc, char *argv[]) 40*716fd348SMartin Matuska { 41*716fd348SMartin Matuska char *testdir = getenv("TESTDIR"); 42*716fd348SMartin Matuska if (!testdir) { 43*716fd348SMartin Matuska fprintf(stderr, "environment variable TESTDIR not set\n"); 44*716fd348SMartin Matuska return (1); 45*716fd348SMartin Matuska } 46*716fd348SMartin Matuska 47*716fd348SMartin Matuska struct stat st; 48*716fd348SMartin Matuska umask(0); 49*716fd348SMartin Matuska if (stat(testdir, &st) != 0 && 50*716fd348SMartin Matuska mkdir(testdir, 0777) != 0) { 51*716fd348SMartin Matuska perror("mkdir"); 52*716fd348SMartin Matuska return (1); 53*716fd348SMartin Matuska } 54*716fd348SMartin Matuska 55*716fd348SMartin Matuska if (argc > 3) { 56*716fd348SMartin Matuska fprintf(stderr, "usage: %s " 57*716fd348SMartin Matuska "[run time in mins] " 58*716fd348SMartin Matuska "[max msync time in ms]\n", argv[0]); 59*716fd348SMartin Matuska return (1); 60*716fd348SMartin Matuska } 61*716fd348SMartin Matuska 62*716fd348SMartin Matuska int run_time_mins = 5; 63*716fd348SMartin Matuska if (argc >= 2) { 64*716fd348SMartin Matuska run_time_mins = atoi(argv[1]); 65*716fd348SMartin Matuska } 66*716fd348SMartin Matuska 67*716fd348SMartin Matuska int max_msync_time_ms = 1000; 68*716fd348SMartin Matuska if (argc >= 3) { 69*716fd348SMartin Matuska max_msync_time_ms = atoi(argv[2]); 70*716fd348SMartin Matuska } 71*716fd348SMartin Matuska 72*716fd348SMartin Matuska char filepath[512]; 73*716fd348SMartin Matuska filepath[0] = '\0'; 74*716fd348SMartin Matuska char *file = &filepath[0]; 75*716fd348SMartin Matuska 76*716fd348SMartin Matuska strcat(file, testdir); 77*716fd348SMartin Matuska strcat(file, "/msync_file"); 78*716fd348SMartin Matuska 79*716fd348SMartin Matuska const int LEN = 8; 80*716fd348SMartin Matuska cleanup(file); 81*716fd348SMartin Matuska 82*716fd348SMartin Matuska int fd = open(file, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR | 83*716fd348SMartin Matuska S_IRGRP | S_IROTH); 84*716fd348SMartin Matuska 85*716fd348SMartin Matuska if (fd == -1) { 86*716fd348SMartin Matuska (void) fprintf(stderr, "%s: %s: ", argv[0], file); 87*716fd348SMartin Matuska perror("open"); 88*716fd348SMartin Matuska return (1); 89*716fd348SMartin Matuska } 90*716fd348SMartin Matuska 91*716fd348SMartin Matuska if (ftruncate(fd, LEN) != 0) { 92*716fd348SMartin Matuska perror("ftruncate"); 93*716fd348SMartin Matuska cleanup(file); 94*716fd348SMartin Matuska return (1); 95*716fd348SMartin Matuska } 96*716fd348SMartin Matuska 97*716fd348SMartin Matuska void *ptr = mmap(NULL, LEN, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 98*716fd348SMartin Matuska 99*716fd348SMartin Matuska if (ptr == MAP_FAILED) { 100*716fd348SMartin Matuska perror("mmap"); 101*716fd348SMartin Matuska cleanup(file); 102*716fd348SMartin Matuska return (1); 103*716fd348SMartin Matuska } 104*716fd348SMartin Matuska 105*716fd348SMartin Matuska struct timeval tstart; 106*716fd348SMartin Matuska gettimeofday(&tstart, NULL); 107*716fd348SMartin Matuska 108*716fd348SMartin Matuska long long x = 0LL; 109*716fd348SMartin Matuska 110*716fd348SMartin Matuska for (;;) { 111*716fd348SMartin Matuska *((long long *)ptr) = x; 112*716fd348SMartin Matuska x++; 113*716fd348SMartin Matuska 114*716fd348SMartin Matuska struct timeval t1, t2; 115*716fd348SMartin Matuska gettimeofday(&t1, NULL); 116*716fd348SMartin Matuska if (msync(ptr, LEN, MS_SYNC|MS_INVALIDATE) != 0) { 117*716fd348SMartin Matuska perror("msync"); 118*716fd348SMartin Matuska cleanup(file); 119*716fd348SMartin Matuska return (1); 120*716fd348SMartin Matuska } 121*716fd348SMartin Matuska 122*716fd348SMartin Matuska gettimeofday(&t2, NULL); 123*716fd348SMartin Matuska 124*716fd348SMartin Matuska double elapsed = (t2.tv_sec - t1.tv_sec) * 1000.0; 125*716fd348SMartin Matuska elapsed += ((t2.tv_usec - t1.tv_usec) / 1000.0); 126*716fd348SMartin Matuska if (elapsed > max_msync_time_ms) { 127*716fd348SMartin Matuska fprintf(stderr, "slow msync: %f ms\n", elapsed); 128*716fd348SMartin Matuska munmap(ptr, LEN); 129*716fd348SMartin Matuska cleanup(file); 130*716fd348SMartin Matuska return (1); 131*716fd348SMartin Matuska } 132*716fd348SMartin Matuska 133*716fd348SMartin Matuska double elapsed_start = (t2.tv_sec - tstart.tv_sec) * 1000.0; 134*716fd348SMartin Matuska elapsed_start += ((t2.tv_usec - tstart.tv_usec) / 1000.0); 135*716fd348SMartin Matuska if (elapsed_start > run_time_mins * 60 * 1000) { 136*716fd348SMartin Matuska break; 137*716fd348SMartin Matuska } 138*716fd348SMartin Matuska } 139*716fd348SMartin Matuska 140*716fd348SMartin Matuska if (munmap(ptr, LEN) != 0) { 141*716fd348SMartin Matuska perror("munmap"); 142*716fd348SMartin Matuska cleanup(file); 143*716fd348SMartin Matuska return (1); 144*716fd348SMartin Matuska } 145*716fd348SMartin Matuska 146*716fd348SMartin Matuska if (close(fd) != 0) { 147*716fd348SMartin Matuska perror("close"); 148*716fd348SMartin Matuska } 149*716fd348SMartin Matuska 150*716fd348SMartin Matuska cleanup(file); 151*716fd348SMartin Matuska return (0); 152*716fd348SMartin Matuska } 153