Returning buffers via a ring is performant and convenient, but it becomes a problem when/if the user misconfigured the ring size and it becomes full. Add a synchronous way to return buffers back to the page pool via a new register opcode. It's supposed to be a reliable slow path for refilling.
Showing the changes to include/uapi (1 of 4 files). Show all
Unified · Split
| @@ -689,6 +689,9 @@ enum io_uring_register_op { · 688 unmodified lines | ||
| 689 | 689 | /* query various aspects of io_uring, see linux/io_uring/query.h */ |
| 690 | 690 | IORING_REGISTER_QUERY = 35, |
| 691 | 691 | |
| 692 | + /* return zcrx buffers back into circulation */ | |
| 693 | + IORING_REGISTER_ZCRX_REFILL = 36, | |
| 694 | + | |
| 692 | 695 | /* this goes last */ |
| 693 | 696 | IORING_REGISTER_LAST, |
| 694 | 697 | |
| @@ -1070,6 +1073,15 @@ struct io_uring_zcrx_ifq_reg { · 375 unmodified lines | ||
| 1070 | 1073 | __u64 __resv[3]; |
| 1071 | 1074 | }; |
| 1072 | 1075 | |
| 1076 | +struct io_uring_zcrx_sync_refill { | |
| 1077 | + __u32 zcrx_id; | |
| 1078 | + /* the number of entries to return */ | |
| 1079 | + __u32 nr_entries; | |
| 1080 | + /* pointer to an array of struct io_uring_zcrx_rqe */ | |
| 1081 | + __u64 rqes; | |
| 1082 | + __u64 __resv[2]; | |
| 1083 | +}; | |
| 1084 | + | |
| 1073 | 1085 | #ifdef __cplusplus |
| 1074 | 1086 | } |
| 1075 | 1087 | #endif |