1 // SPDX-License-Identifier: GPL-2.0
2
3 #include <stdlib.h>
4 #include <stdio.h>
5
6 #include "tst_test.h"
7
8 #define TMPDIR "mntdir"
9 #define MB(x) (x << 20)
10
11 /*
12 * Checks if two given values differ by less than err% of their
13 * sum. An extra percent is added for every doubling of the page size
14 * to compensate for wastage in page sized allocations.
15 */
values_close(const ssize_t a,const ssize_t b,const ssize_t err)16 static inline int values_close(const ssize_t a,
17 const ssize_t b,
18 const ssize_t err)
19 {
20 const size_t page_size = SAFE_SYSCONF(_SC_PAGESIZE);
21 const ssize_t page_adjusted_err = ffs(page_size >> 13) + err;
22
23 return 100 * labs(a - b) <= (a + b) * page_adjusted_err;
24 }
25
alloc_pagecache(const int fd,size_t size)26 static inline void alloc_pagecache(const int fd, size_t size)
27 {
28 char buf[BUFSIZ];
29 size_t i;
30
31 SAFE_LSEEK(fd, 0, SEEK_END);
32
33 for (i = 0; i < size; i += sizeof(buf))
34 SAFE_WRITE(SAFE_WRITE_ALL, fd, buf, sizeof(buf));
35 }
36
alloc_anon(const size_t size)37 static inline void alloc_anon(const size_t size)
38 {
39 const size_t page_size = SAFE_SYSCONF(_SC_PAGESIZE);
40 char *const buf = SAFE_MALLOC(size);
41 size_t i;
42
43 for (i = 0; i < size; i += page_size)
44 buf[i] = 0;
45
46 free(buf);
47 }
48