Skip to main content

IbvQueuePair

Struct IbvQueuePair 

Source
pub struct IbvQueuePair {
    pub send_cq: usize,
    pub recv_cq: usize,
    pub dv_qp: usize,
    pub dv_send_cq: usize,
    pub dv_recv_cq: usize,
    /* private fields */
}
Expand description

An RDMA Queue Pair (QP) for communication between two endpoints.

Encapsulates the send/receive queues, completion queues, and mlx5dv device-specific structures needed for RDMA communication.

§Connection Lifecycle

  1. Create with new() from context and protection domain pointers
  2. Get connection info with get_qp_info()
  3. Exchange connection info with remote peer
  4. Connect to remote endpoint with connect()
  5. Perform RDMA operations with put() or get()
  6. Poll for completions with poll_completion()

§Notes

  • The qp field stores a pointer to rdmaxcel_qp_t (not ibv_qp). It is private; external callers reach it via Self::as_ptr.
  • rdmaxcel_qp_t contains atomic counters and completion caches internally
  • IbvQueuePair is single-owner: its Drop destroys the FFI QP, so the type is intentionally !Clone (and not sent across the wire).

Fields§

§send_cq: usize§recv_cq: usize§dv_qp: usize§dv_send_cq: usize§dv_recv_cq: usize

Implementations§

Source§

impl IbvQueuePair

Source

pub unsafe fn as_ptr(&self) -> *mut rdmaxcel_qp

Returns the underlying rdmaxcel_qp_t pointer for callers driving the device doorbell or building FFI parameter blocks directly.

§Safety

The returned pointer is only valid for as long as the borrow of self lives. The caller must ensure all reads/writes through the pointer complete before this IbvQueuePair is dropped, since Drop calls rdmaxcel_qp_destroy on it.

Source

pub fn new<I: IbvDomainImpl>( domain: &IbvDomain<I>, config: IbvConfig, ) -> Result<Self, Error>

Creates a new IbvQueuePair.

Initializes a new Queue Pair (QP) and associated Completion Queues (CQ) using the provided context and protection domain. The QP is created in the RESET state and must be transitioned via connect() before use.

§Errors

Returns errors if CQ or QP creation fails.

Source

pub fn get_qp_info(&mut self) -> Result<IbvQpInfo, Error>

Returns the connection info needed by a remote peer to connect to this QP.

Source

pub fn state(&mut self) -> Result<u32, Error>

Returns the current state of the QP.

Source

pub fn connect(&mut self, connection_info: &IbvQpInfo) -> Result<(), Error>

Transitions the QP through INIT -> RTR -> RTS to establish a connection.

§Arguments
  • connection_info - The remote connection info to connect to
Source

pub fn recv( &mut self, lhandle: IbvBuffer, rhandle: IbvBuffer, ) -> Result<u64, Error>

Source

pub fn put_with_recv( &mut self, lhandle: IbvBuffer, rhandle: IbvBuffer, ) -> Result<Vec<u64>, Error>

Source

pub fn put( &mut self, lhandle: IbvBuffer, rhandle: IbvBuffer, ) -> Result<Vec<u64>, Error>

Source

pub fn ring_doorbell(&mut self) -> Result<(), Error>

Rings the doorbell to execute all enqueued operations.

Source

pub fn enqueue_put( &mut self, lhandle: IbvBuffer, rhandle: IbvBuffer, ) -> Result<Vec<u64>, Error>

Enqueues a put operation without ringing the doorbell.

Source

pub fn enqueue_put_with_recv( &mut self, lhandle: IbvBuffer, rhandle: IbvBuffer, ) -> Result<Vec<u64>, Error>

Enqueues a put-with-receive operation without ringing the doorbell.

Source

pub fn enqueue_get( &mut self, lhandle: IbvBuffer, rhandle: IbvBuffer, ) -> Result<Vec<u64>, Error>

Enqueues a get operation without ringing the doorbell.

Source

pub fn get( &mut self, lhandle: IbvBuffer, rhandle: IbvBuffer, ) -> Result<Vec<u64>, Error>

Source

pub fn poll_completion( &mut self, target: PollTarget, ) -> Result<Option<Result<IbvWc, WorkRequestError>>, PollCompletionError>

Polls target’s completion queue for a single work completion.

This is a thin wrapper over one ibv_poll_cq call. It does no per-WR bookkeeping: the caller owns matching each completion back to the work request it posted (by IbvWc::wr_id) and must keep polling until the queue drains so that no completion is lost.

§Returns
  • Ok(None) — the CQ is currently empty.
  • Ok(Some(Ok(wc))) — a completion landed with success status.
  • Ok(Some(Err(_))) — a completion landed with a non-success status; the WorkRequestError names the failed request.
  • Err(_)ibv_poll_cq itself failed; the QP should be treated as poisoned.

Trait Implementations§

Source§

impl Debug for IbvQueuePair

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Drop for IbvQueuePair

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl IbvQueuePair for IbvQueuePair

Source§

unsafe fn new<I: IbvDomainImpl<QueuePair = Self>>( domain: &IbvDomain<I>, config: IbvConfig, ) -> Result<Self, Error>

Creates a queue pair against domain in the RESET state; Self::connect transitions it to RTS before use. Read more
Source§

fn connect(&mut self, info: &IbvQpInfo) -> Result<(), Error>

Transitions the QP through INIT -> RTR -> RTS, connected to info.
Source§

fn get_qp_info(&mut self) -> Result<IbvQpInfo, Error>

Returns the local endpoint other peers need in order to connect to this QP.
Source§

fn state(&mut self) -> Result<u32, Error>

Returns the current ibv_qp_state of the QP.
Source§

fn put( &mut self, remote_dst: IbvBuffer, local_src: IbvBuffer, ) -> Result<Vec<u64>, Error>

Post an RDMA WRITE of local_src into remote_dst. The request may be chunked into multiple WRs. This method returns the list of WR ids that were posted.
Source§

fn get( &mut self, local_dst: IbvBuffer, remote_src: IbvBuffer, ) -> Result<Vec<u64>, Error>

Post an RDMA READ of remote_src into local_dst. The request may be chunked into multiple WRs. This method returns the list of WR ids that were posted.
Source§

fn poll_completion( &mut self, target: PollTarget, ) -> Result<Option<Result<IbvWc, WorkRequestError>>, PollCompletionError>

Poll target’s completion queue for a single work completion. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
§

impl<T> QuoteExt for T
where T: ?Sized,

§

fn push_quoted<'q, Q, S>(&mut self, _q: Q, s: S)
where Q: QuoteInto<T>, S: Into<Quotable<'q>>,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<M> Message for M
where M: Send + Sync + 'static,

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,