@@ -28,7 +28,7 @@ use spdk_rs::{
28
28
29
29
use std:: {
30
30
convert:: TryFrom ,
31
- fmt:: { Debug , Display } ,
31
+ fmt:: { Debug , Display , Formatter } ,
32
32
mem:: zeroed,
33
33
ptr:: null_mut,
34
34
str:: FromStr ,
@@ -84,6 +84,129 @@ impl GetOpts for NexusOpts {
84
84
/// Must be equal to the size of `spdk_nvmf_target_opts.crdt`.
85
85
pub const TARGET_CRDT_LEN : usize = 3 ;
86
86
87
+ #[ derive( Clone , Default , Debug , PartialEq , Serialize , Deserialize ) ]
88
+ pub enum NvmfTgtTransport {
89
+ Rdma ,
90
+ #[ default]
91
+ Tcp ,
92
+ }
93
+
94
+ impl Display for NvmfTgtTransport {
95
+ fn fmt ( & self , f : & mut Formatter < ' _ > ) -> std:: fmt:: Result {
96
+ write ! (
97
+ f,
98
+ "{}" ,
99
+ match self {
100
+ NvmfTgtTransport :: Rdma => "rdma" ,
101
+ NvmfTgtTransport :: Tcp => "tcp" ,
102
+ }
103
+ )
104
+ }
105
+ }
106
+
107
+ /// Nvmf settings for the transports
108
+ #[ derive( Debug , Clone , Copy , PartialEq , Serialize , Deserialize ) ]
109
+ #[ serde( default , deny_unknown_fields) ]
110
+ pub struct NvmfTransportOpts {
111
+ /// max queue depth
112
+ max_queue_depth : u16 ,
113
+ /// max qpairs per controller
114
+ max_qpairs_per_ctrl : u16 ,
115
+ /// encapsulated data size
116
+ in_capsule_data_size : u32 ,
117
+ /// max IO size
118
+ max_io_size : u32 ,
119
+ /// IO unit size
120
+ io_unit_size : u32 ,
121
+ /// max admin queue depth per admin queue
122
+ max_aq_depth : u32 ,
123
+ /// num of shared buffers
124
+ num_shared_buf : u32 ,
125
+ /// cache size
126
+ buf_cache_size : u32 ,
127
+ /// dif
128
+ dif_insert_or_strip : bool ,
129
+ /// abort execution timeout
130
+ abort_timeout_sec : u32 ,
131
+ /// acceptor poll rate, microseconds
132
+ acceptor_poll_rate : u32 ,
133
+ /// Use zero-copy operations if the underlying bdev supports them
134
+ zcopy : bool ,
135
+ /// ACK timeout in milliseconds
136
+ ack_timeout : u32 ,
137
+ /// Size of RDMA data WR pool
138
+ data_wr_pool_size : u32 ,
139
+ }
140
+
141
+ impl NvmfTransportOpts {
142
+ pub fn new ( xprt : NvmfTgtTransport ) -> Self {
143
+ xprt. xprt_nvmf_opts ( )
144
+ }
145
+ }
146
+
147
+ impl Default for NvmfTransportOpts {
148
+ fn default ( ) -> Self {
149
+ NvmfTransportOpts :: new ( NvmfTgtTransport :: Tcp )
150
+ }
151
+ }
152
+
153
+ /// This can be extended to configure transport specific options
154
+ /// like tcp_transport_opts and rdma_transport_opts if required later.
155
+ pub trait TransportOpts {
156
+ fn xprt_nvmf_opts ( & self ) -> NvmfTransportOpts ;
157
+ }
158
+
159
+ impl TransportOpts for NvmfTgtTransport {
160
+ fn xprt_nvmf_opts ( & self ) -> NvmfTransportOpts {
161
+ match self {
162
+ NvmfTgtTransport :: Rdma => NvmfTransportOpts {
163
+ max_queue_depth : try_from_env ( "NVMF_RDMA_MAX_QUEUE_DEPTH" , 128 ) ,
164
+ in_capsule_data_size : 8192 ,
165
+ max_io_size : 131_072 ,
166
+ io_unit_size : 8192 ,
167
+ max_qpairs_per_ctrl : try_from_env (
168
+ "NVMF_RDMA_MAX_QPAIRS_PER_CTRL" ,
169
+ 32 ,
170
+ ) ,
171
+ num_shared_buf : try_from_env ( "NVMF_RDMA_NUM_SHARED_BUF" , 2047 ) ,
172
+ buf_cache_size : try_from_env ( "NVMF_RDMA_BUF_CACHE_SIZE" , 64 ) ,
173
+ dif_insert_or_strip : false ,
174
+ max_aq_depth : 32 ,
175
+ abort_timeout_sec : 1 ,
176
+ acceptor_poll_rate : try_from_env (
177
+ "NVMF_ACCEPTOR_POLL_RATE" ,
178
+ 10_000 ,
179
+ ) ,
180
+ zcopy : try_from_env ( "NVMF_ZCOPY" , 1 ) == 1 ,
181
+ ack_timeout : try_from_env ( "NVMF_ACK_TIMEOUT" , 0 ) ,
182
+ data_wr_pool_size : try_from_env ( "NVMF_DATA_WR_POOL_SIZE" , 4095 ) ,
183
+ } ,
184
+ NvmfTgtTransport :: Tcp => NvmfTransportOpts {
185
+ max_queue_depth : try_from_env ( "NVMF_TCP_MAX_QUEUE_DEPTH" , 32 ) ,
186
+ in_capsule_data_size : 4096 ,
187
+ max_io_size : 131_072 ,
188
+ io_unit_size : 131_072 ,
189
+ max_qpairs_per_ctrl : try_from_env (
190
+ "NVMF_TCP_MAX_QPAIRS_PER_CTRL" ,
191
+ 32 ,
192
+ ) ,
193
+ num_shared_buf : try_from_env ( "NVMF_TCP_NUM_SHARED_BUF" , 2047 ) ,
194
+ buf_cache_size : try_from_env ( "NVMF_TCP_BUF_CACHE_SIZE" , 64 ) ,
195
+ dif_insert_or_strip : false ,
196
+ max_aq_depth : 32 ,
197
+ abort_timeout_sec : 1 ,
198
+ acceptor_poll_rate : try_from_env (
199
+ "NVMF_ACCEPTOR_POLL_RATE" ,
200
+ 10_000 ,
201
+ ) ,
202
+ zcopy : try_from_env ( "NVMF_ZCOPY" , 1 ) == 1 ,
203
+ ack_timeout : try_from_env ( "NVMF_ACK_TIMEOUT" , 10_000 ) ,
204
+ data_wr_pool_size : try_from_env ( "NVMF_DATA_WR_POOL_SIZE" , 0 ) ,
205
+ } ,
206
+ }
207
+ }
208
+ }
209
+
87
210
#[ derive( Debug , Clone , PartialEq , Serialize , Deserialize ) ]
88
211
#[ serde( default , deny_unknown_fields) ]
89
212
pub struct NvmfTgtConfig {
@@ -94,11 +217,13 @@ pub struct NvmfTgtConfig {
94
217
/// NVMF target Command Retry Delay in x100 ms.
95
218
pub crdt : [ u16 ; TARGET_CRDT_LEN ] ,
96
219
/// TCP transport options
97
- pub opts : NvmfTcpTransportOpts ,
220
+ pub opts_tcp : NvmfTransportOpts ,
98
221
/// NVMF target interface (ip, mac, name or subnet).
99
222
pub interface : Option < String > ,
100
223
/// Enable RDMA for NVMF target or not
101
224
pub rdma : Option < bool > ,
225
+ /// RDMA transport options
226
+ pub opts_rdma : NvmfTransportOpts ,
102
227
}
103
228
104
229
impl From < NvmfTgtConfig > for Box < spdk_nvmf_target_opts > {
@@ -126,9 +251,10 @@ impl Default for NvmfTgtConfig {
126
251
name : "mayastor_target" . to_string ( ) ,
127
252
max_namespaces : 2048 ,
128
253
crdt : args. nvmf_tgt_crdt ,
129
- opts : NvmfTcpTransportOpts :: default ( ) ,
254
+ opts_tcp : NvmfTransportOpts :: new ( NvmfTgtTransport :: Tcp ) ,
130
255
interface : None ,
131
256
rdma : None ,
257
+ opts_rdma : NvmfTransportOpts :: new ( NvmfTgtTransport :: Rdma ) ,
132
258
}
133
259
}
134
260
}
@@ -139,40 +265,6 @@ impl GetOpts for NvmfTgtConfig {
139
265
}
140
266
}
141
267
142
- /// Settings for the TCP transport
143
- #[ derive( Debug , Clone , Copy , PartialEq , Serialize , Deserialize ) ]
144
- #[ serde( default , deny_unknown_fields) ]
145
- pub struct NvmfTcpTransportOpts {
146
- /// max queue depth
147
- max_queue_depth : u16 ,
148
- /// max qpairs per controller
149
- max_qpairs_per_ctrl : u16 ,
150
- /// encapsulated data size
151
- in_capsule_data_size : u32 ,
152
- /// max IO size
153
- max_io_size : u32 ,
154
- /// IO unit size
155
- io_unit_size : u32 ,
156
- /// max admin queue depth per admin queue
157
- max_aq_depth : u32 ,
158
- /// num of shared buffers
159
- num_shared_buf : u32 ,
160
- /// cache size
161
- buf_cache_size : u32 ,
162
- /// dif
163
- dif_insert_or_strip : bool ,
164
- /// abort execution timeout
165
- abort_timeout_sec : u32 ,
166
- /// acceptor poll rate, microseconds
167
- acceptor_poll_rate : u32 ,
168
- /// Use zero-copy operations if the underlying bdev supports them
169
- zcopy : bool ,
170
- /// ACK timeout in milliseconds
171
- ack_timeout : u32 ,
172
- /// Size of RDMA data WR pool
173
- data_wr_pool_size : u32 ,
174
- }
175
-
176
268
/// try to read an env variable or returns the default when not found
177
269
pub ( crate ) fn try_from_env < T > ( name : & str , default : T ) -> T
178
270
where
@@ -264,58 +356,32 @@ where
264
356
}
265
357
}
266
358
267
- impl Default for NvmfTcpTransportOpts {
268
- fn default ( ) -> Self {
269
- Self {
270
- max_queue_depth : try_from_env ( "NVMF_TCP_MAX_QUEUE_DEPTH" , 32 ) ,
271
- in_capsule_data_size : 4096 ,
272
- max_io_size : 131_072 ,
273
- io_unit_size : 131_072 ,
274
- max_qpairs_per_ctrl : try_from_env (
275
- "NVMF_TCP_MAX_QPAIRS_PER_CTRL" ,
276
- 32 ,
277
- ) ,
278
- num_shared_buf : try_from_env ( "NVMF_TCP_NUM_SHARED_BUF" , 2047 ) ,
279
- buf_cache_size : try_from_env ( "NVMF_TCP_BUF_CACHE_SIZE" , 64 ) ,
280
- dif_insert_or_strip : false ,
281
- max_aq_depth : 32 ,
282
- abort_timeout_sec : 1 ,
283
- acceptor_poll_rate : try_from_env ( "NVMF_ACCEPTOR_POLL_RATE" , 10_000 ) ,
284
- zcopy : try_from_env ( "NVMF_ZCOPY" , 1 ) == 1 ,
285
- ack_timeout : try_from_env ( "NVMF_ACK_TIMEOUT" , 0 ) ,
286
- data_wr_pool_size : try_from_env ( "NVMF_DATA_WR_POOL_SIZE" , 0 ) ,
287
- }
288
- }
289
- }
290
-
291
359
/// we cannot add derives for YAML to these structs directly, so we need to
292
360
/// copy them. The upside though, is that if the FFI structures change, we will
293
361
/// know about it during compile time.
294
- impl From < NvmfTcpTransportOpts > for spdk_nvmf_transport_opts {
295
- fn from ( o : NvmfTcpTransportOpts ) -> Self {
296
- struct_size_init ! (
297
- Self {
298
- max_queue_depth: o. max_queue_depth,
299
- max_qpairs_per_ctrlr: o. max_qpairs_per_ctrl,
300
- in_capsule_data_size: o. in_capsule_data_size,
301
- max_io_size: o. max_io_size,
302
- io_unit_size: o. io_unit_size,
303
- max_aq_depth: o. max_aq_depth,
304
- num_shared_buffers: o. num_shared_buf,
305
- buf_cache_size: o. buf_cache_size,
306
- dif_insert_or_strip: o. dif_insert_or_strip,
307
- reserved29: Default :: default ( ) ,
308
- abort_timeout_sec: o. abort_timeout_sec,
309
- association_timeout: 120000 ,
310
- transport_specific: std:: ptr:: null( ) ,
311
- acceptor_poll_rate: o. acceptor_poll_rate,
312
- zcopy: o. zcopy,
313
- reserved61: Default :: default ( ) ,
314
- ack_timeout: o. ack_timeout,
315
- data_wr_pool_size: o. data_wr_pool_size,
316
- } ,
317
- opts_size
318
- )
362
+ impl From < NvmfTransportOpts > for spdk_nvmf_transport_opts {
363
+ fn from ( o : NvmfTransportOpts ) -> Self {
364
+ Self {
365
+ max_queue_depth : o. max_queue_depth ,
366
+ max_qpairs_per_ctrlr : o. max_qpairs_per_ctrl ,
367
+ in_capsule_data_size : o. in_capsule_data_size ,
368
+ max_io_size : o. max_io_size ,
369
+ io_unit_size : o. io_unit_size ,
370
+ max_aq_depth : o. max_aq_depth ,
371
+ num_shared_buffers : o. num_shared_buf ,
372
+ buf_cache_size : o. buf_cache_size ,
373
+ dif_insert_or_strip : o. dif_insert_or_strip ,
374
+ reserved29 : Default :: default ( ) ,
375
+ abort_timeout_sec : o. abort_timeout_sec ,
376
+ association_timeout : 120000 ,
377
+ transport_specific : std:: ptr:: null ( ) ,
378
+ opts_size : std:: mem:: size_of :: < spdk_nvmf_transport_opts > ( ) as u64 ,
379
+ acceptor_poll_rate : o. acceptor_poll_rate ,
380
+ zcopy : o. zcopy ,
381
+ ack_timeout : o. ack_timeout ,
382
+ data_wr_pool_size : o. data_wr_pool_size ,
383
+ reserved61 : Default :: default ( ) ,
384
+ }
319
385
}
320
386
}
321
387
0 commit comments