1c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis/* 2c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * Copyright (c) 2017 Cyril Hrubis <chrubis@suse.cz> 3c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * 4c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * This program is free software: you can redistribute it and/or modify 5c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * it under the terms of the GNU General Public License as published by 6c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * the Free Software Foundation, either version 2 of the License, or 7c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * (at your option) any later version. 8c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * 9c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * This program is distributed in the hope that it will be useful, 10c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * but WITHOUT ANY WARRANTY; without even the implied warranty of 11c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * GNU General Public License for more details. 13c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * 14c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * You should have received a copy of the GNU General Public License 15c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * along with this program. If not, see <http://www.gnu.org/licenses/>. 16c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis */ 17c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 18c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis#include <sys/prctl.h> 19c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis#include <stdlib.h> 20c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis#include <stdio.h> 21c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis#include <limits.h> 22c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 23c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis#define TST_NO_DEFAULT_MAIN 24c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis#include "tst_test.h" 25ab6b5f5d36bb05a5894e583c155baccd448f4712Cyril Hrubis#include "tst_clocks.h" 26c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis#include "tst_timer_test.h" 27c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 28c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis#define MAX_SAMPLES 500 29c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 30c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic const char *scall; 31c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic void (*setup)(void); 32c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic void (*cleanup)(void); 33c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic int (*sample)(int clk_id, long long usec); 34c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic struct tst_test *test; 35c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 36c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic long long *samples; 37c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic unsigned int cur_sample; 38c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic unsigned int monotonic_resolution; 39c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic unsigned int timerslack; 40c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 41c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic char *print_frequency_plot; 42c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic char *file_name; 43c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic char *str_sleep_time; 44c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic char *str_sample_cnt; 45c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic int sleep_time = -1; 46c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic int sample_cnt; 47c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 48c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic void print_line(char c, int len) 49c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 50c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis while (len-- > 0) 51c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis fputc(c, stderr); 52c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 53c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 54c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic unsigned int ceilu(float f) 55c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 56c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (f - (int)f > 0) 57c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis return (unsigned int)f + 1; 58c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 59c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis return (unsigned int)f; 60c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 61c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 62c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic unsigned int flooru(float f) 63c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 64c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis return (unsigned int)f; 65c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 66c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 67c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic float bucket_len(unsigned int bucket, unsigned int max_bucket, 68c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int cols) 69c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 70c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis return 1.00 * bucket * cols / max_bucket; 71c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 72c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 73c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic const char *table_heading = " Time: us "; 74c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 75c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis/* 76c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * Line Header: '10023 | ' 77c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis */ 78c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic unsigned int header_len(long long max_sample) 79c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 80c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int l = 1; 81c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 82c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis while (max_sample/=10) 83c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis l++; 84c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 85c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis return MAX(strlen(table_heading) + 2, l + 3); 86c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 87c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 88c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic void frequency_plot(void) 89c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 90c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int cols = 80; 91c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int rows = 20; 92c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int i, buckets[rows]; 93c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis long long max_sample = samples[0]; 94c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis long long min_sample = samples[cur_sample-1]; 95c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int line_header_len = header_len(max_sample); 96c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int plot_line_len = cols - line_header_len; 97c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int bucket_size; 98c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 99c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis memset(buckets, 0, sizeof(buckets)); 100c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 101c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis /* 102c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * We work with discrete data buckets smaller than 1 does not make 103c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * sense as well as it's a good idea to keep buckets integer sized 104c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * to avoid scaling artifacts. 105c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis */ 106c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis bucket_size = MAX(1u, ceilu(1.00 * (max_sample - min_sample)/(rows-1))); 107c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 108c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis for (i = 0; i < cur_sample; i++) { 109c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int bucket; 110c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis bucket = flooru(1.00 * (samples[i] - min_sample)/bucket_size); 111c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis buckets[bucket]++; 112c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 113c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 114c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int max_bucket = buckets[0]; 115c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis for (i = 1; i < rows; i++) 116c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis max_bucket = MAX(max_bucket, buckets[i]); 117c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 118c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis fprintf(stderr, "\n%*s| Frequency\n", line_header_len - 2, table_heading); 119c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 120c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis print_line('-', cols); 121c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis fputc('\n', stderr); 122c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 123c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int l, r; 124c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 125c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis for (l = 0; l < rows; l++) { 126c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (buckets[l]) 127c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis break; 128c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 129c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 130c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis for (r = rows-1; r > l; r--) { 131c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (buckets[r]) 132c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis break; 133c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 134c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 135c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis for (i = l; i <= r; i++) { 136c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis float len = bucket_len(buckets[i], max_bucket, plot_line_len); 137c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 138c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis fprintf(stderr, "%*lli | ", 139c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis line_header_len - 3, min_sample + bucket_size*i); 140c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis print_line('*', len); 141c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 142c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if ((len - (int)len) >= 0.5) 143c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis fputc('+', stderr); 144c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis else if ((len - (int)len) >= 0.25) 145c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis fputc('-', stderr); 146c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis else if (len < 0.25 && buckets[i]) 147c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis fputc('.', stderr); 148c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 149c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis fputc('\n', stderr); 150c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 151c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 152c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis print_line('-', cols); 153c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis fputc('\n', stderr); 154c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 155c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis float scale = 1.00 * plot_line_len / max_bucket; 156c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 157c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis fprintf(stderr, 158c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis "%*uus | 1 sample = %.5f '*', %.5f '+', %.5f '-', non-zero '.'\n", 159c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis line_header_len - 5, bucket_size, scale, scale * 2, scale * 4); 160c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 161c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis fputc('\n', stderr); 162c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 163c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 164c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisvoid tst_timer_sample(void) 165c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 166c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis samples[cur_sample++] = tst_timer_elapsed_us(); 167c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 168c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 169c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic int cmp(const void *a, const void *b) 170c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 171c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis const long long *aa = a, *bb = b; 172c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 173c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis return *aa < *bb; 174c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 175c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 176c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis/* 177c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * The threshold per one syscall is computed as a sum of: 178c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * 179c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * 400 us - accomodates for context switches, process 180c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * migrations between CPUs on SMP, etc. 181c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * 2*monotonic_resolution - accomodates for granurality of the CLOCK_MONOTONIC 182c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * slack_per_scall - max of 0.1% of the sleep capped on 100ms or 183c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * current->timer_slack_ns, which is slack allowed 184c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * in kernel 185c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * 186c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * The formula for slack_per_scall applies to select() and *poll*() syscalls, 187c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * the futex and *nanosleep() use only the timer_slack_ns, so we are a bit 188c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * less strict here that we could be for these two for longer sleep times... 189c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * 190c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * We also allow for outliners, i.e. add some number to the threshold in case 191c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * that the number of iteration is small. For large enoung number of iterations 192c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * outliners are discarded and averaged out. 193c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis */ 194c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic long long compute_threshold(long long requested_us, 195c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int nsamples) 196c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 197c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int slack_per_scall = MIN(100000, requested_us / 1000); 198c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 199c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis slack_per_scall = MAX(slack_per_scall, timerslack); 200c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 201c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis return (400 + 2 * monotonic_resolution + slack_per_scall) * nsamples 202c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis + 3000/nsamples; 203c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 204c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 205c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis/* 206c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * Returns number of samples to discard. 207c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * 208c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * We set it to either at least 1 if number of samples > 1 or 5%. 209c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis */ 210c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic unsigned int compute_discard(unsigned int nsamples) 211c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 212c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (nsamples == 1) 213c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis return 0; 214c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 215c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis return MAX(1u, nsamples / 20); 216c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 217c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 218c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic void write_to_file(void) 219c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 220c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int i; 221c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis FILE *f; 222c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 223c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (!file_name) 224c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis return; 225c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 226c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis f = fopen(file_name, "w"); 227c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 228c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (!f) { 229c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_res(TWARN | TERRNO, 230c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis "Failed to open '%s'", file_name); 231c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis return; 232c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 233c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 234c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis for (i = 0; i < cur_sample; i++) 235c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis fprintf(f, "%lli\n", samples[i]); 236c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 237c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (fclose(f)) { 238c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_res(TWARN | TERRNO, 239c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis "Failed to close file '%s'", file_name); 240c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 241c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 242c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 243c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 244c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis/* 245c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * Timer testing function. 246c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * 247c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * What we do here is: 248c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * 249c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * * Take nsamples measurements of the timer function, the function 250c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * to be sampled is defined in the the actual test. 251c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * 252c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * * We sort the array of samples, then: 253c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * 254c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * - look for outliners which are samples where the sleep time has exceeded 255c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * requested sleep time by an order of magnitude and, at the same time, are 256c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * greater than clock resolution multiplied by three. 257c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * 258c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * - check for samples where the call has woken up too early which is a plain 259c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * old bug 260c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * 261c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * - then we compute truncated mean and compare that with the requested sleep 262c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis * time increased by a threshold 263c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis */ 264c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisvoid do_timer_test(long long usec, unsigned int nsamples) 265c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 266c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis long long trunc_mean, median; 267c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int discard = compute_discard(nsamples); 268c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int keep_samples = nsamples - discard; 269c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis long long threshold = compute_threshold(usec, keep_samples); 270825459d37ff9027f33f65569d1594456eb820d99Xiao Yang int i; 271c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis int failed = 0; 272c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 273c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_res(TINFO, 274c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis "%s sleeping for %llius %u iterations, threshold %.2fus", 275c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis scall, usec, nsamples, 1.00 * threshold / (keep_samples)); 276c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 277c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis cur_sample = 0; 278825459d37ff9027f33f65569d1594456eb820d99Xiao Yang for (i = 0; i < (int)nsamples; i++) { 279c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (sample(CLOCK_MONOTONIC, usec)) { 280c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_res(TINFO, "sampling function failed, exitting"); 281c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis return; 282c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 283c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 284c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 285c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis qsort(samples, nsamples, sizeof(samples[0]), cmp); 286c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 287c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis write_to_file(); 288c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 289825459d37ff9027f33f65569d1594456eb820d99Xiao Yang for (i = 0; samples[i] > 10 * usec && i < (int)nsamples; i++) { 290c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (samples[i] <= 3 * monotonic_resolution) 291c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis break; 292c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 293c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 294c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (i > 0) { 295c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_res(TINFO, "Found %i outliners in [%lli,%lli] range", 296c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis i, samples[0], samples[i-1]); 297c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 298c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 299825459d37ff9027f33f65569d1594456eb820d99Xiao Yang for (i = nsamples - 1; samples[i] < usec && i > -1; i--); 300c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 301825459d37ff9027f33f65569d1594456eb820d99Xiao Yang if (i < (int)nsamples - 1) { 302c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_res(TFAIL, "%s woken up early %u times range: [%lli,%lli]", 303c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis scall, nsamples - 1 - i, 304c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis samples[i+1], samples[nsamples-1]); 305c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis failed = 1; 306c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 307c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 308c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis median = samples[nsamples/2]; 309c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 310c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis trunc_mean = 0; 311c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 312825459d37ff9027f33f65569d1594456eb820d99Xiao Yang for (i = discard; i < (int)nsamples; i++) 313c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis trunc_mean += samples[i]; 314c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 315c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_res(TINFO, 316c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis "min %llius, max %llius, median %llius, trunc mean %.2fus (discarded %u)", 317c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis samples[nsamples-1], samples[0], median, 318c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 1.00 * trunc_mean / keep_samples, discard); 319c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 320c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (trunc_mean > (nsamples - discard) * usec + threshold) { 321c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_res(TFAIL, "%s slept for too long", scall); 322c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 323c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (!print_frequency_plot) 324c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis frequency_plot(); 325c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 326c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis failed = 1; 327c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 328c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 329c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (print_frequency_plot) 330c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis frequency_plot(); 331c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 332c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (!failed) 333c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_res(TPASS, "Measured times are within thresholds"); 334c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 335c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 336c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic void parse_timer_opts(void); 337c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 3381964db736191550f6a21fc96ab13ab5e9ce74f95Daniel Lezcanostatic int set_latency(void) 3391964db736191550f6a21fc96ab13ab5e9ce74f95Daniel Lezcano{ 3401964db736191550f6a21fc96ab13ab5e9ce74f95Daniel Lezcano int fd, latency = 0; 3411964db736191550f6a21fc96ab13ab5e9ce74f95Daniel Lezcano 3421964db736191550f6a21fc96ab13ab5e9ce74f95Daniel Lezcano fd = open("/dev/cpu_dma_latency", O_WRONLY); 3431964db736191550f6a21fc96ab13ab5e9ce74f95Daniel Lezcano if (fd < 0) 3441964db736191550f6a21fc96ab13ab5e9ce74f95Daniel Lezcano return fd; 3451964db736191550f6a21fc96ab13ab5e9ce74f95Daniel Lezcano 3461964db736191550f6a21fc96ab13ab5e9ce74f95Daniel Lezcano return write(fd, &latency, sizeof(latency)); 3471964db736191550f6a21fc96ab13ab5e9ce74f95Daniel Lezcano} 3481964db736191550f6a21fc96ab13ab5e9ce74f95Daniel Lezcano 349c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic void timer_setup(void) 350c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 351c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis struct timespec t; 352c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis int ret; 353c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 354c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_clock_getres(CLOCK_MONOTONIC, &t); 355c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 356c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_res(TINFO, "CLOCK_MONOTONIC resolution %lins", (long)t.tv_nsec); 357c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 358c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis monotonic_resolution = t.tv_nsec / 1000; 359c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis timerslack = 50; 360c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 361c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis#ifdef PR_GET_TIMERSLACK 362c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis ret = prctl(PR_GET_TIMERSLACK); 363c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (ret < 0) { 364c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_res(TINFO, "prctl(PR_GET_TIMERSLACK) = -1, using %uus", 365c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis timerslack); 366c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } else { 367c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis timerslack = ret / 1000; 368c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_res(TINFO, "prctl(PR_GET_TIMERSLACK) = %ius", timerslack); 369c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 370c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis#else 371c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_res(TINFO, "PR_GET_TIMERSLACK not defined, using %uus", 372c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis timerslack); 373c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis#endif /* PR_GET_TIMERSLACK */ 374c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 375c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis parse_timer_opts(); 376c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 377c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis samples = SAFE_MALLOC(sizeof(long long) * MAX(MAX_SAMPLES, sample_cnt)); 378c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 3791964db736191550f6a21fc96ab13ab5e9ce74f95Daniel Lezcano if (set_latency() < 0) 3801964db736191550f6a21fc96ab13ab5e9ce74f95Daniel Lezcano tst_res(TINFO, "Failed to set zero latency constraint: %m"); 3811964db736191550f6a21fc96ab13ab5e9ce74f95Daniel Lezcano 382c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (setup) 383c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis setup(); 384c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 385c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 386c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic void timer_cleanup(void) 387c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 388c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis free(samples); 389c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 390c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (cleanup) 391c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis cleanup(); 392c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 393c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 394c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic struct tst_timer_tcase { 395c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis long long usec; 396c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis unsigned int samples; 397c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} tcases[] = { 398c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis {1000, 500}, 399c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis {2000, 500}, 400c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis {5000, 300}, 401c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis {10000, 100}, 402c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis {25000, 50}, 403c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis {100000, 10}, 404c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis {1000000, 2}, 405c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis}; 406c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 407c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic void timer_test_fn(unsigned int n) 408c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 409c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis do_timer_test(tcases[n].usec, tcases[n].samples); 410c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 411c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 412c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic void single_timer_test(void) 413c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 414c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis do_timer_test(sleep_time, sample_cnt); 415c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 416c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 417c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic struct tst_option options[] = { 418c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis {"p", &print_frequency_plot, "-p Print frequency plot"}, 419c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis {"s:", &str_sleep_time, "-s us Sleep time"}, 420c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis {"n:", &str_sample_cnt, "-n uint Number of samples to take"}, 421c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis {"f:", &file_name, "-f fname Write measured samples into a file"}, 422c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis {NULL, NULL, NULL} 423c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis}; 424c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 425c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstatic void parse_timer_opts(void) 426c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 427c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (str_sleep_time) { 428c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (tst_parse_int(str_sleep_time, &sleep_time, 0, INT_MAX)) { 429c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_brk(TBROK, 430c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis "Invalid sleep time '%s'", str_sleep_time); 431c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 432c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 433c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 434c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (str_sample_cnt) { 435c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (tst_parse_int(str_sample_cnt, &sample_cnt, 1, INT_MAX)) { 436c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_brk(TBROK, 437c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis "Invalid sample count '%s'", str_sample_cnt); 438c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 439c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 440c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 441c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (str_sleep_time || str_sample_cnt) { 442c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (sleep_time < 0) 443c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis sleep_time = 10000; 444c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 445c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis if (!sample_cnt) 446c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis sample_cnt = 500; 447c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 448c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis long long timeout = sleep_time * sample_cnt / 1000000; 449c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 450c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis tst_set_timeout(timeout + timeout/10); 451c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 452c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis test->test_all = single_timer_test; 453c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis test->test = NULL; 454c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis test->tcnt = 0; 455c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis } 456c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 457c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 458c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubisstruct tst_test *tst_timer_test_setup(struct tst_test *timer_test) 459c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis{ 460c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis setup = timer_test->setup; 461c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis cleanup = timer_test->cleanup; 462b5d620aa9ece866cd264c5f05dbd8f19fc6fa8e8Li Wang scall = timer_test->scall; 463c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis sample = timer_test->sample; 464c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 465b5d620aa9ece866cd264c5f05dbd8f19fc6fa8e8Li Wang timer_test->scall = NULL; 466c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis timer_test->setup = timer_setup; 467c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis timer_test->cleanup = timer_cleanup; 468c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis timer_test->test = timer_test_fn; 469c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis timer_test->tcnt = ARRAY_SIZE(tcases); 470c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis timer_test->sample = NULL; 471c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis timer_test->options = options; 472c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 473c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis test = timer_test; 474c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis 475c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis return timer_test; 476c459654db64cd29177a382ab178fdd5ad59664e4Cyril Hrubis} 477