| 153 | } |
| 154 | |
| 155 | static int test_clamp(void) |
| 156 | { |
| 157 | struct io_uring_buf_ring *br; |
| 158 | struct io_uring_params p = { }; |
| 159 | struct io_uring_sqe *sqe; |
| 160 | struct io_uring_cqe *cqe; |
| 161 | struct io_uring ring; |
| 162 | int ret, fds[2], i; |
| 163 | char tmp[32]; |
| 164 | char *buf; |
| 165 | void *ptr; |
| 166 | |
| 167 | ret = io_uring_queue_init_params(4, &ring, &p); |
| 168 | if (ret) { |
| 169 | fprintf(stderr, "ring setup failed: %d\n", ret); |
| 170 | return 1; |
| 171 | } |
| 172 | |
| 173 | if (pipe(fds) < 0) { |
| 174 | perror("pipe"); |
| 175 | return 1; |
| 176 | } |
| 177 | |
| 178 | if (posix_memalign((void **) &buf, 4096, NR_BUFS * BUF_SIZE)) |
| 179 | return 1; |
| 180 | |
| 181 | br = io_uring_setup_buf_ring(&ring, NR_BUFS, BUF_BGID, 0, &ret); |
| 182 | if (!br) { |
| 183 | if (ret == -EINVAL) { |
| 184 | no_buf_ring = 1; |
| 185 | return 0; |
| 186 | } |
| 187 | fprintf(stderr, "Buffer ring register failed %d\n", ret); |
| 188 | return 1; |
| 189 | } |
| 190 | |
| 191 | ptr = buf; |
| 192 | io_uring_buf_ring_add(br, buf, 16, 1, BR_MASK, 0); |
| 193 | buf += 16; |
| 194 | io_uring_buf_ring_add(br, buf, 32, 2, BR_MASK, 1); |
| 195 | buf += 32; |
| 196 | io_uring_buf_ring_add(br, buf, 32, 3, BR_MASK, 2); |
| 197 | buf += 32; |
| 198 | io_uring_buf_ring_add(br, buf, 32, 4, BR_MASK, 3); |
| 199 | buf += 32; |
| 200 | io_uring_buf_ring_advance(br, 4); |
| 201 | |
| 202 | memset(tmp, 0xaa, sizeof(tmp)); |
| 203 | |
| 204 | sqe = io_uring_get_sqe(&ring); |
| 205 | io_uring_prep_read_multishot(sqe, fds[0], 0, 0, BUF_BGID); |
| 206 | |
| 207 | ret = io_uring_submit(&ring); |
| 208 | if (ret != 1) { |
| 209 | fprintf(stderr, "submit: %d\n", ret); |
| 210 | return 1; |
| 211 | } |
| 212 |
no test coverage detected