16
16
#define UVERBS_MODULE_NAME mlx5_ib
17
17
#include <rdma/uverbs_named_ioctl.h>
18
18
19
+ #define MLX5_MAX_DESTROY_INBOX_SIZE_DW MLX5_ST_SZ_DW(delete_fte_in)
20
+ struct devx_obj {
21
+ struct mlx5_core_dev * mdev ;
22
+ u32 obj_id ;
23
+ u32 dinlen ; /* destroy inbox length */
24
+ u32 dinbox [MLX5_MAX_DESTROY_INBOX_SIZE_DW ];
25
+ };
26
+
19
27
static struct mlx5_ib_ucontext * devx_ufile2uctx (struct ib_uverbs_file * file )
20
28
{
21
29
return to_mucontext (ib_uverbs_get_ucontext (file ));
@@ -65,7 +73,52 @@ void mlx5_ib_devx_destroy(struct mlx5_ib_dev *dev,
65
73
mlx5_cmd_exec (dev -> mdev , in , sizeof (in ), out , sizeof (out ));
66
74
}
67
75
68
- static bool devx_is_general_cmd (void * in )
76
+ static bool devx_is_obj_create_cmd (const void * in )
77
+ {
78
+ u16 opcode = MLX5_GET (general_obj_in_cmd_hdr , in , opcode );
79
+
80
+ switch (opcode ) {
81
+ case MLX5_CMD_OP_CREATE_GENERAL_OBJECT :
82
+ case MLX5_CMD_OP_CREATE_MKEY :
83
+ case MLX5_CMD_OP_CREATE_CQ :
84
+ case MLX5_CMD_OP_ALLOC_PD :
85
+ case MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN :
86
+ case MLX5_CMD_OP_CREATE_RMP :
87
+ case MLX5_CMD_OP_CREATE_SQ :
88
+ case MLX5_CMD_OP_CREATE_RQ :
89
+ case MLX5_CMD_OP_CREATE_RQT :
90
+ case MLX5_CMD_OP_CREATE_TIR :
91
+ case MLX5_CMD_OP_CREATE_TIS :
92
+ case MLX5_CMD_OP_ALLOC_Q_COUNTER :
93
+ case MLX5_CMD_OP_CREATE_FLOW_TABLE :
94
+ case MLX5_CMD_OP_CREATE_FLOW_GROUP :
95
+ case MLX5_CMD_OP_ALLOC_FLOW_COUNTER :
96
+ case MLX5_CMD_OP_ALLOC_ENCAP_HEADER :
97
+ case MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT :
98
+ case MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT :
99
+ case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT :
100
+ case MLX5_CMD_OP_SET_L2_TABLE_ENTRY :
101
+ case MLX5_CMD_OP_CREATE_QP :
102
+ case MLX5_CMD_OP_CREATE_SRQ :
103
+ case MLX5_CMD_OP_CREATE_XRC_SRQ :
104
+ case MLX5_CMD_OP_CREATE_DCT :
105
+ case MLX5_CMD_OP_CREATE_XRQ :
106
+ case MLX5_CMD_OP_ATTACH_TO_MCG :
107
+ case MLX5_CMD_OP_ALLOC_XRCD :
108
+ return true;
109
+ case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY :
110
+ {
111
+ u16 op_mod = MLX5_GET (set_fte_in , in , op_mod );
112
+ if (op_mod == 0 )
113
+ return true;
114
+ return false;
115
+ }
116
+ default :
117
+ return false;
118
+ }
119
+ }
120
+
121
+ static bool devx_is_general_cmd (const void * in )
69
122
{
70
123
u16 opcode = MLX5_GET (general_obj_in_cmd_hdr , in , opcode );
71
124
@@ -95,7 +148,8 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OTHER)(struct ib_device *ib_dev,
95
148
{
96
149
struct mlx5_ib_ucontext * c = devx_ufile2uctx (file );
97
150
struct mlx5_ib_dev * dev = to_mdev (ib_dev );
98
- void * cmd_in = uverbs_attr_get_alloced_ptr (attrs , MLX5_IB_ATTR_DEVX_OTHER_CMD_IN );
151
+ void * cmd_in = uverbs_attr_get_alloced_ptr (
152
+ attrs , MLX5_IB_ATTR_DEVX_OTHER_CMD_IN );
99
153
int cmd_out_len = uverbs_attr_get_len (attrs ,
100
154
MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT );
101
155
void * cmd_out ;
@@ -126,6 +180,256 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OTHER)(struct ib_device *ib_dev,
126
180
return err ;
127
181
}
128
182
183
+ static void devx_obj_build_destroy_cmd (void * in , void * out , void * din ,
184
+ u32 * dinlen ,
185
+ u32 * obj_id )
186
+ {
187
+ u16 obj_type = MLX5_GET (general_obj_in_cmd_hdr , in , obj_type );
188
+ u16 uid = MLX5_GET (general_obj_in_cmd_hdr , in , uid );
189
+
190
+ * obj_id = MLX5_GET (general_obj_out_cmd_hdr , out , obj_id );
191
+ * dinlen = MLX5_ST_SZ_BYTES (general_obj_in_cmd_hdr );
192
+
193
+ MLX5_SET (general_obj_in_cmd_hdr , din , obj_id , * obj_id );
194
+ MLX5_SET (general_obj_in_cmd_hdr , din , uid , uid );
195
+
196
+ switch (MLX5_GET (general_obj_in_cmd_hdr , in , opcode )) {
197
+ case MLX5_CMD_OP_CREATE_GENERAL_OBJECT :
198
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DESTROY_GENERAL_OBJECT );
199
+ MLX5_SET (general_obj_in_cmd_hdr , din , obj_type , obj_type );
200
+ break ;
201
+
202
+ case MLX5_CMD_OP_CREATE_MKEY :
203
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DESTROY_MKEY );
204
+ break ;
205
+ case MLX5_CMD_OP_CREATE_CQ :
206
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DESTROY_CQ );
207
+ break ;
208
+ case MLX5_CMD_OP_ALLOC_PD :
209
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DEALLOC_PD );
210
+ break ;
211
+ case MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN :
212
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode ,
213
+ MLX5_CMD_OP_DEALLOC_TRANSPORT_DOMAIN );
214
+ break ;
215
+ case MLX5_CMD_OP_CREATE_RMP :
216
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DESTROY_RMP );
217
+ break ;
218
+ case MLX5_CMD_OP_CREATE_SQ :
219
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DESTROY_SQ );
220
+ break ;
221
+ case MLX5_CMD_OP_CREATE_RQ :
222
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DESTROY_RQ );
223
+ break ;
224
+ case MLX5_CMD_OP_CREATE_RQT :
225
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DESTROY_RQT );
226
+ break ;
227
+ case MLX5_CMD_OP_CREATE_TIR :
228
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DESTROY_TIR );
229
+ break ;
230
+ case MLX5_CMD_OP_CREATE_TIS :
231
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DESTROY_TIS );
232
+ break ;
233
+ case MLX5_CMD_OP_ALLOC_Q_COUNTER :
234
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode ,
235
+ MLX5_CMD_OP_DEALLOC_Q_COUNTER );
236
+ break ;
237
+ case MLX5_CMD_OP_CREATE_FLOW_TABLE :
238
+ * dinlen = MLX5_ST_SZ_BYTES (destroy_flow_table_in );
239
+ * obj_id = MLX5_GET (create_flow_table_out , out , table_id );
240
+ MLX5_SET (destroy_flow_table_in , din , other_vport ,
241
+ MLX5_GET (create_flow_table_in , in , other_vport ));
242
+ MLX5_SET (destroy_flow_table_in , din , vport_number ,
243
+ MLX5_GET (create_flow_table_in , in , vport_number ));
244
+ MLX5_SET (destroy_flow_table_in , din , table_type ,
245
+ MLX5_GET (create_flow_table_in , in , table_type ));
246
+ MLX5_SET (destroy_flow_table_in , din , table_id , * obj_id );
247
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode ,
248
+ MLX5_CMD_OP_DESTROY_FLOW_TABLE );
249
+ break ;
250
+ case MLX5_CMD_OP_CREATE_FLOW_GROUP :
251
+ * dinlen = MLX5_ST_SZ_BYTES (destroy_flow_group_in );
252
+ * obj_id = MLX5_GET (create_flow_group_out , out , group_id );
253
+ MLX5_SET (destroy_flow_group_in , din , other_vport ,
254
+ MLX5_GET (create_flow_group_in , in , other_vport ));
255
+ MLX5_SET (destroy_flow_group_in , din , vport_number ,
256
+ MLX5_GET (create_flow_group_in , in , vport_number ));
257
+ MLX5_SET (destroy_flow_group_in , din , table_type ,
258
+ MLX5_GET (create_flow_group_in , in , table_type ));
259
+ MLX5_SET (destroy_flow_group_in , din , table_id ,
260
+ MLX5_GET (create_flow_group_in , in , table_id ));
261
+ MLX5_SET (destroy_flow_group_in , din , group_id , * obj_id );
262
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode ,
263
+ MLX5_CMD_OP_DESTROY_FLOW_GROUP );
264
+ break ;
265
+ case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY :
266
+ * dinlen = MLX5_ST_SZ_BYTES (delete_fte_in );
267
+ * obj_id = MLX5_GET (set_fte_in , in , flow_index );
268
+ MLX5_SET (delete_fte_in , din , other_vport ,
269
+ MLX5_GET (set_fte_in , in , other_vport ));
270
+ MLX5_SET (delete_fte_in , din , vport_number ,
271
+ MLX5_GET (set_fte_in , in , vport_number ));
272
+ MLX5_SET (delete_fte_in , din , table_type ,
273
+ MLX5_GET (set_fte_in , in , table_type ));
274
+ MLX5_SET (delete_fte_in , din , table_id ,
275
+ MLX5_GET (set_fte_in , in , table_id ));
276
+ MLX5_SET (delete_fte_in , din , flow_index , * obj_id );
277
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode ,
278
+ MLX5_CMD_OP_DELETE_FLOW_TABLE_ENTRY );
279
+ break ;
280
+ case MLX5_CMD_OP_ALLOC_FLOW_COUNTER :
281
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode ,
282
+ MLX5_CMD_OP_DEALLOC_FLOW_COUNTER );
283
+ break ;
284
+ case MLX5_CMD_OP_ALLOC_ENCAP_HEADER :
285
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode ,
286
+ MLX5_CMD_OP_DEALLOC_ENCAP_HEADER );
287
+ break ;
288
+ case MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT :
289
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode ,
290
+ MLX5_CMD_OP_DEALLOC_MODIFY_HEADER_CONTEXT );
291
+ break ;
292
+ case MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT :
293
+ * dinlen = MLX5_ST_SZ_BYTES (destroy_scheduling_element_in );
294
+ * obj_id = MLX5_GET (create_scheduling_element_out , out ,
295
+ scheduling_element_id );
296
+ MLX5_SET (destroy_scheduling_element_in , din ,
297
+ scheduling_hierarchy ,
298
+ MLX5_GET (create_scheduling_element_in , in ,
299
+ scheduling_hierarchy ));
300
+ MLX5_SET (destroy_scheduling_element_in , din ,
301
+ scheduling_element_id , * obj_id );
302
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode ,
303
+ MLX5_CMD_OP_DESTROY_SCHEDULING_ELEMENT );
304
+ break ;
305
+ case MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT :
306
+ * dinlen = MLX5_ST_SZ_BYTES (delete_vxlan_udp_dport_in );
307
+ * obj_id = MLX5_GET (add_vxlan_udp_dport_in , in , vxlan_udp_port );
308
+ MLX5_SET (delete_vxlan_udp_dport_in , din , vxlan_udp_port , * obj_id );
309
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode ,
310
+ MLX5_CMD_OP_DELETE_VXLAN_UDP_DPORT );
311
+ break ;
312
+ case MLX5_CMD_OP_SET_L2_TABLE_ENTRY :
313
+ * dinlen = MLX5_ST_SZ_BYTES (delete_l2_table_entry_in );
314
+ * obj_id = MLX5_GET (set_l2_table_entry_in , in , table_index );
315
+ MLX5_SET (delete_l2_table_entry_in , din , table_index , * obj_id );
316
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode ,
317
+ MLX5_CMD_OP_DELETE_L2_TABLE_ENTRY );
318
+ break ;
319
+ case MLX5_CMD_OP_CREATE_QP :
320
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DESTROY_QP );
321
+ break ;
322
+ case MLX5_CMD_OP_CREATE_SRQ :
323
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DESTROY_SRQ );
324
+ break ;
325
+ case MLX5_CMD_OP_CREATE_XRC_SRQ :
326
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode ,
327
+ MLX5_CMD_OP_DESTROY_XRC_SRQ );
328
+ break ;
329
+ case MLX5_CMD_OP_CREATE_DCT :
330
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DESTROY_DCT );
331
+ break ;
332
+ case MLX5_CMD_OP_CREATE_XRQ :
333
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DESTROY_XRQ );
334
+ break ;
335
+ case MLX5_CMD_OP_ATTACH_TO_MCG :
336
+ * dinlen = MLX5_ST_SZ_BYTES (detach_from_mcg_in );
337
+ MLX5_SET (detach_from_mcg_in , din , qpn ,
338
+ MLX5_GET (attach_to_mcg_in , in , qpn ));
339
+ memcpy (MLX5_ADDR_OF (detach_from_mcg_in , din , multicast_gid ),
340
+ MLX5_ADDR_OF (attach_to_mcg_in , in , multicast_gid ),
341
+ MLX5_FLD_SZ_BYTES (attach_to_mcg_in , multicast_gid ));
342
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DETACH_FROM_MCG );
343
+ break ;
344
+ case MLX5_CMD_OP_ALLOC_XRCD :
345
+ MLX5_SET (general_obj_in_cmd_hdr , din , opcode , MLX5_CMD_OP_DEALLOC_XRCD );
346
+ break ;
347
+ default :
348
+ /* The entry must match to one of the devx_is_obj_create_cmd */
349
+ WARN_ON (true);
350
+ break ;
351
+ }
352
+ }
353
+
354
+ static int devx_obj_cleanup (struct ib_uobject * uobject ,
355
+ enum rdma_remove_reason why )
356
+ {
357
+ u32 out [MLX5_ST_SZ_DW (general_obj_out_cmd_hdr )];
358
+ struct devx_obj * obj = uobject -> object ;
359
+ int ret ;
360
+
361
+ ret = mlx5_cmd_exec (obj -> mdev , obj -> dinbox , obj -> dinlen , out , sizeof (out ));
362
+ if (ret && why == RDMA_REMOVE_DESTROY )
363
+ return ret ;
364
+
365
+ kfree (obj );
366
+ return ret ;
367
+ }
368
+
369
+ static int UVERBS_HANDLER (MLX5_IB_METHOD_DEVX_OBJ_DESTROY )(struct ib_device * ib_dev ,
370
+ struct ib_uverbs_file * file ,
371
+ struct uverbs_attr_bundle * attrs )
372
+ {
373
+ return 0 ;
374
+ }
375
+
376
+ static int UVERBS_HANDLER (MLX5_IB_METHOD_DEVX_OBJ_CREATE )(struct ib_device * ib_dev ,
377
+ struct ib_uverbs_file * file ,
378
+ struct uverbs_attr_bundle * attrs )
379
+ {
380
+ struct mlx5_ib_ucontext * c = devx_ufile2uctx (file );
381
+ struct mlx5_ib_dev * dev = to_mdev (ib_dev );
382
+ void * cmd_in = uverbs_attr_get_alloced_ptr (attrs , MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN );
383
+ int cmd_out_len = uverbs_attr_get_len (attrs ,
384
+ MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT );
385
+ void * cmd_out ;
386
+ struct ib_uobject * uobj ;
387
+ struct devx_obj * obj ;
388
+ int err ;
389
+
390
+ if (!c -> devx_uid )
391
+ return - EPERM ;
392
+
393
+ if (!devx_is_obj_create_cmd (cmd_in ))
394
+ return - EINVAL ;
395
+
396
+ obj = kzalloc (sizeof (struct devx_obj ), GFP_KERNEL );
397
+ if (!obj )
398
+ return - ENOMEM ;
399
+
400
+ cmd_out = kvzalloc (cmd_out_len , GFP_KERNEL );
401
+ if (!cmd_out ) {
402
+ err = - ENOMEM ;
403
+ goto obj_free ;
404
+ }
405
+
406
+ MLX5_SET (general_obj_in_cmd_hdr , cmd_in , uid , c -> devx_uid );
407
+ err = mlx5_cmd_exec (dev -> mdev , cmd_in ,
408
+ uverbs_attr_get_len (attrs , MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN ),
409
+ cmd_out , cmd_out_len );
410
+ if (err )
411
+ goto cmd_free ;
412
+
413
+ uobj = uverbs_attr_get_uobject (attrs , MLX5_IB_ATTR_DEVX_OBJ_CREATE_HANDLE );
414
+ uobj -> object = obj ;
415
+ obj -> mdev = dev -> mdev ;
416
+ devx_obj_build_destroy_cmd (cmd_in , cmd_out , obj -> dinbox , & obj -> dinlen , & obj -> obj_id );
417
+ WARN_ON (obj -> dinlen > MLX5_MAX_DESTROY_INBOX_SIZE_DW * sizeof (u32 ));
418
+
419
+ err = uverbs_copy_to (attrs , MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT , cmd_out , cmd_out_len );
420
+ if (err )
421
+ goto cmd_free ;
422
+
423
+ kvfree (cmd_out );
424
+ return 0 ;
425
+
426
+ cmd_free :
427
+ kvfree (cmd_out );
428
+ obj_free :
429
+ kfree (obj );
430
+ return err ;
431
+ }
432
+
129
433
static DECLARE_UVERBS_NAMED_METHOD (MLX5_IB_METHOD_DEVX_OTHER ,
130
434
& UVERBS_ATTR_PTR_IN_SZ (MLX5_IB_ATTR_DEVX_OTHER_CMD_IN ,
131
435
UVERBS_ATTR_MIN_SIZE (MLX5_ST_SZ_BYTES (general_obj_in_cmd_hdr )),
@@ -138,8 +442,35 @@ static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OTHER,
138
442
UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO ))
139
443
) ;
140
444
445
+ static DECLARE_UVERBS_NAMED_METHOD (MLX5_IB_METHOD_DEVX_OBJ_CREATE ,
446
+ & UVERBS_ATTR_IDR (MLX5_IB_ATTR_DEVX_OBJ_CREATE_HANDLE ,
447
+ MLX5_IB_OBJECT_DEVX_OBJ ,
448
+ UVERBS_ACCESS_NEW ,
449
+ UA_FLAGS (UVERBS_ATTR_SPEC_F_MANDATORY )),
450
+ & UVERBS_ATTR_PTR_IN_SZ (MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN ,
451
+ UVERBS_ATTR_MIN_SIZE (MLX5_ST_SZ_BYTES (general_obj_in_cmd_hdr )),
452
+ UA_FLAGS (UVERBS_ATTR_SPEC_F_MANDATORY |
453
+ UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO |
454
+ UVERBS_ATTR_SPEC_F_ALLOC_AND_COPY )),
455
+ & UVERBS_ATTR_PTR_OUT_SZ (MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT ,
456
+ UVERBS_ATTR_MIN_SIZE (MLX5_ST_SZ_BYTES (general_obj_out_cmd_hdr )),
457
+ UA_FLAGS (UVERBS_ATTR_SPEC_F_MANDATORY |
458
+ UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO ))) ;
459
+
460
+ static DECLARE_UVERBS_NAMED_METHOD (MLX5_IB_METHOD_DEVX_OBJ_DESTROY ,
461
+ & UVERBS_ATTR_IDR (MLX5_IB_ATTR_DEVX_OBJ_DESTROY_HANDLE ,
462
+ MLX5_IB_OBJECT_DEVX_OBJ ,
463
+ UVERBS_ACCESS_DESTROY ,
464
+ UA_FLAGS (UVERBS_ATTR_SPEC_F_MANDATORY ))) ;
465
+
141
466
static DECLARE_UVERBS_GLOBAL_METHODS (MLX5_IB_OBJECT_DEVX ,
142
467
& UVERBS_METHOD (MLX5_IB_METHOD_DEVX_OTHER )) ;
143
468
469
+ static DECLARE_UVERBS_NAMED_OBJECT (MLX5_IB_OBJECT_DEVX_OBJ ,
470
+ & UVERBS_TYPE_ALLOC_IDR (0 , devx_obj_cleanup ),
471
+ & UVERBS_METHOD (MLX5_IB_METHOD_DEVX_OBJ_CREATE ),
472
+ & UVERBS_METHOD (MLX5_IB_METHOD_DEVX_OBJ_DESTROY ));
473
+
144
474
static DECLARE_UVERBS_OBJECT_TREE (devx_objects ,
145
- & UVERBS_OBJECT (MLX5_IB_OBJECT_DEVX )) ;
475
+ & UVERBS_OBJECT (MLX5_IB_OBJECT_DEVX ),
476
+ & UVERBS_OBJECT (MLX5_IB_OBJECT_DEVX_OBJ )) ;
0 commit comments