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