1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * Copyright (c) Ulrich Drepper <[email protected]>
4 * Copyright (c) International Business Machines Corp., 2009
5 * Copyright (C) 2023 SUSE LLC Andrea Cervesato <[email protected]>
6 */
7
8 /*\
9 * [Description]
10 *
11 * This test verifies that eventfd2 semaphore-like support is properly working.
12 */
13
14 #include <fcntl.h>
15 #include <stdlib.h>
16 #include <sys/eventfd.h>
17 #include "tst_test.h"
18 #include "eventfd2.h"
19
xsem_wait(int fd)20 static void xsem_wait(int fd)
21 {
22 u_int64_t cntr;
23
24 SAFE_READ(0, fd, &cntr, sizeof(cntr));
25 }
26
xsem_post(int fd,int count)27 static void xsem_post(int fd, int count)
28 {
29 u_int64_t cntr = count;
30
31 SAFE_WRITE(0, fd, &cntr, sizeof(cntr));
32 }
33
sem_player(int fd1,int fd2)34 static void sem_player(int fd1, int fd2)
35 {
36 pid_t pid = getpid();
37
38 tst_res(TINFO, "[%u] posting 1 on fd=%d", pid, fd1);
39 xsem_post(fd1, 1);
40
41 tst_res(TINFO, "[%u] waiting on fd=%d", pid, fd2);
42 xsem_wait(fd2);
43
44 tst_res(TINFO, "[%u] posting 5 on fd=%d", pid, fd1);
45 xsem_post(fd1, 5);
46
47 tst_res(TINFO, "[%u] waiting 5 times on fd=%d", pid, fd2);
48 xsem_wait(fd2);
49 xsem_wait(fd2);
50 xsem_wait(fd2);
51 xsem_wait(fd2);
52 xsem_wait(fd2);
53
54 tst_res(TPASS, "[%u] received all events", pid);
55 }
56
run(void)57 static void run(void)
58 {
59 pid_t cpid_poster, cpid_waiter;
60 int fd1, fd2;
61
62 fd1 = eventfd2(0, EFD_SEMAPHORE);
63 fd2 = eventfd2(0, EFD_SEMAPHORE);
64
65 cpid_poster = SAFE_FORK();
66 if (!cpid_poster) {
67 sem_player(fd1, fd2);
68 exit(0);
69 }
70
71 cpid_waiter = SAFE_FORK();
72 if (!cpid_waiter) {
73 sem_player(fd2, fd1);
74 exit(0);
75 }
76 }
77
78 static struct tst_test test = {
79 .test_all = run,
80 .forks_child = 1,
81 };
82