| 236 | } |
| 237 | |
| 238 | int main(int argc, char *argv[]) |
| 239 | { |
| 240 | struct io_uring ring1, ring2, ring3; |
| 241 | struct io_uring_params p = { }; |
| 242 | int ret, no_sq_poll = 0; |
| 243 | |
| 244 | if (argc > 1) |
| 245 | return 0; |
| 246 | |
| 247 | ret = t_create_ring_params(8, &ring1, &p); |
| 248 | if (ret == T_SETUP_SKIP) |
| 249 | return T_EXIT_SKIP; |
| 250 | else if (ret != T_SETUP_OK) |
| 251 | return ret; |
| 252 | if (!(p.features & IORING_FEAT_MIN_TIMEOUT)) |
| 253 | return T_EXIT_SKIP; |
| 254 | |
| 255 | p.flags = IORING_SETUP_SINGLE_ISSUER|IORING_SETUP_DEFER_TASKRUN; |
| 256 | ret = t_create_ring_params(8, &ring2, &p); |
| 257 | if (ret == T_SETUP_SKIP) |
| 258 | return T_EXIT_SKIP; |
| 259 | else if (ret != T_SETUP_OK) |
| 260 | return ret; |
| 261 | |
| 262 | p.flags = IORING_SETUP_SQPOLL; |
| 263 | ret = t_create_ring_params(8, &ring3, &p); |
| 264 | if (ret != T_SETUP_OK) |
| 265 | no_sq_poll = 1; |
| 266 | |
| 267 | ret = test_already(&ring1); |
| 268 | if (ret == T_EXIT_FAIL || ret == T_EXIT_SKIP) |
| 269 | return ret; |
| 270 | |
| 271 | ret = test_already(&ring2); |
| 272 | if (ret == T_EXIT_FAIL) |
| 273 | return T_EXIT_FAIL; |
| 274 | |
| 275 | if (!no_sq_poll) { |
| 276 | ret = test_already(&ring3); |
| 277 | if (ret == T_EXIT_FAIL) |
| 278 | return T_EXIT_FAIL; |
| 279 | } |
| 280 | |
| 281 | ret = test_some(&ring1); |
| 282 | if (ret == T_EXIT_FAIL || ret == T_EXIT_SKIP) |
| 283 | return ret; |
| 284 | |
| 285 | ret = test_some(&ring2); |
| 286 | if (ret == T_EXIT_FAIL) |
| 287 | return T_EXIT_FAIL; |
| 288 | |
| 289 | if (!no_sq_poll) { |
| 290 | ret = test_some(&ring3); |
| 291 | if (ret == T_EXIT_FAIL) |
| 292 | return T_EXIT_FAIL; |
| 293 | } |
| 294 | |
| 295 | ret = test_late(&ring1); |
nothing calls this directly
no test coverage detected