10 #include <sys/types.h>
12 #include <linux/types.h>
14 #define MB (1UL << 20)
15 #define PAGE_SIZE sysconf(_SC_PAGESIZE)
17 #define GUP_FAST_BENCHMARK _IOWR('g', 1, struct gup_benchmark)
18 #define GUP_LONGTERM_BENCHMARK _IOWR('g', 2, struct gup_benchmark)
19 #define GUP_BENCHMARK _IOWR('g', 3, struct gup_benchmark)
21 struct gup_benchmark
{
26 __u32 nr_pages_per_call
;
28 __u64 expansion
[10]; /* For future use */
31 int main(int argc
, char **argv
)
33 struct gup_benchmark gup
;
34 unsigned long size
= 128 * MB
;
35 int i
, fd
, filed
, opt
, nr_pages
= 1, thp
= -1, repeats
= 1, write
= 0;
36 int cmd
= GUP_FAST_BENCHMARK
, flags
= MAP_PRIVATE
;
37 char *file
= "/dev/zero";
40 while ((opt
= getopt(argc
, argv
, "m:r:n:f:tTLUSH")) != -1) {
43 size
= atoi(optarg
) * MB
;
46 repeats
= atoi(optarg
);
49 nr_pages
= atoi(optarg
);
58 cmd
= GUP_LONGTERM_BENCHMARK
;
70 flags
&= ~MAP_PRIVATE
;
81 filed
= open(file
, O_RDWR
|O_CREAT
);
87 gup
.nr_pages_per_call
= nr_pages
;
90 fd
= open("/sys/kernel/debug/gup_benchmark", O_RDWR
);
92 perror("open"), exit(1);
94 p
= mmap(NULL
, size
, PROT_READ
| PROT_WRITE
, flags
, filed
, 0);
96 perror("mmap"), exit(1);
97 gup
.addr
= (unsigned long)p
;
100 madvise(p
, size
, MADV_HUGEPAGE
);
102 madvise(p
, size
, MADV_NOHUGEPAGE
);
104 for (; (unsigned long)p
< gup
.addr
+ size
; p
+= PAGE_SIZE
)
107 for (i
= 0; i
< repeats
; i
++) {
109 if (ioctl(fd
, cmd
, &gup
))
110 perror("ioctl"), exit(1);
112 printf("Time: get:%lld put:%lld us", gup
.get_delta_usec
,
114 if (gup
.size
!= size
)
115 printf(", truncated (size: %lld)", gup
.size
);