Skip to main content

ibverbs_rs/multi_channel/
work_request.rs

1use crate::ibverbs::memory::{GatherElement, ScatterElement};
2use crate::ibverbs::work::*;
3use crate::multi_channel::remote_memory_region::PeerRemoteMemoryRegion;
4
5/// A [`SendWorkRequest`] targeted at a specific peer.
6#[derive(Debug, Clone)]
7pub struct PeerSendWorkRequest<'wr, 'data> {
8    pub(crate) peer: usize,
9    pub(crate) wr: SendWorkRequest<'wr, 'data>,
10}
11
12/// A [`ReceiveWorkRequest`] targeted at a specific peer.
13#[derive(Debug)]
14pub struct PeerReceiveWorkRequest<'wr, 'data> {
15    pub(crate) peer: usize,
16    pub(crate) wr: ReceiveWorkRequest<'wr, 'data>,
17}
18
19/// A [`WriteWorkRequest`] targeted at a specific peer.
20#[derive(Debug, Clone)]
21pub struct PeerWriteWorkRequest<'wr, 'data> {
22    pub(crate) peer: usize,
23    pub(crate) wr: WriteWorkRequest<'wr, 'data>,
24}
25
26/// A [`ReadWorkRequest`] targeted at a specific peer.
27#[derive(Debug)]
28pub struct PeerReadWorkRequest<'wr, 'data> {
29    pub(crate) peer: usize,
30    pub(crate) wr: ReadWorkRequest<'wr, 'data>,
31}
32
33impl<'wr, 'data> PeerSendWorkRequest<'wr, 'data> {
34    /// Creates a new send work request for the given peer.
35    pub fn new(peer: usize, gather_elements: &'wr [GatherElement<'data>]) -> Self {
36        Self {
37            peer,
38            wr: SendWorkRequest::new(gather_elements),
39        }
40    }
41
42    /// Wraps an existing [`SendWorkRequest`] with a peer index.
43    pub fn from_wr(peer: usize, wr: SendWorkRequest<'wr, 'data>) -> Self {
44        Self { peer, wr }
45    }
46
47    /// Attaches an immediate data value to this send.
48    pub fn with_immediate(mut self, imm_data: u32) -> Self {
49        self.wr = self.wr.with_immediate(imm_data);
50        self
51    }
52
53    /// Creates a send that carries only immediate data and no payload.
54    pub fn only_immediate(peer: usize, imm_data: u32) -> Self {
55        Self {
56            peer,
57            wr: SendWorkRequest::only_immediate(imm_data),
58        }
59    }
60
61    /// Returns the target peer index.
62    pub fn peer(&self) -> usize {
63        self.peer
64    }
65}
66
67impl<'wr, 'data> From<PeerSendWorkRequest<'wr, 'data>> for SendWorkRequest<'wr, 'data> {
68    fn from(value: PeerSendWorkRequest<'wr, 'data>) -> Self {
69        value.wr
70    }
71}
72
73impl<'wr, 'data> PeerReceiveWorkRequest<'wr, 'data> {
74    /// Creates a new receive work request for the given peer.
75    pub fn new(peer: usize, scatter_elements: &'wr mut [ScatterElement<'data>]) -> Self {
76        Self {
77            peer,
78            wr: ReceiveWorkRequest::new(scatter_elements),
79        }
80    }
81
82    /// Creates a receive that expects only immediate data and no payload.
83    pub fn only_immediate(peer: usize) -> Self {
84        Self {
85            peer,
86            wr: ReceiveWorkRequest::only_immediate(),
87        }
88    }
89
90    /// Wraps an existing [`ReceiveWorkRequest`] with a peer index.
91    pub fn from_wr(peer: usize, wr: ReceiveWorkRequest<'wr, 'data>) -> Self {
92        Self { peer, wr }
93    }
94
95    /// Returns the target peer index.
96    pub fn peer(&self) -> usize {
97        self.peer
98    }
99}
100
101impl<'wr, 'data> From<PeerReceiveWorkRequest<'wr, 'data>> for ReceiveWorkRequest<'wr, 'data> {
102    fn from(value: PeerReceiveWorkRequest<'wr, 'data>) -> Self {
103        value.wr
104    }
105}
106
107impl<'wr, 'data> PeerWriteWorkRequest<'wr, 'data> {
108    /// Creates a new RDMA write work request. The peer is determined by the [`PeerRemoteMemoryRegion`].
109    pub fn new(
110        gather_elements: &'wr [GatherElement<'data>],
111        peer_remote_mr: PeerRemoteMemoryRegion,
112    ) -> Self {
113        Self {
114            peer: peer_remote_mr.peer(),
115            wr: WriteWorkRequest::new(gather_elements, peer_remote_mr.remote_mr),
116        }
117    }
118
119    /// Attaches an immediate data value to this write.
120    pub fn with_immediate(mut self, imm_data: u32) -> Self {
121        self.wr = self.wr.with_immediate(imm_data);
122        self
123    }
124
125    /// Returns the target peer index.
126    pub fn peer(&self) -> usize {
127        self.peer
128    }
129}
130
131impl<'wr, 'data> From<PeerWriteWorkRequest<'wr, 'data>> for WriteWorkRequest<'wr, 'data> {
132    fn from(value: PeerWriteWorkRequest<'wr, 'data>) -> Self {
133        value.wr
134    }
135}
136
137impl<'wr, 'data> PeerReadWorkRequest<'wr, 'data> {
138    /// Creates a new RDMA read work request. The peer is determined by the [`PeerRemoteMemoryRegion`].
139    pub fn new(
140        scatter_elements: &'wr mut [ScatterElement<'data>],
141        peer_remote_mr: PeerRemoteMemoryRegion,
142    ) -> Self {
143        Self {
144            peer: peer_remote_mr.peer(),
145            wr: ReadWorkRequest::new(scatter_elements, peer_remote_mr.remote_mr),
146        }
147    }
148
149    /// Returns the target peer index.
150    pub fn peer(&self) -> usize {
151        self.peer
152    }
153}
154
155impl<'wr, 'data> From<PeerReadWorkRequest<'wr, 'data>> for ReadWorkRequest<'wr, 'data> {
156    fn from(value: PeerReadWorkRequest<'wr, 'data>) -> Self {
157        value.wr
158    }
159}