xref: /aosp_15_r20/external/ltp/lib/tst_safe_io_uring.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0-or-later
2*49cdfc7eSAndroid Build Coastguard Worker /*
3*49cdfc7eSAndroid Build Coastguard Worker  * Copyright (c) 2021 SUSE LLC <[email protected]>
4*49cdfc7eSAndroid Build Coastguard Worker  */
5*49cdfc7eSAndroid Build Coastguard Worker 
6*49cdfc7eSAndroid Build Coastguard Worker #define TST_NO_DEFAULT_MAIN
7*49cdfc7eSAndroid Build Coastguard Worker #include "tst_test.h"
8*49cdfc7eSAndroid Build Coastguard Worker #include "tst_safe_io_uring.h"
9*49cdfc7eSAndroid Build Coastguard Worker 
safe_io_uring_init(const char * file,const int lineno,unsigned int entries,struct io_uring_params * params,struct tst_io_uring * uring)10*49cdfc7eSAndroid Build Coastguard Worker int safe_io_uring_init(const char *file, const int lineno,
11*49cdfc7eSAndroid Build Coastguard Worker 	unsigned int entries, struct io_uring_params *params,
12*49cdfc7eSAndroid Build Coastguard Worker 	struct tst_io_uring *uring)
13*49cdfc7eSAndroid Build Coastguard Worker {
14*49cdfc7eSAndroid Build Coastguard Worker 	errno = 0;
15*49cdfc7eSAndroid Build Coastguard Worker 	uring->fd = io_uring_setup(entries, params);
16*49cdfc7eSAndroid Build Coastguard Worker 
17*49cdfc7eSAndroid Build Coastguard Worker 	if (uring->fd == -1) {
18*49cdfc7eSAndroid Build Coastguard Worker 		if (errno == EOPNOTSUPP)
19*49cdfc7eSAndroid Build Coastguard Worker 			tst_brk(TCONF, "CONFIG_IO_URING is not enabled");
20*49cdfc7eSAndroid Build Coastguard Worker 
21*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
22*49cdfc7eSAndroid Build Coastguard Worker 			"io_uring_setup() failed");
23*49cdfc7eSAndroid Build Coastguard Worker 		return uring->fd;
24*49cdfc7eSAndroid Build Coastguard Worker 	} else if (uring->fd < 0) {
25*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
26*49cdfc7eSAndroid Build Coastguard Worker 			"io_uring_setup() returned invalid value %d",
27*49cdfc7eSAndroid Build Coastguard Worker 			uring->fd);
28*49cdfc7eSAndroid Build Coastguard Worker 		return uring->fd;
29*49cdfc7eSAndroid Build Coastguard Worker 	}
30*49cdfc7eSAndroid Build Coastguard Worker 
31*49cdfc7eSAndroid Build Coastguard Worker 	uring->sqr_size = params->sq_entries;
32*49cdfc7eSAndroid Build Coastguard Worker 	uring->cqr_size = params->cq_entries;
33*49cdfc7eSAndroid Build Coastguard Worker 	uring->sqr_mapsize = params->sq_off.array +
34*49cdfc7eSAndroid Build Coastguard Worker 		params->sq_entries * sizeof(__u32);
35*49cdfc7eSAndroid Build Coastguard Worker 	uring->cqr_mapsize = params->cq_off.cqes +
36*49cdfc7eSAndroid Build Coastguard Worker 		params->cq_entries * sizeof(struct io_uring_cqe);
37*49cdfc7eSAndroid Build Coastguard Worker 
38*49cdfc7eSAndroid Build Coastguard Worker 	uring->sqr_base = safe_mmap(file, lineno, NULL, uring->sqr_mapsize,
39*49cdfc7eSAndroid Build Coastguard Worker 		PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, uring->fd,
40*49cdfc7eSAndroid Build Coastguard Worker 		IORING_OFF_SQ_RING);
41*49cdfc7eSAndroid Build Coastguard Worker 
42*49cdfc7eSAndroid Build Coastguard Worker 	if (uring->sqr_base == MAP_FAILED)
43*49cdfc7eSAndroid Build Coastguard Worker 		return -1;
44*49cdfc7eSAndroid Build Coastguard Worker 
45*49cdfc7eSAndroid Build Coastguard Worker 	uring->sqr_entries = safe_mmap(file, lineno, NULL,
46*49cdfc7eSAndroid Build Coastguard Worker 		params->sq_entries * sizeof(struct io_uring_sqe),
47*49cdfc7eSAndroid Build Coastguard Worker 		PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, uring->fd,
48*49cdfc7eSAndroid Build Coastguard Worker 		IORING_OFF_SQES);
49*49cdfc7eSAndroid Build Coastguard Worker 
50*49cdfc7eSAndroid Build Coastguard Worker 	if (uring->sqr_entries == MAP_FAILED)
51*49cdfc7eSAndroid Build Coastguard Worker 		return -1;
52*49cdfc7eSAndroid Build Coastguard Worker 
53*49cdfc7eSAndroid Build Coastguard Worker 	uring->cqr_base = safe_mmap(file, lineno, NULL, uring->cqr_mapsize,
54*49cdfc7eSAndroid Build Coastguard Worker 		PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, uring->fd,
55*49cdfc7eSAndroid Build Coastguard Worker 		IORING_OFF_CQ_RING);
56*49cdfc7eSAndroid Build Coastguard Worker 
57*49cdfc7eSAndroid Build Coastguard Worker 	if (uring->cqr_base == MAP_FAILED)
58*49cdfc7eSAndroid Build Coastguard Worker 		return -1;
59*49cdfc7eSAndroid Build Coastguard Worker 
60*49cdfc7eSAndroid Build Coastguard Worker 	uring->sqr_head = uring->sqr_base + params->sq_off.head;
61*49cdfc7eSAndroid Build Coastguard Worker 	uring->sqr_tail = uring->sqr_base + params->sq_off.tail;
62*49cdfc7eSAndroid Build Coastguard Worker 	uring->sqr_mask = uring->sqr_base + params->sq_off.ring_mask;
63*49cdfc7eSAndroid Build Coastguard Worker 	uring->sqr_flags = uring->sqr_base + params->sq_off.flags;
64*49cdfc7eSAndroid Build Coastguard Worker 	uring->sqr_dropped = uring->sqr_base + params->sq_off.dropped;
65*49cdfc7eSAndroid Build Coastguard Worker 	uring->sqr_array = uring->sqr_base + params->sq_off.array;
66*49cdfc7eSAndroid Build Coastguard Worker 
67*49cdfc7eSAndroid Build Coastguard Worker 	uring->cqr_head = uring->cqr_base + params->cq_off.head;
68*49cdfc7eSAndroid Build Coastguard Worker 	uring->cqr_tail = uring->cqr_base + params->cq_off.tail;
69*49cdfc7eSAndroid Build Coastguard Worker 	uring->cqr_mask = uring->cqr_base + params->cq_off.ring_mask;
70*49cdfc7eSAndroid Build Coastguard Worker 	uring->cqr_overflow = uring->cqr_base + params->cq_off.overflow;
71*49cdfc7eSAndroid Build Coastguard Worker 	uring->cqr_entries = uring->cqr_base + params->cq_off.cqes;
72*49cdfc7eSAndroid Build Coastguard Worker 	return uring->fd;
73*49cdfc7eSAndroid Build Coastguard Worker }
74*49cdfc7eSAndroid Build Coastguard Worker 
safe_io_uring_close(const char * file,const int lineno,struct tst_io_uring * uring)75*49cdfc7eSAndroid Build Coastguard Worker int safe_io_uring_close(const char *file, const int lineno,
76*49cdfc7eSAndroid Build Coastguard Worker 	struct tst_io_uring *uring)
77*49cdfc7eSAndroid Build Coastguard Worker {
78*49cdfc7eSAndroid Build Coastguard Worker 	int ret;
79*49cdfc7eSAndroid Build Coastguard Worker 
80*49cdfc7eSAndroid Build Coastguard Worker 	safe_munmap(file, lineno, NULL, uring->cqr_base, uring->cqr_mapsize);
81*49cdfc7eSAndroid Build Coastguard Worker 	safe_munmap(file, lineno, NULL, uring->sqr_entries,
82*49cdfc7eSAndroid Build Coastguard Worker 		uring->sqr_size * sizeof(struct io_uring_sqe));
83*49cdfc7eSAndroid Build Coastguard Worker 	safe_munmap(file, lineno, NULL, uring->sqr_base, uring->sqr_mapsize);
84*49cdfc7eSAndroid Build Coastguard Worker 	ret = safe_close(file, lineno, NULL, uring->fd);
85*49cdfc7eSAndroid Build Coastguard Worker 	uring->fd = -1;
86*49cdfc7eSAndroid Build Coastguard Worker 	return ret;
87*49cdfc7eSAndroid Build Coastguard Worker }
88*49cdfc7eSAndroid Build Coastguard Worker 
safe_io_uring_enter(const char * file,const int lineno,int strict,int fd,unsigned int to_submit,unsigned int min_complete,unsigned int flags,sigset_t * sig)89*49cdfc7eSAndroid Build Coastguard Worker int safe_io_uring_enter(const char *file, const int lineno, int strict,
90*49cdfc7eSAndroid Build Coastguard Worker 	int fd, unsigned int to_submit, unsigned int min_complete,
91*49cdfc7eSAndroid Build Coastguard Worker 	unsigned int flags, sigset_t *sig)
92*49cdfc7eSAndroid Build Coastguard Worker {
93*49cdfc7eSAndroid Build Coastguard Worker 	int ret;
94*49cdfc7eSAndroid Build Coastguard Worker 
95*49cdfc7eSAndroid Build Coastguard Worker 	errno = 0;
96*49cdfc7eSAndroid Build Coastguard Worker 	ret = io_uring_enter(fd, to_submit, min_complete, flags, sig);
97*49cdfc7eSAndroid Build Coastguard Worker 
98*49cdfc7eSAndroid Build Coastguard Worker 	if (ret == -1) {
99*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
100*49cdfc7eSAndroid Build Coastguard Worker 			"io_uring_enter() failed");
101*49cdfc7eSAndroid Build Coastguard Worker 	} else if (ret < 0) {
102*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
103*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid io_uring_enter() return value %d", ret);
104*49cdfc7eSAndroid Build Coastguard Worker 	} else if (strict && to_submit != (unsigned int)ret) {
105*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK,
106*49cdfc7eSAndroid Build Coastguard Worker 			"io_uring_enter() submitted %d items (expected %d)",
107*49cdfc7eSAndroid Build Coastguard Worker 			ret, to_submit);
108*49cdfc7eSAndroid Build Coastguard Worker 	}
109*49cdfc7eSAndroid Build Coastguard Worker 
110*49cdfc7eSAndroid Build Coastguard Worker 	return ret;
111*49cdfc7eSAndroid Build Coastguard Worker }
112