CompletionChannel gives the fd (AsRawFd) and the unsafe comp_channel() handle, and CompletionQueue::cq() gives the unsafe ibv_cq handle but there's no safe ibv_req_notify_cq / ibv_get_cq_event / ibv_ack_cq_events. So event-driven completion handling requires dropping to rdma-mummy-sys.
The arm → wait-on-fd → get/ack → drain → re-arm loop is the standard low-CPU alternative to busy-polling start_poll, and it's what lets an idle connection park instead of spinning a core.
Suggested API
impl CompletionQueue { // trait or per-CQ
pub fn request_notify(&self, solicited_only: bool) -> Result<(), ...>;
pub fn ack_events(&self, n: u32);
}
impl CompletionChannel {
pub fn get_event(&self) -> Result<(), ...>; // ibv_get_cq_event
}
CompletionChannelgives the fd (AsRawFd) and the unsafecomp_channel()handle, andCompletionQueue::cq()gives the unsafeibv_cqhandle but there's no safeibv_req_notify_cq/ibv_get_cq_event/ibv_ack_cq_events. So event-driven completion handling requires dropping tordma-mummy-sys.The arm → wait-on-fd → get/ack → drain → re-arm loop is the standard low-CPU alternative to busy-polling
start_poll, and it's what lets an idle connection park instead of spinning a core.Suggested API