xref: /linux/tools/testing/selftests/damon/debugfs_target_ids_pid_leak.c (revision ae22a94997b8a03dcb3c922857c203246711f9d4)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Author: SeongJae Park <sj@kernel.org>
4  */
5 
6 #define _GNU_SOURCE
7 
8 #include <fcntl.h>
9 #include <stdbool.h>
10 #include <stdint.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <sys/types.h>
14 #include <sys/wait.h>
15 #include <sys/time.h>
16 #include <unistd.h>
17 
18 #define DBGFS_TARGET_IDS "/sys/kernel/debug/damon/target_ids"
19 
20 static void write_targetid_exit(void)
21 {
22 	int target_ids_fd = open(DBGFS_TARGET_IDS, O_RDWR);
23 	char pid_str[128];
24 
25 	snprintf(pid_str, sizeof(pid_str), "%d", getpid());
26 	write(target_ids_fd, pid_str, sizeof(pid_str));
27 	close(target_ids_fd);
28 	exit(0);
29 }
30 
31 unsigned long msec_timestamp(void)
32 {
33 	struct timeval tv;
34 
35 	gettimeofday(&tv, NULL);
36 	return tv.tv_sec * 1000UL + tv.tv_usec / 1000;
37 }
38 
39 int main(int argc, char *argv[])
40 {
41 	unsigned long start_ms;
42 	int time_to_run, nr_forks = 0;
43 
44 	if (argc != 2) {
45 		fprintf(stderr, "Usage: %s <msecs to run>\n", argv[0]);
46 		exit(1);
47 	}
48 	time_to_run = atoi(argv[1]);
49 
50 	start_ms = msec_timestamp();
51 	while (true) {
52 		int pid = fork();
53 
54 		if (pid < 0) {
55 			fprintf(stderr, "fork() failed\n");
56 			exit(1);
57 		}
58 		if (pid == 0)
59 			write_targetid_exit();
60 		wait(NULL);
61 		nr_forks++;
62 
63 		if (msec_timestamp() - start_ms > time_to_run)
64 			break;
65 	}
66 	printf("%d\n", nr_forks);
67 	return 0;
68 }
69