forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 072de836f53be56a70cecf70b43ae43b7ce17376
kernel/drivers/infiniband/core/verbs.c
....@@ -50,8 +50,10 @@
5050 #include <rdma/ib_cache.h>
5151 #include <rdma/ib_addr.h>
5252 #include <rdma/rw.h>
53
+#include <rdma/lag.h>
5354
5455 #include "core_priv.h"
56
+#include <trace/events/rdma_core.h>
5557
5658 static int ib_resolve_eth_dmac(struct ib_device *device,
5759 struct rdma_ah_attr *ah_attr);
....@@ -141,6 +143,10 @@
141143 case IB_RATE_100_GBPS: return 40;
142144 case IB_RATE_200_GBPS: return 80;
143145 case IB_RATE_300_GBPS: return 120;
146
+ case IB_RATE_28_GBPS: return 11;
147
+ case IB_RATE_50_GBPS: return 20;
148
+ case IB_RATE_400_GBPS: return 160;
149
+ case IB_RATE_600_GBPS: return 240;
144150 default: return -1;
145151 }
146152 }
....@@ -166,6 +172,10 @@
166172 case 40: return IB_RATE_100_GBPS;
167173 case 80: return IB_RATE_200_GBPS;
168174 case 120: return IB_RATE_300_GBPS;
175
+ case 11: return IB_RATE_28_GBPS;
176
+ case 20: return IB_RATE_50_GBPS;
177
+ case 160: return IB_RATE_400_GBPS;
178
+ case 240: return IB_RATE_600_GBPS;
169179 default: return IB_RATE_PORT_CURRENT;
170180 }
171181 }
....@@ -191,13 +201,17 @@
191201 case IB_RATE_100_GBPS: return 103125;
192202 case IB_RATE_200_GBPS: return 206250;
193203 case IB_RATE_300_GBPS: return 309375;
204
+ case IB_RATE_28_GBPS: return 28125;
205
+ case IB_RATE_50_GBPS: return 53125;
206
+ case IB_RATE_400_GBPS: return 425000;
207
+ case IB_RATE_600_GBPS: return 637500;
194208 default: return -1;
195209 }
196210 }
197211 EXPORT_SYMBOL(ib_rate_to_mbps);
198212
199213 __attribute_const__ enum rdma_transport_type
200
-rdma_node_get_transport(enum rdma_node_type node_type)
214
+rdma_node_get_transport(unsigned int node_type)
201215 {
202216
203217 if (node_type == RDMA_NODE_USNIC)
....@@ -206,6 +220,8 @@
206220 return RDMA_TRANSPORT_USNIC_UDP;
207221 if (node_type == RDMA_NODE_RNIC)
208222 return RDMA_TRANSPORT_IWARP;
223
+ if (node_type == RDMA_NODE_UNSPECIFIED)
224
+ return RDMA_TRANSPORT_UNSPECIFIED;
209225
210226 return RDMA_TRANSPORT_IB;
211227 }
....@@ -214,8 +230,8 @@
214230 enum rdma_link_layer rdma_port_get_link_layer(struct ib_device *device, u8 port_num)
215231 {
216232 enum rdma_transport_type lt;
217
- if (device->get_link_layer)
218
- return device->get_link_layer(device, port_num);
233
+ if (device->ops.get_link_layer)
234
+ return device->ops.get_link_layer(device, port_num);
219235
220236 lt = rdma_node_get_transport(device->node_type);
221237 if (lt == RDMA_TRANSPORT_IB)
....@@ -230,6 +246,8 @@
230246 /**
231247 * ib_alloc_pd - Allocates an unused protection domain.
232248 * @device: The device on which to allocate the protection domain.
249
+ * @flags: protection domain flags
250
+ * @caller: caller's build-time module name
233251 *
234252 * A protection domain object provides an association between QPs, shared
235253 * receive queues, address handles, memory regions, and memory windows.
....@@ -242,16 +260,28 @@
242260 {
243261 struct ib_pd *pd;
244262 int mr_access_flags = 0;
263
+ int ret;
245264
246
- pd = device->alloc_pd(device, NULL, NULL);
247
- if (IS_ERR(pd))
248
- return pd;
265
+ pd = rdma_zalloc_drv_obj(device, ib_pd);
266
+ if (!pd)
267
+ return ERR_PTR(-ENOMEM);
249268
250269 pd->device = device;
251270 pd->uobject = NULL;
252271 pd->__internal_mr = NULL;
253272 atomic_set(&pd->usecnt, 0);
254273 pd->flags = flags;
274
+
275
+ rdma_restrack_new(&pd->res, RDMA_RESTRACK_PD);
276
+ rdma_restrack_set_name(&pd->res, caller);
277
+
278
+ ret = device->ops.alloc_pd(pd, NULL);
279
+ if (ret) {
280
+ rdma_restrack_put(&pd->res);
281
+ kfree(pd);
282
+ return ERR_PTR(ret);
283
+ }
284
+ rdma_restrack_add(&pd->res);
255285
256286 if (device->attrs.device_cap_flags & IB_DEVICE_LOCAL_DMA_LKEY)
257287 pd->local_dma_lkey = device->local_dma_lkey;
....@@ -263,14 +293,10 @@
263293 mr_access_flags |= IB_ACCESS_REMOTE_READ | IB_ACCESS_REMOTE_WRITE;
264294 }
265295
266
- pd->res.type = RDMA_RESTRACK_PD;
267
- pd->res.kern_name = caller;
268
- rdma_restrack_add(&pd->res);
269
-
270296 if (mr_access_flags) {
271297 struct ib_mr *mr;
272298
273
- mr = pd->device->get_dma_mr(pd, mr_access_flags);
299
+ mr = pd->device->ops.get_dma_mr(pd, mr_access_flags);
274300 if (IS_ERR(mr)) {
275301 ib_dealloc_pd(pd);
276302 return ERR_CAST(mr);
....@@ -278,6 +304,7 @@
278304
279305 mr->device = pd->device;
280306 mr->pd = pd;
307
+ mr->type = IB_MR_TYPE_DMA;
281308 mr->uobject = NULL;
282309 mr->need_inval = false;
283310
....@@ -295,19 +322,20 @@
295322 EXPORT_SYMBOL(__ib_alloc_pd);
296323
297324 /**
298
- * ib_dealloc_pd - Deallocates a protection domain.
325
+ * ib_dealloc_pd_user - Deallocates a protection domain.
299326 * @pd: The protection domain to deallocate.
327
+ * @udata: Valid user data or NULL for kernel object
300328 *
301329 * It is an error to call this function while any resources in the pd still
302330 * exist. The caller is responsible to synchronously destroy them and
303331 * guarantee no new allocations will happen.
304332 */
305
-void ib_dealloc_pd(struct ib_pd *pd)
333
+int ib_dealloc_pd_user(struct ib_pd *pd, struct ib_udata *udata)
306334 {
307335 int ret;
308336
309337 if (pd->__internal_mr) {
310
- ret = pd->device->dereg_mr(pd->__internal_mr);
338
+ ret = pd->device->ops.dereg_mr(pd->__internal_mr, NULL);
311339 WARN_ON(ret);
312340 pd->__internal_mr = NULL;
313341 }
....@@ -316,13 +344,15 @@
316344 requires the caller to guarantee we can't race here. */
317345 WARN_ON(atomic_read(&pd->usecnt));
318346
347
+ ret = pd->device->ops.dealloc_pd(pd, udata);
348
+ if (ret)
349
+ return ret;
350
+
319351 rdma_restrack_del(&pd->res);
320
- /* Making delalloc_pd a void return is a WIP, no driver should return
321
- an error here. */
322
- ret = pd->device->dealloc_pd(pd);
323
- WARN_ONCE(ret, "Infiniband HW driver failed dealloc_pd");
352
+ kfree(pd);
353
+ return ret;
324354 }
325
-EXPORT_SYMBOL(ib_dealloc_pd);
355
+EXPORT_SYMBOL(ib_dealloc_pd_user);
326356
327357 /* Address handles */
328358
....@@ -475,25 +505,41 @@
475505
476506 static struct ib_ah *_rdma_create_ah(struct ib_pd *pd,
477507 struct rdma_ah_attr *ah_attr,
478
- struct ib_udata *udata)
508
+ u32 flags,
509
+ struct ib_udata *udata,
510
+ struct net_device *xmit_slave)
479511 {
512
+ struct rdma_ah_init_attr init_attr = {};
513
+ struct ib_device *device = pd->device;
480514 struct ib_ah *ah;
515
+ int ret;
481516
482
- if (!pd->device->create_ah)
517
+ might_sleep_if(flags & RDMA_CREATE_AH_SLEEPABLE);
518
+
519
+ if (!device->ops.create_ah)
483520 return ERR_PTR(-EOPNOTSUPP);
484521
485
- ah = pd->device->create_ah(pd, ah_attr, udata);
522
+ ah = rdma_zalloc_drv_obj_gfp(
523
+ device, ib_ah,
524
+ (flags & RDMA_CREATE_AH_SLEEPABLE) ? GFP_KERNEL : GFP_ATOMIC);
525
+ if (!ah)
526
+ return ERR_PTR(-ENOMEM);
486527
487
- if (!IS_ERR(ah)) {
488
- ah->device = pd->device;
489
- ah->pd = pd;
490
- ah->uobject = NULL;
491
- ah->type = ah_attr->type;
492
- ah->sgid_attr = rdma_update_sgid_attr(ah_attr, NULL);
528
+ ah->device = device;
529
+ ah->pd = pd;
530
+ ah->type = ah_attr->type;
531
+ ah->sgid_attr = rdma_update_sgid_attr(ah_attr, NULL);
532
+ init_attr.ah_attr = ah_attr;
533
+ init_attr.flags = flags;
534
+ init_attr.xmit_slave = xmit_slave;
493535
494
- atomic_inc(&pd->usecnt);
536
+ ret = device->ops.create_ah(ah, &init_attr, udata);
537
+ if (ret) {
538
+ kfree(ah);
539
+ return ERR_PTR(ret);
495540 }
496541
542
+ atomic_inc(&pd->usecnt);
497543 return ah;
498544 }
499545
....@@ -502,23 +548,32 @@
502548 * given address vector.
503549 * @pd: The protection domain associated with the address handle.
504550 * @ah_attr: The attributes of the address vector.
551
+ * @flags: Create address handle flags (see enum rdma_create_ah_flags).
505552 *
506553 * It returns 0 on success and returns appropriate error code on error.
507554 * The address handle is used to reference a local or global destination
508555 * in all UD QP post sends.
509556 */
510
-struct ib_ah *rdma_create_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr)
557
+struct ib_ah *rdma_create_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr,
558
+ u32 flags)
511559 {
512560 const struct ib_gid_attr *old_sgid_attr;
561
+ struct net_device *slave;
513562 struct ib_ah *ah;
514563 int ret;
515564
516565 ret = rdma_fill_sgid_attr(pd->device, ah_attr, &old_sgid_attr);
517566 if (ret)
518567 return ERR_PTR(ret);
519
-
520
- ah = _rdma_create_ah(pd, ah_attr, NULL);
521
-
568
+ slave = rdma_lag_get_ah_roce_slave(pd->device, ah_attr,
569
+ (flags & RDMA_CREATE_AH_SLEEPABLE) ?
570
+ GFP_KERNEL : GFP_ATOMIC);
571
+ if (IS_ERR(slave)) {
572
+ rdma_unfill_sgid_attr(ah_attr, old_sgid_attr);
573
+ return (void *)slave;
574
+ }
575
+ ah = _rdma_create_ah(pd, ah_attr, flags, NULL, slave);
576
+ rdma_lag_put_ah_roce_slave(slave);
522577 rdma_unfill_sgid_attr(ah_attr, old_sgid_attr);
523578 return ah;
524579 }
....@@ -557,7 +612,8 @@
557612 }
558613 }
559614
560
- ah = _rdma_create_ah(pd, ah_attr, udata);
615
+ ah = _rdma_create_ah(pd, ah_attr, RDMA_CREATE_AH_SLEEPABLE,
616
+ udata, NULL);
561617
562618 out:
563619 rdma_unfill_sgid_attr(ah_attr, old_sgid_attr);
....@@ -628,16 +684,17 @@
628684 void *context)
629685 {
630686 struct find_gid_index_context *ctx = context;
687
+ u16 vlan_id = 0xffff;
688
+ int ret;
631689
632690 if (ctx->gid_type != gid_attr->gid_type)
633691 return false;
634692
635
- if ((!!(ctx->vlan_id != 0xffff) == !is_vlan_dev(gid_attr->ndev)) ||
636
- (is_vlan_dev(gid_attr->ndev) &&
637
- vlan_dev_vlan_id(gid_attr->ndev) != ctx->vlan_id))
693
+ ret = rdma_read_gid_l2_fields(gid_attr, &vlan_id, NULL);
694
+ if (ret)
638695 return false;
639696
640
- return true;
697
+ return ctx->vlan_id == vlan_id;
641698 }
642699
643700 static const struct ib_gid_attr *
....@@ -676,7 +733,7 @@
676733 (struct in6_addr *)dgid);
677734 return 0;
678735 } else if (net_type == RDMA_NETWORK_IPV6 ||
679
- net_type == RDMA_NETWORK_IB) {
736
+ net_type == RDMA_NETWORK_IB || RDMA_NETWORK_ROCE_V1) {
680737 *dgid = hdr->ibgrh.dgid;
681738 *sgid = hdr->ibgrh.sgid;
682739 return 0;
....@@ -710,7 +767,7 @@
710767
711768 ret = rdma_addr_find_l2_eth_by_grh(&sgid_attr->gid, &grh->dgid,
712769 ah_attr->roce.dmac,
713
- sgid_attr->ndev, &hop_limit);
770
+ sgid_attr, &hop_limit);
714771
715772 grh->hop_limit = hop_limit;
716773 return ret;
....@@ -869,7 +926,7 @@
869926 if (ret)
870927 return ERR_PTR(ret);
871928
872
- ah = rdma_create_ah(pd, &ah_attr);
929
+ ah = rdma_create_ah(pd, &ah_attr, RDMA_CREATE_AH_SLEEPABLE);
873930
874931 rdma_destroy_ah_attr(&ah_attr);
875932 return ah;
....@@ -888,8 +945,8 @@
888945 if (ret)
889946 return ret;
890947
891
- ret = ah->device->modify_ah ?
892
- ah->device->modify_ah(ah, ah_attr) :
948
+ ret = ah->device->ops.modify_ah ?
949
+ ah->device->ops.modify_ah(ah, ah_attr) :
893950 -EOPNOTSUPP;
894951
895952 ah->sgid_attr = rdma_update_sgid_attr(ah_attr, ah->sgid_attr);
....@@ -902,113 +959,135 @@
902959 {
903960 ah_attr->grh.sgid_attr = NULL;
904961
905
- return ah->device->query_ah ?
906
- ah->device->query_ah(ah, ah_attr) :
962
+ return ah->device->ops.query_ah ?
963
+ ah->device->ops.query_ah(ah, ah_attr) :
907964 -EOPNOTSUPP;
908965 }
909966 EXPORT_SYMBOL(rdma_query_ah);
910967
911
-int rdma_destroy_ah(struct ib_ah *ah)
968
+int rdma_destroy_ah_user(struct ib_ah *ah, u32 flags, struct ib_udata *udata)
912969 {
913970 const struct ib_gid_attr *sgid_attr = ah->sgid_attr;
914971 struct ib_pd *pd;
915972 int ret;
916973
917
- pd = ah->pd;
918
- ret = ah->device->destroy_ah(ah);
919
- if (!ret) {
920
- atomic_dec(&pd->usecnt);
921
- if (sgid_attr)
922
- rdma_put_gid_attr(sgid_attr);
923
- }
974
+ might_sleep_if(flags & RDMA_DESTROY_AH_SLEEPABLE);
924975
976
+ pd = ah->pd;
977
+
978
+ ret = ah->device->ops.destroy_ah(ah, flags);
979
+ if (ret)
980
+ return ret;
981
+
982
+ atomic_dec(&pd->usecnt);
983
+ if (sgid_attr)
984
+ rdma_put_gid_attr(sgid_attr);
985
+
986
+ kfree(ah);
925987 return ret;
926988 }
927
-EXPORT_SYMBOL(rdma_destroy_ah);
989
+EXPORT_SYMBOL(rdma_destroy_ah_user);
928990
929991 /* Shared receive queues */
930992
931
-struct ib_srq *ib_create_srq(struct ib_pd *pd,
932
- struct ib_srq_init_attr *srq_init_attr)
993
+/**
994
+ * ib_create_srq_user - Creates a SRQ associated with the specified protection
995
+ * domain.
996
+ * @pd: The protection domain associated with the SRQ.
997
+ * @srq_init_attr: A list of initial attributes required to create the
998
+ * SRQ. If SRQ creation succeeds, then the attributes are updated to
999
+ * the actual capabilities of the created SRQ.
1000
+ * @uobject: uobject pointer if this is not a kernel SRQ
1001
+ * @udata: udata pointer if this is not a kernel SRQ
1002
+ *
1003
+ * srq_attr->max_wr and srq_attr->max_sge are read the determine the
1004
+ * requested size of the SRQ, and set to the actual values allocated
1005
+ * on return. If ib_create_srq() succeeds, then max_wr and max_sge
1006
+ * will always be at least as large as the requested values.
1007
+ */
1008
+struct ib_srq *ib_create_srq_user(struct ib_pd *pd,
1009
+ struct ib_srq_init_attr *srq_init_attr,
1010
+ struct ib_usrq_object *uobject,
1011
+ struct ib_udata *udata)
9331012 {
9341013 struct ib_srq *srq;
1014
+ int ret;
9351015
936
- if (!pd->device->create_srq)
937
- return ERR_PTR(-EOPNOTSUPP);
1016
+ srq = rdma_zalloc_drv_obj(pd->device, ib_srq);
1017
+ if (!srq)
1018
+ return ERR_PTR(-ENOMEM);
9381019
939
- srq = pd->device->create_srq(pd, srq_init_attr, NULL);
1020
+ srq->device = pd->device;
1021
+ srq->pd = pd;
1022
+ srq->event_handler = srq_init_attr->event_handler;
1023
+ srq->srq_context = srq_init_attr->srq_context;
1024
+ srq->srq_type = srq_init_attr->srq_type;
1025
+ srq->uobject = uobject;
9401026
941
- if (!IS_ERR(srq)) {
942
- srq->device = pd->device;
943
- srq->pd = pd;
944
- srq->uobject = NULL;
945
- srq->event_handler = srq_init_attr->event_handler;
946
- srq->srq_context = srq_init_attr->srq_context;
947
- srq->srq_type = srq_init_attr->srq_type;
948
- if (ib_srq_has_cq(srq->srq_type)) {
949
- srq->ext.cq = srq_init_attr->ext.cq;
950
- atomic_inc(&srq->ext.cq->usecnt);
951
- }
952
- if (srq->srq_type == IB_SRQT_XRC) {
953
- srq->ext.xrc.xrcd = srq_init_attr->ext.xrc.xrcd;
954
- atomic_inc(&srq->ext.xrc.xrcd->usecnt);
955
- }
956
- atomic_inc(&pd->usecnt);
957
- atomic_set(&srq->usecnt, 0);
1027
+ if (ib_srq_has_cq(srq->srq_type)) {
1028
+ srq->ext.cq = srq_init_attr->ext.cq;
1029
+ atomic_inc(&srq->ext.cq->usecnt);
1030
+ }
1031
+ if (srq->srq_type == IB_SRQT_XRC) {
1032
+ srq->ext.xrc.xrcd = srq_init_attr->ext.xrc.xrcd;
1033
+ atomic_inc(&srq->ext.xrc.xrcd->usecnt);
1034
+ }
1035
+ atomic_inc(&pd->usecnt);
1036
+
1037
+ ret = pd->device->ops.create_srq(srq, srq_init_attr, udata);
1038
+ if (ret) {
1039
+ atomic_dec(&srq->pd->usecnt);
1040
+ if (srq->srq_type == IB_SRQT_XRC)
1041
+ atomic_dec(&srq->ext.xrc.xrcd->usecnt);
1042
+ if (ib_srq_has_cq(srq->srq_type))
1043
+ atomic_dec(&srq->ext.cq->usecnt);
1044
+ kfree(srq);
1045
+ return ERR_PTR(ret);
9581046 }
9591047
9601048 return srq;
9611049 }
962
-EXPORT_SYMBOL(ib_create_srq);
1050
+EXPORT_SYMBOL(ib_create_srq_user);
9631051
9641052 int ib_modify_srq(struct ib_srq *srq,
9651053 struct ib_srq_attr *srq_attr,
9661054 enum ib_srq_attr_mask srq_attr_mask)
9671055 {
968
- return srq->device->modify_srq ?
969
- srq->device->modify_srq(srq, srq_attr, srq_attr_mask, NULL) :
970
- -EOPNOTSUPP;
1056
+ return srq->device->ops.modify_srq ?
1057
+ srq->device->ops.modify_srq(srq, srq_attr, srq_attr_mask,
1058
+ NULL) : -EOPNOTSUPP;
9711059 }
9721060 EXPORT_SYMBOL(ib_modify_srq);
9731061
9741062 int ib_query_srq(struct ib_srq *srq,
9751063 struct ib_srq_attr *srq_attr)
9761064 {
977
- return srq->device->query_srq ?
978
- srq->device->query_srq(srq, srq_attr) : -EOPNOTSUPP;
1065
+ return srq->device->ops.query_srq ?
1066
+ srq->device->ops.query_srq(srq, srq_attr) : -EOPNOTSUPP;
9791067 }
9801068 EXPORT_SYMBOL(ib_query_srq);
9811069
982
-int ib_destroy_srq(struct ib_srq *srq)
1070
+int ib_destroy_srq_user(struct ib_srq *srq, struct ib_udata *udata)
9831071 {
984
- struct ib_pd *pd;
985
- enum ib_srq_type srq_type;
986
- struct ib_xrcd *uninitialized_var(xrcd);
987
- struct ib_cq *uninitialized_var(cq);
9881072 int ret;
9891073
9901074 if (atomic_read(&srq->usecnt))
9911075 return -EBUSY;
9921076
993
- pd = srq->pd;
994
- srq_type = srq->srq_type;
995
- if (ib_srq_has_cq(srq_type))
996
- cq = srq->ext.cq;
997
- if (srq_type == IB_SRQT_XRC)
998
- xrcd = srq->ext.xrc.xrcd;
1077
+ ret = srq->device->ops.destroy_srq(srq, udata);
1078
+ if (ret)
1079
+ return ret;
9991080
1000
- ret = srq->device->destroy_srq(srq);
1001
- if (!ret) {
1002
- atomic_dec(&pd->usecnt);
1003
- if (srq_type == IB_SRQT_XRC)
1004
- atomic_dec(&xrcd->usecnt);
1005
- if (ib_srq_has_cq(srq_type))
1006
- atomic_dec(&cq->usecnt);
1007
- }
1081
+ atomic_dec(&srq->pd->usecnt);
1082
+ if (srq->srq_type == IB_SRQT_XRC)
1083
+ atomic_dec(&srq->ext.xrc.xrcd->usecnt);
1084
+ if (ib_srq_has_cq(srq->srq_type))
1085
+ atomic_dec(&srq->ext.cq->usecnt);
1086
+ kfree(srq);
10081087
10091088 return ret;
10101089 }
1011
-EXPORT_SYMBOL(ib_destroy_srq);
1090
+EXPORT_SYMBOL(ib_destroy_srq_user);
10121091
10131092 /* Queue pairs */
10141093
....@@ -1017,18 +1096,11 @@
10171096 struct ib_qp *qp = context;
10181097 unsigned long flags;
10191098
1020
- spin_lock_irqsave(&qp->device->event_handler_lock, flags);
1099
+ spin_lock_irqsave(&qp->device->qp_open_list_lock, flags);
10211100 list_for_each_entry(event->element.qp, &qp->open_list, open_list)
10221101 if (event->element.qp->event_handler)
10231102 event->element.qp->event_handler(event, event->element.qp->qp_context);
1024
- spin_unlock_irqrestore(&qp->device->event_handler_lock, flags);
1025
-}
1026
-
1027
-static void __ib_insert_xrcd_qp(struct ib_xrcd *xrcd, struct ib_qp *qp)
1028
-{
1029
- mutex_lock(&xrcd->tgt_qp_mutex);
1030
- list_add(&qp->xrcd_list, &xrcd->tgt_qp_list);
1031
- mutex_unlock(&xrcd->tgt_qp_mutex);
1103
+ spin_unlock_irqrestore(&qp->device->qp_open_list_lock, flags);
10321104 }
10331105
10341106 static struct ib_qp *__ib_open_qp(struct ib_qp *real_qp,
....@@ -1058,9 +1130,9 @@
10581130 qp->qp_num = real_qp->qp_num;
10591131 qp->qp_type = real_qp->qp_type;
10601132
1061
- spin_lock_irqsave(&real_qp->device->event_handler_lock, flags);
1133
+ spin_lock_irqsave(&real_qp->device->qp_open_list_lock, flags);
10621134 list_add(&qp->open_list, &real_qp->open_list);
1063
- spin_unlock_irqrestore(&real_qp->device->event_handler_lock, flags);
1135
+ spin_unlock_irqrestore(&real_qp->device->qp_open_list_lock, flags);
10641136
10651137 return qp;
10661138 }
....@@ -1073,24 +1145,24 @@
10731145 if (qp_open_attr->qp_type != IB_QPT_XRC_TGT)
10741146 return ERR_PTR(-EINVAL);
10751147
1076
- qp = ERR_PTR(-EINVAL);
1077
- mutex_lock(&xrcd->tgt_qp_mutex);
1078
- list_for_each_entry(real_qp, &xrcd->tgt_qp_list, xrcd_list) {
1079
- if (real_qp->qp_num == qp_open_attr->qp_num) {
1080
- qp = __ib_open_qp(real_qp, qp_open_attr->event_handler,
1081
- qp_open_attr->qp_context);
1082
- break;
1083
- }
1148
+ down_read(&xrcd->tgt_qps_rwsem);
1149
+ real_qp = xa_load(&xrcd->tgt_qps, qp_open_attr->qp_num);
1150
+ if (!real_qp) {
1151
+ up_read(&xrcd->tgt_qps_rwsem);
1152
+ return ERR_PTR(-EINVAL);
10841153 }
1085
- mutex_unlock(&xrcd->tgt_qp_mutex);
1154
+ qp = __ib_open_qp(real_qp, qp_open_attr->event_handler,
1155
+ qp_open_attr->qp_context);
1156
+ up_read(&xrcd->tgt_qps_rwsem);
10861157 return qp;
10871158 }
10881159 EXPORT_SYMBOL(ib_open_qp);
10891160
1090
-static struct ib_qp *create_xrc_qp(struct ib_qp *qp,
1091
- struct ib_qp_init_attr *qp_init_attr)
1161
+static struct ib_qp *create_xrc_qp_user(struct ib_qp *qp,
1162
+ struct ib_qp_init_attr *qp_init_attr)
10921163 {
10931164 struct ib_qp *real_qp = qp;
1165
+ int err;
10941166
10951167 qp->event_handler = __ib_shared_qp_event_handler;
10961168 qp->qp_context = qp;
....@@ -1106,10 +1178,25 @@
11061178 if (IS_ERR(qp))
11071179 return qp;
11081180
1109
- __ib_insert_xrcd_qp(qp_init_attr->xrcd, real_qp);
1181
+ err = xa_err(xa_store(&qp_init_attr->xrcd->tgt_qps, real_qp->qp_num,
1182
+ real_qp, GFP_KERNEL));
1183
+ if (err) {
1184
+ ib_close_qp(qp);
1185
+ return ERR_PTR(err);
1186
+ }
11101187 return qp;
11111188 }
11121189
1190
+/**
1191
+ * ib_create_qp - Creates a kernel QP associated with the specified protection
1192
+ * domain.
1193
+ * @pd: The protection domain associated with the QP.
1194
+ * @qp_init_attr: A list of initial attributes required to create the
1195
+ * QP. If QP creation succeeds, then the attributes are updated to
1196
+ * the actual capabilities of the created QP.
1197
+ *
1198
+ * NOTE: for user qp use ib_create_qp_user with valid udata!
1199
+ */
11131200 struct ib_qp *ib_create_qp(struct ib_pd *pd,
11141201 struct ib_qp_init_attr *qp_init_attr)
11151202 {
....@@ -1121,6 +1208,10 @@
11211208 (qp_init_attr->recv_cq ||
11221209 qp_init_attr->srq || qp_init_attr->cap.max_recv_wr ||
11231210 qp_init_attr->cap.max_recv_sge))
1211
+ return ERR_PTR(-EINVAL);
1212
+
1213
+ if ((qp_init_attr->create_flags & IB_QP_CREATE_INTEGRITY_EN) &&
1214
+ !(device->attrs.device_cap_flags & IB_DEVICE_INTEGRITY_HANDOVER))
11241215 return ERR_PTR(-EINVAL);
11251216
11261217 /*
....@@ -1140,19 +1231,9 @@
11401231 if (ret)
11411232 goto err;
11421233
1143
- qp->real_qp = qp;
1144
- qp->qp_type = qp_init_attr->qp_type;
1145
- qp->rwq_ind_tbl = qp_init_attr->rwq_ind_tbl;
1146
-
1147
- atomic_set(&qp->usecnt, 0);
1148
- qp->mrs_used = 0;
1149
- spin_lock_init(&qp->mr_lock);
1150
- INIT_LIST_HEAD(&qp->rdma_mrs);
1151
- INIT_LIST_HEAD(&qp->sig_mrs);
1152
- qp->port = 0;
1153
-
11541234 if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) {
1155
- struct ib_qp *xrc_qp = create_xrc_qp(qp, qp_init_attr);
1235
+ struct ib_qp *xrc_qp =
1236
+ create_xrc_qp_user(qp, qp_init_attr);
11561237
11571238 if (IS_ERR(xrc_qp)) {
11581239 ret = PTR_ERR(xrc_qp);
....@@ -1198,6 +1279,8 @@
11981279 qp->max_write_sge = qp_init_attr->cap.max_send_sge;
11991280 qp->max_read_sge = min_t(u32, qp_init_attr->cap.max_send_sge,
12001281 device->attrs.max_sge_rd);
1282
+ if (qp_init_attr->create_flags & IB_QP_CREATE_INTEGRITY_EN)
1283
+ qp->integrity_en = true;
12011284
12021285 return qp;
12031286
....@@ -1516,8 +1599,7 @@
15161599 };
15171600
15181601 bool ib_modify_qp_is_ok(enum ib_qp_state cur_state, enum ib_qp_state next_state,
1519
- enum ib_qp_type type, enum ib_qp_attr_mask mask,
1520
- enum rdma_link_layer ll)
1602
+ enum ib_qp_type type, enum ib_qp_attr_mask mask)
15211603 {
15221604 enum ib_qp_attr_mask req_param, opt_param;
15231605
....@@ -1591,11 +1673,37 @@
15911673 const struct ib_gid_attr *old_sgid_attr_alt_av;
15921674 int ret;
15931675
1676
+ attr->xmit_slave = NULL;
15941677 if (attr_mask & IB_QP_AV) {
15951678 ret = rdma_fill_sgid_attr(qp->device, &attr->ah_attr,
15961679 &old_sgid_attr_av);
15971680 if (ret)
15981681 return ret;
1682
+
1683
+ if (attr->ah_attr.type == RDMA_AH_ATTR_TYPE_ROCE &&
1684
+ is_qp_type_connected(qp)) {
1685
+ struct net_device *slave;
1686
+
1687
+ /*
1688
+ * If the user provided the qp_attr then we have to
1689
+ * resolve it. Kerne users have to provide already
1690
+ * resolved rdma_ah_attr's.
1691
+ */
1692
+ if (udata) {
1693
+ ret = ib_resolve_eth_dmac(qp->device,
1694
+ &attr->ah_attr);
1695
+ if (ret)
1696
+ goto out_av;
1697
+ }
1698
+ slave = rdma_lag_get_ah_roce_slave(qp->device,
1699
+ &attr->ah_attr,
1700
+ GFP_KERNEL);
1701
+ if (IS_ERR(slave)) {
1702
+ ret = PTR_ERR(slave);
1703
+ goto out_av;
1704
+ }
1705
+ attr->xmit_slave = slave;
1706
+ }
15991707 }
16001708 if (attr_mask & IB_QP_ALT_PATH) {
16011709 /*
....@@ -1622,31 +1730,29 @@
16221730 }
16231731 }
16241732
1625
- /*
1626
- * If the user provided the qp_attr then we have to resolve it. Kernel
1627
- * users have to provide already resolved rdma_ah_attr's
1628
- */
1629
- if (udata && (attr_mask & IB_QP_AV) &&
1630
- attr->ah_attr.type == RDMA_AH_ATTR_TYPE_ROCE &&
1631
- is_qp_type_connected(qp)) {
1632
- ret = ib_resolve_eth_dmac(qp->device, &attr->ah_attr);
1633
- if (ret)
1634
- goto out;
1635
- }
1636
-
16371733 if (rdma_ib_or_roce(qp->device, port)) {
16381734 if (attr_mask & IB_QP_RQ_PSN && attr->rq_psn & ~0xffffff) {
1639
- pr_warn("%s: %s rq_psn overflow, masking to 24 bits\n",
1640
- __func__, qp->device->name);
1735
+ dev_warn(&qp->device->dev,
1736
+ "%s rq_psn overflow, masking to 24 bits\n",
1737
+ __func__);
16411738 attr->rq_psn &= 0xffffff;
16421739 }
16431740
16441741 if (attr_mask & IB_QP_SQ_PSN && attr->sq_psn & ~0xffffff) {
1645
- pr_warn("%s: %s sq_psn overflow, masking to 24 bits\n",
1646
- __func__, qp->device->name);
1742
+ dev_warn(&qp->device->dev,
1743
+ " %s sq_psn overflow, masking to 24 bits\n",
1744
+ __func__);
16471745 attr->sq_psn &= 0xffffff;
16481746 }
16491747 }
1748
+
1749
+ /*
1750
+ * Bind this qp to a counter automatically based on the rdma counter
1751
+ * rules. This only set in RST2INIT with port specified
1752
+ */
1753
+ if (!qp->counter && (attr_mask & IB_QP_PORT) &&
1754
+ ((attr_mask & IB_QP_STATE) && attr->qp_state == IB_QPS_INIT))
1755
+ rdma_counter_bind_qp_auto(qp, attr->port_num);
16501756
16511757 ret = ib_security_modify_qp(qp, attr, attr_mask, udata);
16521758 if (ret)
....@@ -1665,8 +1771,10 @@
16651771 if (attr_mask & IB_QP_ALT_PATH)
16661772 rdma_unfill_sgid_attr(&attr->alt_ah_attr, old_sgid_attr_alt_av);
16671773 out_av:
1668
- if (attr_mask & IB_QP_AV)
1774
+ if (attr_mask & IB_QP_AV) {
1775
+ rdma_lag_put_ah_roce_slave(attr->xmit_slave);
16691776 rdma_unfill_sgid_attr(&attr->ah_attr, old_sgid_attr_av);
1777
+ }
16701778 return ret;
16711779 }
16721780
....@@ -1688,7 +1796,7 @@
16881796 }
16891797 EXPORT_SYMBOL(ib_modify_qp_with_udata);
16901798
1691
-int ib_get_eth_speed(struct ib_device *dev, u8 port_num, u8 *speed, u8 *width)
1799
+int ib_get_eth_speed(struct ib_device *dev, u8 port_num, u16 *speed, u8 *width)
16921800 {
16931801 int rc;
16941802 u32 netdev_speed;
....@@ -1698,10 +1806,7 @@
16981806 if (rdma_port_get_link_layer(dev, port_num) != IB_LINK_LAYER_ETHERNET)
16991807 return -EINVAL;
17001808
1701
- if (!dev->get_netdev)
1702
- return -EOPNOTSUPP;
1703
-
1704
- netdev = dev->get_netdev(dev, port_num);
1809
+ netdev = ib_device_get_netdev(dev, port_num);
17051810 if (!netdev)
17061811 return -ENODEV;
17071812
....@@ -1759,9 +1864,9 @@
17591864 qp_attr->ah_attr.grh.sgid_attr = NULL;
17601865 qp_attr->alt_ah_attr.grh.sgid_attr = NULL;
17611866
1762
- return qp->device->query_qp ?
1763
- qp->device->query_qp(qp->real_qp, qp_attr, qp_attr_mask, qp_init_attr) :
1764
- -EOPNOTSUPP;
1867
+ return qp->device->ops.query_qp ?
1868
+ qp->device->ops.query_qp(qp->real_qp, qp_attr, qp_attr_mask,
1869
+ qp_init_attr) : -EOPNOTSUPP;
17651870 }
17661871 EXPORT_SYMBOL(ib_query_qp);
17671872
....@@ -1774,9 +1879,9 @@
17741879 if (real_qp == qp)
17751880 return -EINVAL;
17761881
1777
- spin_lock_irqsave(&real_qp->device->event_handler_lock, flags);
1882
+ spin_lock_irqsave(&real_qp->device->qp_open_list_lock, flags);
17781883 list_del(&qp->open_list);
1779
- spin_unlock_irqrestore(&real_qp->device->event_handler_lock, flags);
1884
+ spin_unlock_irqrestore(&real_qp->device->qp_open_list_lock, flags);
17801885
17811886 atomic_dec(&real_qp->usecnt);
17821887 if (qp->qp_sec)
....@@ -1795,27 +1900,24 @@
17951900
17961901 real_qp = qp->real_qp;
17971902 xrcd = real_qp->xrcd;
1798
-
1799
- mutex_lock(&xrcd->tgt_qp_mutex);
1903
+ down_write(&xrcd->tgt_qps_rwsem);
18001904 ib_close_qp(qp);
18011905 if (atomic_read(&real_qp->usecnt) == 0)
1802
- list_del(&real_qp->xrcd_list);
1906
+ xa_erase(&xrcd->tgt_qps, real_qp->qp_num);
18031907 else
18041908 real_qp = NULL;
1805
- mutex_unlock(&xrcd->tgt_qp_mutex);
1909
+ up_write(&xrcd->tgt_qps_rwsem);
18061910
18071911 if (real_qp) {
18081912 ret = ib_destroy_qp(real_qp);
18091913 if (!ret)
18101914 atomic_dec(&xrcd->usecnt);
1811
- else
1812
- __ib_insert_xrcd_qp(xrcd, real_qp);
18131915 }
18141916
18151917 return 0;
18161918 }
18171919
1818
-int ib_destroy_qp(struct ib_qp *qp)
1920
+int ib_destroy_qp_user(struct ib_qp *qp, struct ib_udata *udata)
18191921 {
18201922 const struct ib_gid_attr *alt_path_sgid_attr = qp->alt_path_sgid_attr;
18211923 const struct ib_gid_attr *av_sgid_attr = qp->av_sgid_attr;
....@@ -1846,8 +1948,9 @@
18461948 if (!qp->uobject)
18471949 rdma_rw_cleanup_mrs(qp);
18481950
1951
+ rdma_counter_unbind_qp(qp, true);
18491952 rdma_restrack_del(&qp->res);
1850
- ret = qp->device->destroy_qp(qp);
1953
+ ret = qp->device->ops.destroy_qp(qp, udata);
18511954 if (!ret) {
18521955 if (alt_path_sgid_attr)
18531956 rdma_put_gid_attr(alt_path_sgid_attr);
....@@ -1872,7 +1975,7 @@
18721975
18731976 return ret;
18741977 }
1875
-EXPORT_SYMBOL(ib_destroy_qp);
1978
+EXPORT_SYMBOL(ib_destroy_qp_user);
18761979
18771980 /* Completion queues */
18781981
....@@ -1884,68 +1987,146 @@
18841987 const char *caller)
18851988 {
18861989 struct ib_cq *cq;
1990
+ int ret;
18871991
1888
- cq = device->create_cq(device, cq_attr, NULL, NULL);
1992
+ cq = rdma_zalloc_drv_obj(device, ib_cq);
1993
+ if (!cq)
1994
+ return ERR_PTR(-ENOMEM);
18891995
1890
- if (!IS_ERR(cq)) {
1891
- cq->device = device;
1892
- cq->uobject = NULL;
1893
- cq->comp_handler = comp_handler;
1894
- cq->event_handler = event_handler;
1895
- cq->cq_context = cq_context;
1896
- atomic_set(&cq->usecnt, 0);
1897
- cq->res.type = RDMA_RESTRACK_CQ;
1898
- cq->res.kern_name = caller;
1899
- rdma_restrack_add(&cq->res);
1996
+ cq->device = device;
1997
+ cq->uobject = NULL;
1998
+ cq->comp_handler = comp_handler;
1999
+ cq->event_handler = event_handler;
2000
+ cq->cq_context = cq_context;
2001
+ atomic_set(&cq->usecnt, 0);
2002
+
2003
+ rdma_restrack_new(&cq->res, RDMA_RESTRACK_CQ);
2004
+ rdma_restrack_set_name(&cq->res, caller);
2005
+
2006
+ ret = device->ops.create_cq(cq, cq_attr, NULL);
2007
+ if (ret) {
2008
+ rdma_restrack_put(&cq->res);
2009
+ kfree(cq);
2010
+ return ERR_PTR(ret);
19002011 }
19012012
2013
+ rdma_restrack_add(&cq->res);
19022014 return cq;
19032015 }
19042016 EXPORT_SYMBOL(__ib_create_cq);
19052017
19062018 int rdma_set_cq_moderation(struct ib_cq *cq, u16 cq_count, u16 cq_period)
19072019 {
1908
- return cq->device->modify_cq ?
1909
- cq->device->modify_cq(cq, cq_count, cq_period) : -EOPNOTSUPP;
2020
+ if (cq->shared)
2021
+ return -EOPNOTSUPP;
2022
+
2023
+ return cq->device->ops.modify_cq ?
2024
+ cq->device->ops.modify_cq(cq, cq_count,
2025
+ cq_period) : -EOPNOTSUPP;
19102026 }
19112027 EXPORT_SYMBOL(rdma_set_cq_moderation);
19122028
1913
-int ib_destroy_cq(struct ib_cq *cq)
2029
+int ib_destroy_cq_user(struct ib_cq *cq, struct ib_udata *udata)
19142030 {
2031
+ int ret;
2032
+
2033
+ if (WARN_ON_ONCE(cq->shared))
2034
+ return -EOPNOTSUPP;
2035
+
19152036 if (atomic_read(&cq->usecnt))
19162037 return -EBUSY;
19172038
2039
+ ret = cq->device->ops.destroy_cq(cq, udata);
2040
+ if (ret)
2041
+ return ret;
2042
+
19182043 rdma_restrack_del(&cq->res);
1919
- return cq->device->destroy_cq(cq);
2044
+ kfree(cq);
2045
+ return ret;
19202046 }
1921
-EXPORT_SYMBOL(ib_destroy_cq);
2047
+EXPORT_SYMBOL(ib_destroy_cq_user);
19222048
19232049 int ib_resize_cq(struct ib_cq *cq, int cqe)
19242050 {
1925
- return cq->device->resize_cq ?
1926
- cq->device->resize_cq(cq, cqe, NULL) : -EOPNOTSUPP;
2051
+ if (cq->shared)
2052
+ return -EOPNOTSUPP;
2053
+
2054
+ return cq->device->ops.resize_cq ?
2055
+ cq->device->ops.resize_cq(cq, cqe, NULL) : -EOPNOTSUPP;
19272056 }
19282057 EXPORT_SYMBOL(ib_resize_cq);
19292058
19302059 /* Memory regions */
19312060
1932
-int ib_dereg_mr(struct ib_mr *mr)
2061
+struct ib_mr *ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
2062
+ u64 virt_addr, int access_flags)
2063
+{
2064
+ struct ib_mr *mr;
2065
+
2066
+ if (access_flags & IB_ACCESS_ON_DEMAND) {
2067
+ if (!(pd->device->attrs.device_cap_flags &
2068
+ IB_DEVICE_ON_DEMAND_PAGING)) {
2069
+ pr_debug("ODP support not available\n");
2070
+ return ERR_PTR(-EINVAL);
2071
+ }
2072
+ }
2073
+
2074
+ mr = pd->device->ops.reg_user_mr(pd, start, length, virt_addr,
2075
+ access_flags, NULL);
2076
+
2077
+ if (IS_ERR(mr))
2078
+ return mr;
2079
+
2080
+ mr->device = pd->device;
2081
+ mr->type = IB_MR_TYPE_USER;
2082
+ mr->pd = pd;
2083
+ mr->dm = NULL;
2084
+ atomic_inc(&pd->usecnt);
2085
+ mr->iova = virt_addr;
2086
+ mr->length = length;
2087
+
2088
+ rdma_restrack_new(&mr->res, RDMA_RESTRACK_MR);
2089
+ rdma_restrack_parent_name(&mr->res, &pd->res);
2090
+ rdma_restrack_add(&mr->res);
2091
+
2092
+ return mr;
2093
+}
2094
+EXPORT_SYMBOL(ib_reg_user_mr);
2095
+
2096
+int ib_advise_mr(struct ib_pd *pd, enum ib_uverbs_advise_mr_advice advice,
2097
+ u32 flags, struct ib_sge *sg_list, u32 num_sge)
2098
+{
2099
+ if (!pd->device->ops.advise_mr)
2100
+ return -EOPNOTSUPP;
2101
+
2102
+ if (!num_sge)
2103
+ return 0;
2104
+
2105
+ return pd->device->ops.advise_mr(pd, advice, flags, sg_list, num_sge,
2106
+ NULL);
2107
+}
2108
+EXPORT_SYMBOL(ib_advise_mr);
2109
+
2110
+int ib_dereg_mr_user(struct ib_mr *mr, struct ib_udata *udata)
19332111 {
19342112 struct ib_pd *pd = mr->pd;
19352113 struct ib_dm *dm = mr->dm;
2114
+ struct ib_sig_attrs *sig_attrs = mr->sig_attrs;
19362115 int ret;
19372116
2117
+ trace_mr_dereg(mr);
19382118 rdma_restrack_del(&mr->res);
1939
- ret = mr->device->dereg_mr(mr);
2119
+ ret = mr->device->ops.dereg_mr(mr, udata);
19402120 if (!ret) {
19412121 atomic_dec(&pd->usecnt);
19422122 if (dm)
19432123 atomic_dec(&dm->usecnt);
2124
+ kfree(sig_attrs);
19442125 }
19452126
19462127 return ret;
19472128 }
1948
-EXPORT_SYMBOL(ib_dereg_mr);
2129
+EXPORT_SYMBOL(ib_dereg_mr_user);
19492130
19502131 /**
19512132 * ib_alloc_mr() - Allocates a memory region
....@@ -1959,78 +2140,104 @@
19592140 * max_num_sg * used_page_size.
19602141 *
19612142 */
1962
-struct ib_mr *ib_alloc_mr(struct ib_pd *pd,
1963
- enum ib_mr_type mr_type,
2143
+struct ib_mr *ib_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type,
19642144 u32 max_num_sg)
19652145 {
19662146 struct ib_mr *mr;
19672147
1968
- if (!pd->device->alloc_mr)
1969
- return ERR_PTR(-EOPNOTSUPP);
1970
-
1971
- mr = pd->device->alloc_mr(pd, mr_type, max_num_sg);
1972
- if (!IS_ERR(mr)) {
1973
- mr->device = pd->device;
1974
- mr->pd = pd;
1975
- mr->dm = NULL;
1976
- mr->uobject = NULL;
1977
- atomic_inc(&pd->usecnt);
1978
- mr->need_inval = false;
1979
- mr->res.type = RDMA_RESTRACK_MR;
1980
- rdma_restrack_add(&mr->res);
2148
+ if (!pd->device->ops.alloc_mr) {
2149
+ mr = ERR_PTR(-EOPNOTSUPP);
2150
+ goto out;
19812151 }
19822152
2153
+ if (mr_type == IB_MR_TYPE_INTEGRITY) {
2154
+ WARN_ON_ONCE(1);
2155
+ mr = ERR_PTR(-EINVAL);
2156
+ goto out;
2157
+ }
2158
+
2159
+ mr = pd->device->ops.alloc_mr(pd, mr_type, max_num_sg);
2160
+ if (IS_ERR(mr))
2161
+ goto out;
2162
+
2163
+ mr->device = pd->device;
2164
+ mr->pd = pd;
2165
+ mr->dm = NULL;
2166
+ mr->uobject = NULL;
2167
+ atomic_inc(&pd->usecnt);
2168
+ mr->need_inval = false;
2169
+ mr->type = mr_type;
2170
+ mr->sig_attrs = NULL;
2171
+
2172
+ rdma_restrack_new(&mr->res, RDMA_RESTRACK_MR);
2173
+ rdma_restrack_parent_name(&mr->res, &pd->res);
2174
+ rdma_restrack_add(&mr->res);
2175
+out:
2176
+ trace_mr_alloc(pd, mr_type, max_num_sg, mr);
19832177 return mr;
19842178 }
19852179 EXPORT_SYMBOL(ib_alloc_mr);
19862180
1987
-/* "Fast" memory regions */
1988
-
1989
-struct ib_fmr *ib_alloc_fmr(struct ib_pd *pd,
1990
- int mr_access_flags,
1991
- struct ib_fmr_attr *fmr_attr)
2181
+/**
2182
+ * ib_alloc_mr_integrity() - Allocates an integrity memory region
2183
+ * @pd: protection domain associated with the region
2184
+ * @max_num_data_sg: maximum data sg entries available for registration
2185
+ * @max_num_meta_sg: maximum metadata sg entries available for
2186
+ * registration
2187
+ *
2188
+ * Notes:
2189
+ * Memory registration page/sg lists must not exceed max_num_sg,
2190
+ * also the integrity page/sg lists must not exceed max_num_meta_sg.
2191
+ *
2192
+ */
2193
+struct ib_mr *ib_alloc_mr_integrity(struct ib_pd *pd,
2194
+ u32 max_num_data_sg,
2195
+ u32 max_num_meta_sg)
19922196 {
1993
- struct ib_fmr *fmr;
2197
+ struct ib_mr *mr;
2198
+ struct ib_sig_attrs *sig_attrs;
19942199
1995
- if (!pd->device->alloc_fmr)
1996
- return ERR_PTR(-EOPNOTSUPP);
1997
-
1998
- fmr = pd->device->alloc_fmr(pd, mr_access_flags, fmr_attr);
1999
- if (!IS_ERR(fmr)) {
2000
- fmr->device = pd->device;
2001
- fmr->pd = pd;
2002
- atomic_inc(&pd->usecnt);
2200
+ if (!pd->device->ops.alloc_mr_integrity ||
2201
+ !pd->device->ops.map_mr_sg_pi) {
2202
+ mr = ERR_PTR(-EOPNOTSUPP);
2203
+ goto out;
20032204 }
20042205
2005
- return fmr;
2206
+ if (!max_num_meta_sg) {
2207
+ mr = ERR_PTR(-EINVAL);
2208
+ goto out;
2209
+ }
2210
+
2211
+ sig_attrs = kzalloc(sizeof(struct ib_sig_attrs), GFP_KERNEL);
2212
+ if (!sig_attrs) {
2213
+ mr = ERR_PTR(-ENOMEM);
2214
+ goto out;
2215
+ }
2216
+
2217
+ mr = pd->device->ops.alloc_mr_integrity(pd, max_num_data_sg,
2218
+ max_num_meta_sg);
2219
+ if (IS_ERR(mr)) {
2220
+ kfree(sig_attrs);
2221
+ goto out;
2222
+ }
2223
+
2224
+ mr->device = pd->device;
2225
+ mr->pd = pd;
2226
+ mr->dm = NULL;
2227
+ mr->uobject = NULL;
2228
+ atomic_inc(&pd->usecnt);
2229
+ mr->need_inval = false;
2230
+ mr->type = IB_MR_TYPE_INTEGRITY;
2231
+ mr->sig_attrs = sig_attrs;
2232
+
2233
+ rdma_restrack_new(&mr->res, RDMA_RESTRACK_MR);
2234
+ rdma_restrack_parent_name(&mr->res, &pd->res);
2235
+ rdma_restrack_add(&mr->res);
2236
+out:
2237
+ trace_mr_integ_alloc(pd, max_num_data_sg, max_num_meta_sg, mr);
2238
+ return mr;
20062239 }
2007
-EXPORT_SYMBOL(ib_alloc_fmr);
2008
-
2009
-int ib_unmap_fmr(struct list_head *fmr_list)
2010
-{
2011
- struct ib_fmr *fmr;
2012
-
2013
- if (list_empty(fmr_list))
2014
- return 0;
2015
-
2016
- fmr = list_entry(fmr_list->next, struct ib_fmr, list);
2017
- return fmr->device->unmap_fmr(fmr_list);
2018
-}
2019
-EXPORT_SYMBOL(ib_unmap_fmr);
2020
-
2021
-int ib_dealloc_fmr(struct ib_fmr *fmr)
2022
-{
2023
- struct ib_pd *pd;
2024
- int ret;
2025
-
2026
- pd = fmr->pd;
2027
- ret = fmr->device->dealloc_fmr(fmr);
2028
- if (!ret)
2029
- atomic_dec(&pd->usecnt);
2030
-
2031
- return ret;
2032
-}
2033
-EXPORT_SYMBOL(ib_dealloc_fmr);
2240
+EXPORT_SYMBOL(ib_alloc_mr_integrity);
20342241
20352242 /* Multicast groups */
20362243
....@@ -2076,14 +2283,14 @@
20762283 {
20772284 int ret;
20782285
2079
- if (!qp->device->attach_mcast)
2286
+ if (!qp->device->ops.attach_mcast)
20802287 return -EOPNOTSUPP;
20812288
20822289 if (!rdma_is_multicast_addr((struct in6_addr *)gid->raw) ||
20832290 qp->qp_type != IB_QPT_UD || !is_valid_mcast_lid(qp, lid))
20842291 return -EINVAL;
20852292
2086
- ret = qp->device->attach_mcast(qp, gid, lid);
2293
+ ret = qp->device->ops.attach_mcast(qp, gid, lid);
20872294 if (!ret)
20882295 atomic_inc(&qp->usecnt);
20892296 return ret;
....@@ -2094,58 +2301,75 @@
20942301 {
20952302 int ret;
20962303
2097
- if (!qp->device->detach_mcast)
2304
+ if (!qp->device->ops.detach_mcast)
20982305 return -EOPNOTSUPP;
20992306
21002307 if (!rdma_is_multicast_addr((struct in6_addr *)gid->raw) ||
21012308 qp->qp_type != IB_QPT_UD || !is_valid_mcast_lid(qp, lid))
21022309 return -EINVAL;
21032310
2104
- ret = qp->device->detach_mcast(qp, gid, lid);
2311
+ ret = qp->device->ops.detach_mcast(qp, gid, lid);
21052312 if (!ret)
21062313 atomic_dec(&qp->usecnt);
21072314 return ret;
21082315 }
21092316 EXPORT_SYMBOL(ib_detach_mcast);
21102317
2111
-struct ib_xrcd *__ib_alloc_xrcd(struct ib_device *device, const char *caller)
2318
+/**
2319
+ * ib_alloc_xrcd_user - Allocates an XRC domain.
2320
+ * @device: The device on which to allocate the XRC domain.
2321
+ * @inode: inode to connect XRCD
2322
+ * @udata: Valid user data or NULL for kernel object
2323
+ */
2324
+struct ib_xrcd *ib_alloc_xrcd_user(struct ib_device *device,
2325
+ struct inode *inode, struct ib_udata *udata)
21122326 {
21132327 struct ib_xrcd *xrcd;
2328
+ int ret;
21142329
2115
- if (!device->alloc_xrcd)
2330
+ if (!device->ops.alloc_xrcd)
21162331 return ERR_PTR(-EOPNOTSUPP);
21172332
2118
- xrcd = device->alloc_xrcd(device, NULL, NULL);
2119
- if (!IS_ERR(xrcd)) {
2120
- xrcd->device = device;
2121
- xrcd->inode = NULL;
2122
- atomic_set(&xrcd->usecnt, 0);
2123
- mutex_init(&xrcd->tgt_qp_mutex);
2124
- INIT_LIST_HEAD(&xrcd->tgt_qp_list);
2125
- }
2333
+ xrcd = rdma_zalloc_drv_obj(device, ib_xrcd);
2334
+ if (!xrcd)
2335
+ return ERR_PTR(-ENOMEM);
21262336
2337
+ xrcd->device = device;
2338
+ xrcd->inode = inode;
2339
+ atomic_set(&xrcd->usecnt, 0);
2340
+ init_rwsem(&xrcd->tgt_qps_rwsem);
2341
+ xa_init(&xrcd->tgt_qps);
2342
+
2343
+ ret = device->ops.alloc_xrcd(xrcd, udata);
2344
+ if (ret)
2345
+ goto err;
21272346 return xrcd;
2347
+err:
2348
+ kfree(xrcd);
2349
+ return ERR_PTR(ret);
21282350 }
2129
-EXPORT_SYMBOL(__ib_alloc_xrcd);
2351
+EXPORT_SYMBOL(ib_alloc_xrcd_user);
21302352
2131
-int ib_dealloc_xrcd(struct ib_xrcd *xrcd)
2353
+/**
2354
+ * ib_dealloc_xrcd_user - Deallocates an XRC domain.
2355
+ * @xrcd: The XRC domain to deallocate.
2356
+ * @udata: Valid user data or NULL for kernel object
2357
+ */
2358
+int ib_dealloc_xrcd_user(struct ib_xrcd *xrcd, struct ib_udata *udata)
21322359 {
2133
- struct ib_qp *qp;
21342360 int ret;
21352361
21362362 if (atomic_read(&xrcd->usecnt))
21372363 return -EBUSY;
21382364
2139
- while (!list_empty(&xrcd->tgt_qp_list)) {
2140
- qp = list_entry(xrcd->tgt_qp_list.next, struct ib_qp, xrcd_list);
2141
- ret = ib_destroy_qp(qp);
2142
- if (ret)
2143
- return ret;
2144
- }
2145
-
2146
- return xrcd->device->dealloc_xrcd(xrcd);
2365
+ WARN_ON(!xa_empty(&xrcd->tgt_qps));
2366
+ ret = xrcd->device->ops.dealloc_xrcd(xrcd, udata);
2367
+ if (ret)
2368
+ return ret;
2369
+ kfree(xrcd);
2370
+ return ret;
21472371 }
2148
-EXPORT_SYMBOL(ib_dealloc_xrcd);
2372
+EXPORT_SYMBOL(ib_dealloc_xrcd_user);
21492373
21502374 /**
21512375 * ib_create_wq - Creates a WQ associated with the specified protection
....@@ -2166,10 +2390,10 @@
21662390 {
21672391 struct ib_wq *wq;
21682392
2169
- if (!pd->device->create_wq)
2393
+ if (!pd->device->ops.create_wq)
21702394 return ERR_PTR(-EOPNOTSUPP);
21712395
2172
- wq = pd->device->create_wq(pd, wq_attr, NULL);
2396
+ wq = pd->device->ops.create_wq(pd, wq_attr, NULL);
21732397 if (!IS_ERR(wq)) {
21742398 wq->event_handler = wq_attr->event_handler;
21752399 wq->wq_context = wq_attr->wq_context;
....@@ -2187,26 +2411,28 @@
21872411 EXPORT_SYMBOL(ib_create_wq);
21882412
21892413 /**
2190
- * ib_destroy_wq - Destroys the specified WQ.
2414
+ * ib_destroy_wq_user - Destroys the specified user WQ.
21912415 * @wq: The WQ to destroy.
2416
+ * @udata: Valid user data
21922417 */
2193
-int ib_destroy_wq(struct ib_wq *wq)
2418
+int ib_destroy_wq_user(struct ib_wq *wq, struct ib_udata *udata)
21942419 {
2195
- int err;
21962420 struct ib_cq *cq = wq->cq;
21972421 struct ib_pd *pd = wq->pd;
2422
+ int ret;
21982423
21992424 if (atomic_read(&wq->usecnt))
22002425 return -EBUSY;
22012426
2202
- err = wq->device->destroy_wq(wq);
2203
- if (!err) {
2204
- atomic_dec(&pd->usecnt);
2205
- atomic_dec(&cq->usecnt);
2206
- }
2207
- return err;
2427
+ ret = wq->device->ops.destroy_wq(wq, udata);
2428
+ if (ret)
2429
+ return ret;
2430
+
2431
+ atomic_dec(&pd->usecnt);
2432
+ atomic_dec(&cq->usecnt);
2433
+ return ret;
22082434 }
2209
-EXPORT_SYMBOL(ib_destroy_wq);
2435
+EXPORT_SYMBOL(ib_destroy_wq_user);
22102436
22112437 /**
22122438 * ib_modify_wq - Modifies the specified WQ.
....@@ -2221,123 +2447,110 @@
22212447 {
22222448 int err;
22232449
2224
- if (!wq->device->modify_wq)
2450
+ if (!wq->device->ops.modify_wq)
22252451 return -EOPNOTSUPP;
22262452
2227
- err = wq->device->modify_wq(wq, wq_attr, wq_attr_mask, NULL);
2453
+ err = wq->device->ops.modify_wq(wq, wq_attr, wq_attr_mask, NULL);
22282454 return err;
22292455 }
22302456 EXPORT_SYMBOL(ib_modify_wq);
22312457
2232
-/*
2233
- * ib_create_rwq_ind_table - Creates a RQ Indirection Table.
2234
- * @device: The device on which to create the rwq indirection table.
2235
- * @ib_rwq_ind_table_init_attr: A list of initial attributes required to
2236
- * create the Indirection Table.
2237
- *
2238
- * Note: The life time of ib_rwq_ind_table_init_attr->ind_tbl is not less
2239
- * than the created ib_rwq_ind_table object and the caller is responsible
2240
- * for its memory allocation/free.
2241
- */
2242
-struct ib_rwq_ind_table *ib_create_rwq_ind_table(struct ib_device *device,
2243
- struct ib_rwq_ind_table_init_attr *init_attr)
2244
-{
2245
- struct ib_rwq_ind_table *rwq_ind_table;
2246
- int i;
2247
- u32 table_size;
2248
-
2249
- if (!device->create_rwq_ind_table)
2250
- return ERR_PTR(-EOPNOTSUPP);
2251
-
2252
- table_size = (1 << init_attr->log_ind_tbl_size);
2253
- rwq_ind_table = device->create_rwq_ind_table(device,
2254
- init_attr, NULL);
2255
- if (IS_ERR(rwq_ind_table))
2256
- return rwq_ind_table;
2257
-
2258
- rwq_ind_table->ind_tbl = init_attr->ind_tbl;
2259
- rwq_ind_table->log_ind_tbl_size = init_attr->log_ind_tbl_size;
2260
- rwq_ind_table->device = device;
2261
- rwq_ind_table->uobject = NULL;
2262
- atomic_set(&rwq_ind_table->usecnt, 0);
2263
-
2264
- for (i = 0; i < table_size; i++)
2265
- atomic_inc(&rwq_ind_table->ind_tbl[i]->usecnt);
2266
-
2267
- return rwq_ind_table;
2268
-}
2269
-EXPORT_SYMBOL(ib_create_rwq_ind_table);
2270
-
2271
-/*
2272
- * ib_destroy_rwq_ind_table - Destroys the specified Indirection Table.
2273
- * @wq_ind_table: The Indirection Table to destroy.
2274
-*/
2275
-int ib_destroy_rwq_ind_table(struct ib_rwq_ind_table *rwq_ind_table)
2276
-{
2277
- int err, i;
2278
- u32 table_size = (1 << rwq_ind_table->log_ind_tbl_size);
2279
- struct ib_wq **ind_tbl = rwq_ind_table->ind_tbl;
2280
-
2281
- if (atomic_read(&rwq_ind_table->usecnt))
2282
- return -EBUSY;
2283
-
2284
- err = rwq_ind_table->device->destroy_rwq_ind_table(rwq_ind_table);
2285
- if (!err) {
2286
- for (i = 0; i < table_size; i++)
2287
- atomic_dec(&ind_tbl[i]->usecnt);
2288
- }
2289
-
2290
- return err;
2291
-}
2292
-EXPORT_SYMBOL(ib_destroy_rwq_ind_table);
2293
-
22942458 int ib_check_mr_status(struct ib_mr *mr, u32 check_mask,
22952459 struct ib_mr_status *mr_status)
22962460 {
2297
- return mr->device->check_mr_status ?
2298
- mr->device->check_mr_status(mr, check_mask, mr_status) : -EOPNOTSUPP;
2461
+ if (!mr->device->ops.check_mr_status)
2462
+ return -EOPNOTSUPP;
2463
+
2464
+ return mr->device->ops.check_mr_status(mr, check_mask, mr_status);
22992465 }
23002466 EXPORT_SYMBOL(ib_check_mr_status);
23012467
23022468 int ib_set_vf_link_state(struct ib_device *device, int vf, u8 port,
23032469 int state)
23042470 {
2305
- if (!device->set_vf_link_state)
2471
+ if (!device->ops.set_vf_link_state)
23062472 return -EOPNOTSUPP;
23072473
2308
- return device->set_vf_link_state(device, vf, port, state);
2474
+ return device->ops.set_vf_link_state(device, vf, port, state);
23092475 }
23102476 EXPORT_SYMBOL(ib_set_vf_link_state);
23112477
23122478 int ib_get_vf_config(struct ib_device *device, int vf, u8 port,
23132479 struct ifla_vf_info *info)
23142480 {
2315
- if (!device->get_vf_config)
2481
+ if (!device->ops.get_vf_config)
23162482 return -EOPNOTSUPP;
23172483
2318
- return device->get_vf_config(device, vf, port, info);
2484
+ return device->ops.get_vf_config(device, vf, port, info);
23192485 }
23202486 EXPORT_SYMBOL(ib_get_vf_config);
23212487
23222488 int ib_get_vf_stats(struct ib_device *device, int vf, u8 port,
23232489 struct ifla_vf_stats *stats)
23242490 {
2325
- if (!device->get_vf_stats)
2491
+ if (!device->ops.get_vf_stats)
23262492 return -EOPNOTSUPP;
23272493
2328
- return device->get_vf_stats(device, vf, port, stats);
2494
+ return device->ops.get_vf_stats(device, vf, port, stats);
23292495 }
23302496 EXPORT_SYMBOL(ib_get_vf_stats);
23312497
23322498 int ib_set_vf_guid(struct ib_device *device, int vf, u8 port, u64 guid,
23332499 int type)
23342500 {
2335
- if (!device->set_vf_guid)
2501
+ if (!device->ops.set_vf_guid)
23362502 return -EOPNOTSUPP;
23372503
2338
- return device->set_vf_guid(device, vf, port, guid, type);
2504
+ return device->ops.set_vf_guid(device, vf, port, guid, type);
23392505 }
23402506 EXPORT_SYMBOL(ib_set_vf_guid);
2507
+
2508
+int ib_get_vf_guid(struct ib_device *device, int vf, u8 port,
2509
+ struct ifla_vf_guid *node_guid,
2510
+ struct ifla_vf_guid *port_guid)
2511
+{
2512
+ if (!device->ops.get_vf_guid)
2513
+ return -EOPNOTSUPP;
2514
+
2515
+ return device->ops.get_vf_guid(device, vf, port, node_guid, port_guid);
2516
+}
2517
+EXPORT_SYMBOL(ib_get_vf_guid);
2518
+/**
2519
+ * ib_map_mr_sg_pi() - Map the dma mapped SG lists for PI (protection
2520
+ * information) and set an appropriate memory region for registration.
2521
+ * @mr: memory region
2522
+ * @data_sg: dma mapped scatterlist for data
2523
+ * @data_sg_nents: number of entries in data_sg
2524
+ * @data_sg_offset: offset in bytes into data_sg
2525
+ * @meta_sg: dma mapped scatterlist for metadata
2526
+ * @meta_sg_nents: number of entries in meta_sg
2527
+ * @meta_sg_offset: offset in bytes into meta_sg
2528
+ * @page_size: page vector desired page size
2529
+ *
2530
+ * Constraints:
2531
+ * - The MR must be allocated with type IB_MR_TYPE_INTEGRITY.
2532
+ *
2533
+ * Return: 0 on success.
2534
+ *
2535
+ * After this completes successfully, the memory region
2536
+ * is ready for registration.
2537
+ */
2538
+int ib_map_mr_sg_pi(struct ib_mr *mr, struct scatterlist *data_sg,
2539
+ int data_sg_nents, unsigned int *data_sg_offset,
2540
+ struct scatterlist *meta_sg, int meta_sg_nents,
2541
+ unsigned int *meta_sg_offset, unsigned int page_size)
2542
+{
2543
+ if (unlikely(!mr->device->ops.map_mr_sg_pi ||
2544
+ WARN_ON_ONCE(mr->type != IB_MR_TYPE_INTEGRITY)))
2545
+ return -EOPNOTSUPP;
2546
+
2547
+ mr->page_size = page_size;
2548
+
2549
+ return mr->device->ops.map_mr_sg_pi(mr, data_sg, data_sg_nents,
2550
+ data_sg_offset, meta_sg,
2551
+ meta_sg_nents, meta_sg_offset);
2552
+}
2553
+EXPORT_SYMBOL(ib_map_mr_sg_pi);
23412554
23422555 /**
23432556 * ib_map_mr_sg() - Map the largest prefix of a dma mapped SG list
....@@ -2349,6 +2562,7 @@
23492562 * @page_size: page vector desired page size
23502563 *
23512564 * Constraints:
2565
+ *
23522566 * - The first sg element is allowed to have an offset.
23532567 * - Each sg element must either be aligned to page_size or virtually
23542568 * contiguous to the previous element. In case an sg element has a
....@@ -2367,12 +2581,12 @@
23672581 int ib_map_mr_sg(struct ib_mr *mr, struct scatterlist *sg, int sg_nents,
23682582 unsigned int *sg_offset, unsigned int page_size)
23692583 {
2370
- if (unlikely(!mr->device->map_mr_sg))
2584
+ if (unlikely(!mr->device->ops.map_mr_sg))
23712585 return -EOPNOTSUPP;
23722586
23732587 mr->page_size = page_size;
23742588
2375
- return mr->device->map_mr_sg(mr, sg, sg_nents, sg_offset);
2589
+ return mr->device->ops.map_mr_sg(mr, sg, sg_nents, sg_offset);
23762590 }
23772591 EXPORT_SYMBOL(ib_map_mr_sg);
23782592
....@@ -2382,10 +2596,12 @@
23822596 * @mr: memory region
23832597 * @sgl: dma mapped scatterlist
23842598 * @sg_nents: number of entries in sg
2385
- * @sg_offset_p: IN: start offset in bytes into sg
2386
- * OUT: offset in bytes for element n of the sg of the first
2599
+ * @sg_offset_p: ==== =======================================================
2600
+ * IN start offset in bytes into sg
2601
+ * OUT offset in bytes for element n of the sg of the first
23872602 * byte that has not been processed where n is the return
23882603 * value of this function.
2604
+ * ==== =======================================================
23892605 * @set_page: driver page assignment function pointer
23902606 *
23912607 * Core service helper for drivers to convert the largest
....@@ -2571,10 +2787,11 @@
25712787 */
25722788 void ib_drain_sq(struct ib_qp *qp)
25732789 {
2574
- if (qp->device->drain_sq)
2575
- qp->device->drain_sq(qp);
2790
+ if (qp->device->ops.drain_sq)
2791
+ qp->device->ops.drain_sq(qp);
25762792 else
25772793 __ib_drain_sq(qp);
2794
+ trace_cq_drain_complete(qp->send_cq);
25782795 }
25792796 EXPORT_SYMBOL(ib_drain_sq);
25802797
....@@ -2599,10 +2816,11 @@
25992816 */
26002817 void ib_drain_rq(struct ib_qp *qp)
26012818 {
2602
- if (qp->device->drain_rq)
2603
- qp->device->drain_rq(qp);
2819
+ if (qp->device->ops.drain_rq)
2820
+ qp->device->ops.drain_rq(qp);
26042821 else
26052822 __ib_drain_rq(qp);
2823
+ trace_cq_drain_complete(qp->recv_cq);
26062824 }
26072825 EXPORT_SYMBOL(ib_drain_rq);
26082826
....@@ -2628,3 +2846,85 @@
26282846 ib_drain_rq(qp);
26292847 }
26302848 EXPORT_SYMBOL(ib_drain_qp);
2849
+
2850
+struct net_device *rdma_alloc_netdev(struct ib_device *device, u8 port_num,
2851
+ enum rdma_netdev_t type, const char *name,
2852
+ unsigned char name_assign_type,
2853
+ void (*setup)(struct net_device *))
2854
+{
2855
+ struct rdma_netdev_alloc_params params;
2856
+ struct net_device *netdev;
2857
+ int rc;
2858
+
2859
+ if (!device->ops.rdma_netdev_get_params)
2860
+ return ERR_PTR(-EOPNOTSUPP);
2861
+
2862
+ rc = device->ops.rdma_netdev_get_params(device, port_num, type,
2863
+ &params);
2864
+ if (rc)
2865
+ return ERR_PTR(rc);
2866
+
2867
+ netdev = alloc_netdev_mqs(params.sizeof_priv, name, name_assign_type,
2868
+ setup, params.txqs, params.rxqs);
2869
+ if (!netdev)
2870
+ return ERR_PTR(-ENOMEM);
2871
+
2872
+ return netdev;
2873
+}
2874
+EXPORT_SYMBOL(rdma_alloc_netdev);
2875
+
2876
+int rdma_init_netdev(struct ib_device *device, u8 port_num,
2877
+ enum rdma_netdev_t type, const char *name,
2878
+ unsigned char name_assign_type,
2879
+ void (*setup)(struct net_device *),
2880
+ struct net_device *netdev)
2881
+{
2882
+ struct rdma_netdev_alloc_params params;
2883
+ int rc;
2884
+
2885
+ if (!device->ops.rdma_netdev_get_params)
2886
+ return -EOPNOTSUPP;
2887
+
2888
+ rc = device->ops.rdma_netdev_get_params(device, port_num, type,
2889
+ &params);
2890
+ if (rc)
2891
+ return rc;
2892
+
2893
+ return params.initialize_rdma_netdev(device, port_num,
2894
+ netdev, params.param);
2895
+}
2896
+EXPORT_SYMBOL(rdma_init_netdev);
2897
+
2898
+void __rdma_block_iter_start(struct ib_block_iter *biter,
2899
+ struct scatterlist *sglist, unsigned int nents,
2900
+ unsigned long pgsz)
2901
+{
2902
+ memset(biter, 0, sizeof(struct ib_block_iter));
2903
+ biter->__sg = sglist;
2904
+ biter->__sg_nents = nents;
2905
+
2906
+ /* Driver provides best block size to use */
2907
+ biter->__pg_bit = __fls(pgsz);
2908
+}
2909
+EXPORT_SYMBOL(__rdma_block_iter_start);
2910
+
2911
+bool __rdma_block_iter_next(struct ib_block_iter *biter)
2912
+{
2913
+ unsigned int block_offset;
2914
+
2915
+ if (!biter->__sg_nents || !biter->__sg)
2916
+ return false;
2917
+
2918
+ biter->__dma_addr = sg_dma_address(biter->__sg) + biter->__sg_advance;
2919
+ block_offset = biter->__dma_addr & (BIT_ULL(biter->__pg_bit) - 1);
2920
+ biter->__sg_advance += BIT_ULL(biter->__pg_bit) - block_offset;
2921
+
2922
+ if (biter->__sg_advance >= sg_dma_len(biter->__sg)) {
2923
+ biter->__sg_advance = 0;
2924
+ biter->__sg = sg_next(biter->__sg);
2925
+ biter->__sg_nents--;
2926
+ }
2927
+
2928
+ return true;
2929
+}
2930
+EXPORT_SYMBOL(__rdma_block_iter_next);