Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma

Pull rdma updates from Jason Gunthorpe:
"Not a big list of changes this cycle, mostly small things. The new
MANA rdma driver should come next cycle along with a bunch of work on
rxe.

Summary:

- Small bug fixes in mlx5, efa, rxe, hns, irdma, erdma, siw

- rts tracing improvements

- Code improvements: strlscpy conversion, unused parameter, spelling
mistakes, unused variables, flex arrays

- restrack device details report for hns

- Simplify struct device initialization in SRP

- Eliminate the never-used service_mask support in IB CM

- Make rxe not print to the console for some kinds of network packets

- Asymetric paths and router support in the CM through netlink
messages

- DMABUF importer support for mlx5devx umem's"

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: (84 commits)
RDMA/rxe: Remove error/warning messages from packet receiver path
RDMA/usnic: fix set-but-not-unused variable 'flags' warning
IB/hfi1: Use skb_put_data() instead of skb_put/memcpy pair
RDMA/hns: Unified Log Printing Style
RDMA/hns: Replacing magic number with macros in apply_func_caps()
RDMA/hns: Repacing 'dseg_len' by macros in fill_ext_sge_inl_data()
RDMA/hns: Remove redundant 'max_srq_desc_sz' in caps
RDMA/hns: Remove redundant 'num_mtt_segs' and 'max_extend_sg'
RDMA/hns: Remove redundant 'phy_addr' in hns_roce_hem_list_find_mtt()
RDMA/hns: Remove redundant 'use_lowmem' argument from hns_roce_init_hem_table()
RDMA/hns: Remove redundant 'bt_level' for hem_list_alloc_item()
RDMA/hns: Remove redundant 'attr_mask' in modify_qp_init_to_init()
RDMA/hns: Remove unnecessary brackets when getting point
RDMA/hns: Remove unnecessary braces for single statement blocks
RDMA/hns: Cleanup for a spelling error of Asynchronous
IB/rdmavt: Add __init/__exit annotations to module init/exit funcs
RDMA/rxe: Remove redundant num_sge fields
RDMA/mlx5: Enable ATS support for MRs and umems
RDMA/mlx5: Add support for dmabuf to devx umem
RDMA/core: Add UVERBS_ATTR_RAW_FD
...

+1704 -873
+5 -6
drivers/block/rnbd/rnbd-srv.c
··· 360 360 const void *msg, size_t len, 361 361 void *data, size_t datalen); 362 362 363 - static int rnbd_srv_rdma_ev(void *priv, 364 - struct rtrs_srv_op *id, int dir, 365 - void *data, size_t datalen, const void *usr, 366 - size_t usrlen) 363 + static int rnbd_srv_rdma_ev(void *priv, struct rtrs_srv_op *id, 364 + void *data, size_t datalen, 365 + const void *usr, size_t usrlen) 367 366 { 368 367 struct rnbd_srv_session *srv_sess = priv; 369 368 const struct rnbd_msg_hdr *hdr = usr; ··· 388 389 datalen); 389 390 break; 390 391 default: 391 - pr_warn("Received unexpected message type %d with dir %d from session %s\n", 392 - type, dir, srv_sess->sessname); 392 + pr_warn("Received unexpected message type %d from session %s\n", 393 + type, srv_sess->sessname); 393 394 return -EINVAL; 394 395 } 395 396
+52 -52
drivers/infiniband/core/cm.c
··· 175 175 struct cm_av { 176 176 struct cm_port *port; 177 177 struct rdma_ah_attr ah_attr; 178 + u16 dlid_datapath; 178 179 u16 pkey_index; 179 180 u8 timeout; 180 181 }; ··· 618 617 struct rb_node *parent = NULL; 619 618 struct cm_id_private *cur_cm_id_priv; 620 619 __be64 service_id = cm_id_priv->id.service_id; 621 - __be64 service_mask = cm_id_priv->id.service_mask; 622 620 unsigned long flags; 623 621 624 622 spin_lock_irqsave(&cm.lock, flags); ··· 625 625 parent = *link; 626 626 cur_cm_id_priv = rb_entry(parent, struct cm_id_private, 627 627 service_node); 628 - if ((cur_cm_id_priv->id.service_mask & service_id) == 629 - (service_mask & cur_cm_id_priv->id.service_id) && 630 - (cm_id_priv->id.device == cur_cm_id_priv->id.device)) { 628 + 629 + if (cm_id_priv->id.device < cur_cm_id_priv->id.device) 630 + link = &(*link)->rb_left; 631 + else if (cm_id_priv->id.device > cur_cm_id_priv->id.device) 632 + link = &(*link)->rb_right; 633 + else if (be64_lt(service_id, cur_cm_id_priv->id.service_id)) 634 + link = &(*link)->rb_left; 635 + else if (be64_gt(service_id, cur_cm_id_priv->id.service_id)) 636 + link = &(*link)->rb_right; 637 + else { 631 638 /* 632 639 * Sharing an ib_cm_id with different handlers is not 633 640 * supported ··· 650 643 spin_unlock_irqrestore(&cm.lock, flags); 651 644 return cur_cm_id_priv; 652 645 } 653 - 654 - if (cm_id_priv->id.device < cur_cm_id_priv->id.device) 655 - link = &(*link)->rb_left; 656 - else if (cm_id_priv->id.device > cur_cm_id_priv->id.device) 657 - link = &(*link)->rb_right; 658 - else if (be64_lt(service_id, cur_cm_id_priv->id.service_id)) 659 - link = &(*link)->rb_left; 660 - else if (be64_gt(service_id, cur_cm_id_priv->id.service_id)) 661 - link = &(*link)->rb_right; 662 - else 663 - link = &(*link)->rb_right; 664 646 } 665 647 cm_id_priv->listen_sharecount++; 666 648 rb_link_node(&cm_id_priv->service_node, parent, link); ··· 666 670 667 671 while (node) { 668 672 cm_id_priv = rb_entry(node, struct cm_id_private, service_node); 669 - if ((cm_id_priv->id.service_mask & service_id) == 670 - cm_id_priv->id.service_id && 671 - (cm_id_priv->id.device == device)) { 672 - refcount_inc(&cm_id_priv->refcount); 673 - return cm_id_priv; 674 - } 673 + 675 674 if (device < cm_id_priv->id.device) 676 675 node = node->rb_left; 677 676 else if (device > cm_id_priv->id.device) ··· 675 684 node = node->rb_left; 676 685 else if (be64_gt(service_id, cm_id_priv->id.service_id)) 677 686 node = node->rb_right; 678 - else 679 - node = node->rb_right; 687 + else { 688 + refcount_inc(&cm_id_priv->refcount); 689 + return cm_id_priv; 690 + } 680 691 } 681 692 return NULL; 682 693 } ··· 1151 1158 } 1152 1159 EXPORT_SYMBOL(ib_destroy_cm_id); 1153 1160 1154 - static int cm_init_listen(struct cm_id_private *cm_id_priv, __be64 service_id, 1155 - __be64 service_mask) 1161 + static int cm_init_listen(struct cm_id_private *cm_id_priv, __be64 service_id) 1156 1162 { 1157 - service_mask = service_mask ? service_mask : ~cpu_to_be64(0); 1158 - service_id &= service_mask; 1159 1163 if ((service_id & IB_SERVICE_ID_AGN_MASK) == IB_CM_ASSIGN_SERVICE_ID && 1160 1164 (service_id != IB_CM_ASSIGN_SERVICE_ID)) 1161 1165 return -EINVAL; 1162 1166 1163 - if (service_id == IB_CM_ASSIGN_SERVICE_ID) { 1167 + if (service_id == IB_CM_ASSIGN_SERVICE_ID) 1164 1168 cm_id_priv->id.service_id = cpu_to_be64(cm.listen_service_id++); 1165 - cm_id_priv->id.service_mask = ~cpu_to_be64(0); 1166 - } else { 1169 + else 1167 1170 cm_id_priv->id.service_id = service_id; 1168 - cm_id_priv->id.service_mask = service_mask; 1169 - } 1171 + 1170 1172 return 0; 1171 1173 } 1172 1174 ··· 1173 1185 * and service ID resolution requests. The service ID should be specified 1174 1186 * network-byte order. If set to IB_CM_ASSIGN_SERVICE_ID, the CM will 1175 1187 * assign a service ID to the caller. 1176 - * @service_mask: Mask applied to service ID used to listen across a 1177 - * range of service IDs. If set to 0, the service ID is matched 1178 - * exactly. This parameter is ignored if %service_id is set to 1179 - * IB_CM_ASSIGN_SERVICE_ID. 1180 1188 */ 1181 - int ib_cm_listen(struct ib_cm_id *cm_id, __be64 service_id, __be64 service_mask) 1189 + int ib_cm_listen(struct ib_cm_id *cm_id, __be64 service_id) 1182 1190 { 1183 1191 struct cm_id_private *cm_id_priv = 1184 1192 container_of(cm_id, struct cm_id_private, id); ··· 1187 1203 goto out; 1188 1204 } 1189 1205 1190 - ret = cm_init_listen(cm_id_priv, service_id, service_mask); 1206 + ret = cm_init_listen(cm_id_priv, service_id); 1191 1207 if (ret) 1192 1208 goto out; 1193 1209 ··· 1235 1251 if (IS_ERR(cm_id_priv)) 1236 1252 return ERR_CAST(cm_id_priv); 1237 1253 1238 - err = cm_init_listen(cm_id_priv, service_id, 0); 1254 + err = cm_init_listen(cm_id_priv, service_id); 1239 1255 if (err) { 1240 1256 ib_destroy_cm_id(&cm_id_priv->id); 1241 1257 return ERR_PTR(err); ··· 1305 1321 struct sa_path_rec *pri_path = param->primary_path; 1306 1322 struct sa_path_rec *alt_path = param->alternate_path; 1307 1323 bool pri_ext = false; 1324 + __be16 lid; 1308 1325 1309 1326 if (pri_path->rec_type == SA_PATH_REC_TYPE_OPA) 1310 1327 pri_ext = opa_is_extended_lid(pri_path->opa.dlid, ··· 1365 1380 htons(ntohl(sa_path_get_dlid( 1366 1381 pri_path))))); 1367 1382 } else { 1383 + 1384 + if (param->primary_path_inbound) { 1385 + lid = param->primary_path_inbound->ib.dlid; 1386 + IBA_SET(CM_REQ_PRIMARY_LOCAL_PORT_LID, req_msg, 1387 + be16_to_cpu(lid)); 1388 + } else 1389 + IBA_SET(CM_REQ_PRIMARY_LOCAL_PORT_LID, req_msg, 1390 + be16_to_cpu(IB_LID_PERMISSIVE)); 1391 + 1368 1392 /* Work-around until there's a way to obtain remote LID info */ 1369 - IBA_SET(CM_REQ_PRIMARY_LOCAL_PORT_LID, req_msg, 1370 - be16_to_cpu(IB_LID_PERMISSIVE)); 1371 1393 IBA_SET(CM_REQ_PRIMARY_REMOTE_PORT_LID, req_msg, 1372 1394 be16_to_cpu(IB_LID_PERMISSIVE)); 1373 1395 } ··· 1514 1522 } 1515 1523 } 1516 1524 cm_id->service_id = param->service_id; 1517 - cm_id->service_mask = ~cpu_to_be64(0); 1518 1525 cm_id_priv->timeout_ms = cm_convert_to_ms( 1519 1526 param->primary_path->packet_life_time) * 2 + 1520 1527 cm_convert_to_ms( ··· 1529 1538 spin_lock_irqsave(&cm_id_priv->lock, flags); 1530 1539 1531 1540 cm_move_av_from_path(&cm_id_priv->av, &av); 1541 + if (param->primary_path_outbound) 1542 + cm_id_priv->av.dlid_datapath = 1543 + be16_to_cpu(param->primary_path_outbound->ib.dlid); 1544 + 1532 1545 if (param->alternate_path) 1533 1546 cm_move_av_from_path(&cm_id_priv->alt_av, &alt_av); 1534 1547 ··· 1627 1632 1628 1633 static void cm_format_path_lid_from_req(struct cm_req_msg *req_msg, 1629 1634 struct sa_path_rec *primary_path, 1630 - struct sa_path_rec *alt_path) 1635 + struct sa_path_rec *alt_path, 1636 + struct ib_wc *wc) 1631 1637 { 1632 1638 u32 lid; 1633 1639 1634 1640 if (primary_path->rec_type != SA_PATH_REC_TYPE_OPA) { 1635 - sa_path_set_dlid(primary_path, 1636 - IBA_GET(CM_REQ_PRIMARY_LOCAL_PORT_LID, 1637 - req_msg)); 1641 + sa_path_set_dlid(primary_path, wc->slid); 1638 1642 sa_path_set_slid(primary_path, 1639 1643 IBA_GET(CM_REQ_PRIMARY_REMOTE_PORT_LID, 1640 1644 req_msg)); ··· 1670 1676 1671 1677 static void cm_format_paths_from_req(struct cm_req_msg *req_msg, 1672 1678 struct sa_path_rec *primary_path, 1673 - struct sa_path_rec *alt_path) 1679 + struct sa_path_rec *alt_path, 1680 + struct ib_wc *wc) 1674 1681 { 1675 1682 primary_path->dgid = 1676 1683 *IBA_GET_MEM_PTR(CM_REQ_PRIMARY_LOCAL_PORT_GID, req_msg); ··· 1729 1734 if (sa_path_is_roce(alt_path)) 1730 1735 alt_path->roce.route_resolved = false; 1731 1736 } 1732 - cm_format_path_lid_from_req(req_msg, primary_path, alt_path); 1737 + cm_format_path_lid_from_req(req_msg, primary_path, alt_path, wc); 1733 1738 } 1734 1739 1735 1740 static u16 cm_get_bth_pkey(struct cm_work *work) ··· 2074 2079 cpu_to_be32(IBA_GET(CM_REQ_LOCAL_COMM_ID, req_msg)); 2075 2080 cm_id_priv->id.service_id = 2076 2081 cpu_to_be64(IBA_GET(CM_REQ_SERVICE_ID, req_msg)); 2077 - cm_id_priv->id.service_mask = ~cpu_to_be64(0); 2078 2082 cm_id_priv->tid = req_msg->hdr.tid; 2079 2083 cm_id_priv->timeout_ms = cm_convert_to_ms( 2080 2084 IBA_GET(CM_REQ_LOCAL_CM_RESPONSE_TIMEOUT, req_msg)); ··· 2142 2148 if (cm_req_has_alt_path(req_msg)) 2143 2149 work->path[1].rec_type = work->path[0].rec_type; 2144 2150 cm_format_paths_from_req(req_msg, &work->path[0], 2145 - &work->path[1]); 2151 + &work->path[1], work->mad_recv_wc->wc); 2146 2152 if (cm_id_priv->av.ah_attr.type == RDMA_AH_ATTR_TYPE_ROCE) 2147 2153 sa_path_set_dmac(&work->path[0], 2148 2154 cm_id_priv->av.ah_attr.roce.dmac); ··· 2167 2173 NULL, 0); 2168 2174 goto rejected; 2169 2175 } 2176 + if (cm_id_priv->av.ah_attr.type == RDMA_AH_ATTR_TYPE_IB) 2177 + cm_id_priv->av.dlid_datapath = 2178 + IBA_GET(CM_REQ_PRIMARY_LOCAL_PORT_LID, req_msg); 2179 + 2170 2180 if (cm_req_has_alt_path(req_msg)) { 2171 2181 ret = cm_init_av_by_path(&work->path[1], NULL, 2172 2182 &cm_id_priv->alt_av); ··· 3484 3486 spin_lock_irqsave(&cm_id_priv->lock, flags); 3485 3487 cm_move_av_from_path(&cm_id_priv->av, &av); 3486 3488 cm_id->service_id = param->service_id; 3487 - cm_id->service_mask = ~cpu_to_be64(0); 3488 3489 cm_id_priv->timeout_ms = param->timeout_ms; 3489 3490 cm_id_priv->max_cm_retries = param->max_cm_retries; 3490 3491 if (cm_id->state != IB_CM_IDLE) { ··· 3558 3561 cpu_to_be32(IBA_GET(CM_SIDR_REQ_REQUESTID, sidr_req_msg)); 3559 3562 cm_id_priv->id.service_id = 3560 3563 cpu_to_be64(IBA_GET(CM_SIDR_REQ_SERVICEID, sidr_req_msg)); 3561 - cm_id_priv->id.service_mask = ~cpu_to_be64(0); 3562 3564 cm_id_priv->tid = sidr_req_msg->hdr.tid; 3563 3565 3564 3566 wc = work->mad_recv_wc->wc; ··· 4130 4134 *qp_attr_mask = IB_QP_STATE | IB_QP_AV | IB_QP_PATH_MTU | 4131 4135 IB_QP_DEST_QPN | IB_QP_RQ_PSN; 4132 4136 qp_attr->ah_attr = cm_id_priv->av.ah_attr; 4137 + if ((qp_attr->ah_attr.type == RDMA_AH_ATTR_TYPE_IB) && 4138 + cm_id_priv->av.dlid_datapath && 4139 + (cm_id_priv->av.dlid_datapath != 0xffff)) 4140 + qp_attr->ah_attr.ib.dlid = cm_id_priv->av.dlid_datapath; 4133 4141 qp_attr->path_mtu = cm_id_priv->path_mtu; 4134 4142 qp_attr->dest_qp_num = be32_to_cpu(cm_id_priv->remote_qpn); 4135 4143 qp_attr->rq_psn = be32_to_cpu(cm_id_priv->rq_psn);
+69 -19
drivers/infiniband/core/cma.c
··· 2026 2026 cma_id_put(id_priv->id.context); 2027 2027 2028 2028 kfree(id_priv->id.route.path_rec); 2029 + kfree(id_priv->id.route.path_rec_inbound); 2030 + kfree(id_priv->id.route.path_rec_outbound); 2029 2031 2030 2032 put_net(id_priv->id.route.addr.dev_addr.net); 2031 2033 kfree(id_priv); ··· 2243 2241 goto err; 2244 2242 2245 2243 rt = &id->route; 2246 - rt->num_paths = ib_event->param.req_rcvd.alternate_path ? 2 : 1; 2247 - rt->path_rec = kmalloc_array(rt->num_paths, sizeof(*rt->path_rec), 2248 - GFP_KERNEL); 2244 + rt->num_pri_alt_paths = ib_event->param.req_rcvd.alternate_path ? 2 : 1; 2245 + rt->path_rec = kmalloc_array(rt->num_pri_alt_paths, 2246 + sizeof(*rt->path_rec), GFP_KERNEL); 2249 2247 if (!rt->path_rec) 2250 2248 goto err; 2251 2249 2252 2250 rt->path_rec[0] = *path; 2253 - if (rt->num_paths == 2) 2251 + if (rt->num_pri_alt_paths == 2) 2254 2252 rt->path_rec[1] = *ib_event->param.req_rcvd.alternate_path; 2255 2253 2256 2254 if (net_dev) { ··· 2819 2817 } 2820 2818 EXPORT_SYMBOL(rdma_set_min_rnr_timer); 2821 2819 2820 + static void route_set_path_rec_inbound(struct cma_work *work, 2821 + struct sa_path_rec *path_rec) 2822 + { 2823 + struct rdma_route *route = &work->id->id.route; 2824 + 2825 + if (!route->path_rec_inbound) { 2826 + route->path_rec_inbound = 2827 + kzalloc(sizeof(*route->path_rec_inbound), GFP_KERNEL); 2828 + if (!route->path_rec_inbound) 2829 + return; 2830 + } 2831 + 2832 + *route->path_rec_inbound = *path_rec; 2833 + } 2834 + 2835 + static void route_set_path_rec_outbound(struct cma_work *work, 2836 + struct sa_path_rec *path_rec) 2837 + { 2838 + struct rdma_route *route = &work->id->id.route; 2839 + 2840 + if (!route->path_rec_outbound) { 2841 + route->path_rec_outbound = 2842 + kzalloc(sizeof(*route->path_rec_outbound), GFP_KERNEL); 2843 + if (!route->path_rec_outbound) 2844 + return; 2845 + } 2846 + 2847 + *route->path_rec_outbound = *path_rec; 2848 + } 2849 + 2822 2850 static void cma_query_handler(int status, struct sa_path_rec *path_rec, 2823 - void *context) 2851 + int num_prs, void *context) 2824 2852 { 2825 2853 struct cma_work *work = context; 2826 2854 struct rdma_route *route; 2855 + int i; 2827 2856 2828 2857 route = &work->id->id.route; 2829 2858 2830 - if (!status) { 2831 - route->num_paths = 1; 2832 - *route->path_rec = *path_rec; 2833 - } else { 2834 - work->old_state = RDMA_CM_ROUTE_QUERY; 2835 - work->new_state = RDMA_CM_ADDR_RESOLVED; 2836 - work->event.event = RDMA_CM_EVENT_ROUTE_ERROR; 2837 - work->event.status = status; 2838 - pr_debug_ratelimited("RDMA CM: ROUTE_ERROR: failed to query path. status %d\n", 2839 - status); 2859 + if (status) 2860 + goto fail; 2861 + 2862 + for (i = 0; i < num_prs; i++) { 2863 + if (!path_rec[i].flags || (path_rec[i].flags & IB_PATH_GMP)) 2864 + *route->path_rec = path_rec[i]; 2865 + else if (path_rec[i].flags & IB_PATH_INBOUND) 2866 + route_set_path_rec_inbound(work, &path_rec[i]); 2867 + else if (path_rec[i].flags & IB_PATH_OUTBOUND) 2868 + route_set_path_rec_outbound(work, &path_rec[i]); 2869 + } 2870 + if (!route->path_rec) { 2871 + status = -EINVAL; 2872 + goto fail; 2840 2873 } 2841 2874 2875 + route->num_pri_alt_paths = 1; 2876 + queue_work(cma_wq, &work->work); 2877 + return; 2878 + 2879 + fail: 2880 + work->old_state = RDMA_CM_ROUTE_QUERY; 2881 + work->new_state = RDMA_CM_ADDR_RESOLVED; 2882 + work->event.event = RDMA_CM_EVENT_ROUTE_ERROR; 2883 + work->event.status = status; 2884 + pr_debug_ratelimited("RDMA CM: ROUTE_ERROR: failed to query path. status %d\n", 2885 + status); 2842 2886 queue_work(cma_wq, &work->work); 2843 2887 } 2844 2888 ··· 3129 3081 dev_put(ndev); 3130 3082 } 3131 3083 3132 - id->route.num_paths = 1; 3084 + id->route.num_pri_alt_paths = 1; 3133 3085 return 0; 3134 3086 3135 3087 err_free: ··· 3262 3214 goto err1; 3263 3215 } 3264 3216 3265 - route->num_paths = 1; 3217 + route->num_pri_alt_paths = 1; 3266 3218 3267 3219 ndev = cma_iboe_set_path_rec_l2_fields(id_priv); 3268 3220 if (!ndev) { ··· 3322 3274 err2: 3323 3275 kfree(route->path_rec); 3324 3276 route->path_rec = NULL; 3325 - route->num_paths = 0; 3277 + route->num_pri_alt_paths = 0; 3326 3278 err1: 3327 3279 kfree(work); 3328 3280 return ret; ··· 4313 4265 } 4314 4266 4315 4267 req.primary_path = &route->path_rec[0]; 4316 - if (route->num_paths == 2) 4268 + req.primary_path_inbound = route->path_rec_inbound; 4269 + req.primary_path_outbound = route->path_rec_outbound; 4270 + if (route->num_pri_alt_paths == 2) 4317 4271 req.alternate_path = &route->path_rec[1]; 4318 4272 4319 4273 req.ppath_sgid_attr = id_priv->id.route.addr.dev_addr.sgid_attr;
+1 -1
drivers/infiniband/core/cma_configfs.c
··· 292 292 goto fail; 293 293 } 294 294 295 - strlcpy(cma_dev_group->name, name, sizeof(cma_dev_group->name)); 295 + strscpy(cma_dev_group->name, name, sizeof(cma_dev_group->name)); 296 296 297 297 config_group_init_type_name(&cma_dev_group->ports_group, "ports", 298 298 &cma_ports_group_type);
+2 -2
drivers/infiniband/core/device.c
··· 422 422 return ret; 423 423 } 424 424 425 - strlcpy(ibdev->name, name, IB_DEVICE_NAME_MAX); 425 + strscpy(ibdev->name, name, IB_DEVICE_NAME_MAX); 426 426 ret = rename_compat_devs(ibdev); 427 427 428 428 downgrade_write(&devices_rwsem); ··· 1217 1217 ret = -ENFILE; 1218 1218 goto out; 1219 1219 } 1220 - strlcpy(device->name, dev_name(&device->dev), IB_DEVICE_NAME_MAX); 1220 + strscpy(device->name, dev_name(&device->dev), IB_DEVICE_NAME_MAX); 1221 1221 1222 1222 ret = xa_alloc_cyclic(&devices, &device->index, device, xa_limit_31b, 1223 1223 &last_id, GFP_KERNEL);
+2 -3
drivers/infiniband/core/lag.c
··· 7 7 #include <rdma/ib_cache.h> 8 8 #include <rdma/lag.h> 9 9 10 - static struct sk_buff *rdma_build_skb(struct ib_device *device, 11 - struct net_device *netdev, 10 + static struct sk_buff *rdma_build_skb(struct net_device *netdev, 12 11 struct rdma_ah_attr *ah_attr, 13 12 gfp_t flags) 14 13 { ··· 85 86 struct net_device *slave; 86 87 struct sk_buff *skb; 87 88 88 - skb = rdma_build_skb(device, master, ah_attr, flags); 89 + skb = rdma_build_skb(master, ah_attr, flags); 89 90 if (!skb) 90 91 return ERR_PTR(-ENOMEM); 91 92
+163 -74
drivers/infiniband/core/sa_query.c
··· 50 50 #include <rdma/ib_marshall.h> 51 51 #include <rdma/ib_addr.h> 52 52 #include <rdma/opa_addr.h> 53 + #include <rdma/rdma_cm.h> 53 54 #include "sa.h" 54 55 #include "core_priv.h" 55 56 ··· 105 104 }; 106 105 107 106 struct ib_sa_query { 108 - void (*callback)(struct ib_sa_query *, int, struct ib_sa_mad *); 107 + void (*callback)(struct ib_sa_query *sa_query, int status, 108 + int num_prs, struct ib_sa_mad *mad); 109 109 void (*release)(struct ib_sa_query *); 110 110 struct ib_sa_client *client; 111 111 struct ib_sa_port *port; ··· 118 116 u32 seq; /* Local svc request sequence number */ 119 117 unsigned long timeout; /* Local svc timeout */ 120 118 u8 path_use; /* How will the pathrecord be used */ 119 + 120 + /* A separate buffer to save pathrecords of a response, as in cases 121 + * like IB/netlink, mulptiple pathrecords are supported, so that 122 + * mad->data is not large enough to hold them 123 + */ 124 + void *resp_pr_data; 121 125 }; 122 126 123 127 #define IB_SA_ENABLE_LOCAL_SERVICE 0x00000001 ··· 131 123 #define IB_SA_QUERY_OPA 0x00000004 132 124 133 125 struct ib_sa_path_query { 134 - void (*callback)(int, struct sa_path_rec *, void *); 126 + void (*callback)(int status, struct sa_path_rec *rec, 127 + int num_paths, void *context); 135 128 void *context; 136 129 struct ib_sa_query sa_query; 137 130 struct sa_path_rec *conv_pr; ··· 721 712 722 713 if ((comp_mask & IB_SA_PATH_REC_REVERSIBLE) && 723 714 sa_rec->reversible != 0) 724 - query->path_use = LS_RESOLVE_PATH_USE_GMP; 715 + query->path_use = LS_RESOLVE_PATH_USE_ALL; 725 716 else 726 717 query->path_use = LS_RESOLVE_PATH_USE_UNIDIRECTIONAL; 727 718 header->path_use = query->path_use; ··· 874 865 static void ib_nl_process_good_resolve_rsp(struct ib_sa_query *query, 875 866 const struct nlmsghdr *nlh) 876 867 { 868 + struct ib_path_rec_data *srec, *drec; 869 + struct ib_sa_path_query *path_query; 877 870 struct ib_mad_send_wc mad_send_wc; 878 - struct ib_sa_mad *mad = NULL; 879 871 const struct nlattr *head, *curr; 880 - struct ib_path_rec_data *rec; 881 - int len, rem; 872 + struct ib_sa_mad *mad = NULL; 873 + int len, rem, num_prs = 0; 882 874 u32 mask = 0; 883 875 int status = -EIO; 884 876 885 - if (query->callback) { 886 - head = (const struct nlattr *) nlmsg_data(nlh); 887 - len = nlmsg_len(nlh); 888 - switch (query->path_use) { 889 - case LS_RESOLVE_PATH_USE_UNIDIRECTIONAL: 890 - mask = IB_PATH_PRIMARY | IB_PATH_OUTBOUND; 891 - break; 877 + if (!query->callback) 878 + goto out; 892 879 893 - case LS_RESOLVE_PATH_USE_ALL: 894 - case LS_RESOLVE_PATH_USE_GMP: 895 - default: 896 - mask = IB_PATH_PRIMARY | IB_PATH_GMP | 897 - IB_PATH_BIDIRECTIONAL; 898 - break; 880 + path_query = container_of(query, struct ib_sa_path_query, sa_query); 881 + mad = query->mad_buf->mad; 882 + if (!path_query->conv_pr && 883 + (be16_to_cpu(mad->mad_hdr.attr_id) == IB_SA_ATTR_PATH_REC)) { 884 + /* Need a larger buffer for possible multiple PRs */ 885 + query->resp_pr_data = kvcalloc(RDMA_PRIMARY_PATH_MAX_REC_NUM, 886 + sizeof(*drec), GFP_KERNEL); 887 + if (!query->resp_pr_data) { 888 + query->callback(query, -ENOMEM, 0, NULL); 889 + return; 899 890 } 900 - nla_for_each_attr(curr, head, len, rem) { 901 - if (curr->nla_type == LS_NLA_TYPE_PATH_RECORD) { 902 - rec = nla_data(curr); 903 - /* 904 - * Get the first one. In the future, we may 905 - * need to get up to 6 pathrecords. 906 - */ 907 - if ((rec->flags & mask) == mask) { 908 - mad = query->mad_buf->mad; 909 - mad->mad_hdr.method |= 910 - IB_MGMT_METHOD_RESP; 911 - memcpy(mad->data, rec->path_rec, 912 - sizeof(rec->path_rec)); 913 - status = 0; 914 - break; 915 - } 916 - } 917 - } 918 - query->callback(query, status, mad); 919 891 } 920 892 893 + head = (const struct nlattr *) nlmsg_data(nlh); 894 + len = nlmsg_len(nlh); 895 + switch (query->path_use) { 896 + case LS_RESOLVE_PATH_USE_UNIDIRECTIONAL: 897 + mask = IB_PATH_PRIMARY | IB_PATH_OUTBOUND; 898 + break; 899 + 900 + case LS_RESOLVE_PATH_USE_ALL: 901 + mask = IB_PATH_PRIMARY; 902 + break; 903 + 904 + case LS_RESOLVE_PATH_USE_GMP: 905 + default: 906 + mask = IB_PATH_PRIMARY | IB_PATH_GMP | 907 + IB_PATH_BIDIRECTIONAL; 908 + break; 909 + } 910 + 911 + drec = (struct ib_path_rec_data *)query->resp_pr_data; 912 + nla_for_each_attr(curr, head, len, rem) { 913 + if (curr->nla_type != LS_NLA_TYPE_PATH_RECORD) 914 + continue; 915 + 916 + srec = nla_data(curr); 917 + if ((srec->flags & mask) != mask) 918 + continue; 919 + 920 + status = 0; 921 + if (!drec) { 922 + memcpy(mad->data, srec->path_rec, 923 + sizeof(srec->path_rec)); 924 + num_prs = 1; 925 + break; 926 + } 927 + 928 + memcpy(drec, srec, sizeof(*drec)); 929 + drec++; 930 + num_prs++; 931 + if (num_prs >= RDMA_PRIMARY_PATH_MAX_REC_NUM) 932 + break; 933 + } 934 + 935 + if (!status) 936 + mad->mad_hdr.method |= IB_MGMT_METHOD_RESP; 937 + 938 + query->callback(query, status, num_prs, mad); 939 + kvfree(query->resp_pr_data); 940 + query->resp_pr_data = NULL; 941 + 942 + out: 921 943 mad_send_wc.send_buf = query->mad_buf; 922 944 mad_send_wc.status = IB_WC_SUCCESS; 923 945 send_handler(query->mad_buf->mad_agent, &mad_send_wc); ··· 1451 1411 return PR_IB_SUPPORTED; 1452 1412 } 1453 1413 1414 + static void ib_sa_pr_callback_single(struct ib_sa_path_query *query, 1415 + int status, struct ib_sa_mad *mad) 1416 + { 1417 + struct sa_path_rec rec = {}; 1418 + 1419 + ib_unpack(path_rec_table, ARRAY_SIZE(path_rec_table), 1420 + mad->data, &rec); 1421 + rec.rec_type = SA_PATH_REC_TYPE_IB; 1422 + sa_path_set_dmac_zero(&rec); 1423 + 1424 + if (query->conv_pr) { 1425 + struct sa_path_rec opa; 1426 + 1427 + memset(&opa, 0, sizeof(struct sa_path_rec)); 1428 + sa_convert_path_ib_to_opa(&opa, &rec); 1429 + query->callback(status, &opa, 1, query->context); 1430 + } else { 1431 + query->callback(status, &rec, 1, query->context); 1432 + } 1433 + } 1434 + 1435 + /** 1436 + * ib_sa_pr_callback_multiple() - Parse path records then do callback. 1437 + * 1438 + * In a multiple-PR case the PRs are saved in "query->resp_pr_data" 1439 + * (instead of"mad->data") and with "ib_path_rec_data" structure format, 1440 + * so that rec->flags can be set to indicate the type of PR. 1441 + * This is valid only in IB fabric. 1442 + */ 1443 + static void ib_sa_pr_callback_multiple(struct ib_sa_path_query *query, 1444 + int status, int num_prs, 1445 + struct ib_path_rec_data *rec_data) 1446 + { 1447 + struct sa_path_rec *rec; 1448 + int i; 1449 + 1450 + rec = kvcalloc(num_prs, sizeof(*rec), GFP_KERNEL); 1451 + if (!rec) { 1452 + query->callback(-ENOMEM, NULL, 0, query->context); 1453 + return; 1454 + } 1455 + 1456 + for (i = 0; i < num_prs; i++) { 1457 + ib_unpack(path_rec_table, ARRAY_SIZE(path_rec_table), 1458 + rec_data[i].path_rec, rec + i); 1459 + rec[i].rec_type = SA_PATH_REC_TYPE_IB; 1460 + sa_path_set_dmac_zero(rec + i); 1461 + rec[i].flags = rec_data[i].flags; 1462 + } 1463 + 1464 + query->callback(status, rec, num_prs, query->context); 1465 + kvfree(rec); 1466 + } 1467 + 1454 1468 static void ib_sa_path_rec_callback(struct ib_sa_query *sa_query, 1455 - int status, 1469 + int status, int num_prs, 1456 1470 struct ib_sa_mad *mad) 1457 1471 { 1458 1472 struct ib_sa_path_query *query = 1459 1473 container_of(sa_query, struct ib_sa_path_query, sa_query); 1474 + struct sa_path_rec rec; 1460 1475 1461 - if (mad) { 1462 - struct sa_path_rec rec; 1476 + if (!mad || !num_prs) { 1477 + query->callback(status, NULL, 0, query->context); 1478 + return; 1479 + } 1463 1480 1464 - if (sa_query->flags & IB_SA_QUERY_OPA) { 1465 - ib_unpack(opa_path_rec_table, 1466 - ARRAY_SIZE(opa_path_rec_table), 1467 - mad->data, &rec); 1468 - rec.rec_type = SA_PATH_REC_TYPE_OPA; 1469 - query->callback(status, &rec, query->context); 1470 - } else { 1471 - ib_unpack(path_rec_table, 1472 - ARRAY_SIZE(path_rec_table), 1473 - mad->data, &rec); 1474 - rec.rec_type = SA_PATH_REC_TYPE_IB; 1475 - sa_path_set_dmac_zero(&rec); 1476 - 1477 - if (query->conv_pr) { 1478 - struct sa_path_rec opa; 1479 - 1480 - memset(&opa, 0, sizeof(struct sa_path_rec)); 1481 - sa_convert_path_ib_to_opa(&opa, &rec); 1482 - query->callback(status, &opa, query->context); 1483 - } else { 1484 - query->callback(status, &rec, query->context); 1485 - } 1481 + if (sa_query->flags & IB_SA_QUERY_OPA) { 1482 + if (num_prs != 1) { 1483 + query->callback(-EINVAL, NULL, 0, query->context); 1484 + return; 1486 1485 } 1487 - } else 1488 - query->callback(status, NULL, query->context); 1486 + 1487 + ib_unpack(opa_path_rec_table, ARRAY_SIZE(opa_path_rec_table), 1488 + mad->data, &rec); 1489 + rec.rec_type = SA_PATH_REC_TYPE_OPA; 1490 + query->callback(status, &rec, num_prs, query->context); 1491 + } else { 1492 + if (!sa_query->resp_pr_data) 1493 + ib_sa_pr_callback_single(query, status, mad); 1494 + else 1495 + ib_sa_pr_callback_multiple(query, status, num_prs, 1496 + sa_query->resp_pr_data); 1497 + } 1489 1498 } 1490 1499 1491 1500 static void ib_sa_path_rec_release(struct ib_sa_query *sa_query) ··· 1578 1489 unsigned long timeout_ms, gfp_t gfp_mask, 1579 1490 void (*callback)(int status, 1580 1491 struct sa_path_rec *resp, 1581 - void *context), 1492 + int num_paths, void *context), 1582 1493 void *context, 1583 1494 struct ib_sa_query **sa_query) 1584 1495 { ··· 1677 1588 EXPORT_SYMBOL(ib_sa_path_rec_get); 1678 1589 1679 1590 static void ib_sa_mcmember_rec_callback(struct ib_sa_query *sa_query, 1680 - int status, 1591 + int status, int num_prs, 1681 1592 struct ib_sa_mad *mad) 1682 1593 { 1683 1594 struct ib_sa_mcmember_query *query = ··· 1769 1680 1770 1681 /* Support GuidInfoRecord */ 1771 1682 static void ib_sa_guidinfo_rec_callback(struct ib_sa_query *sa_query, 1772 - int status, 1683 + int status, int num_paths, 1773 1684 struct ib_sa_mad *mad) 1774 1685 { 1775 1686 struct ib_sa_guidinfo_query *query = ··· 1879 1790 } 1880 1791 1881 1792 static void ib_sa_classport_info_rec_callback(struct ib_sa_query *sa_query, 1882 - int status, 1793 + int status, int num_prs, 1883 1794 struct ib_sa_mad *mad) 1884 1795 { 1885 1796 unsigned long flags; ··· 2055 1966 /* No callback -- already got recv */ 2056 1967 break; 2057 1968 case IB_WC_RESP_TIMEOUT_ERR: 2058 - query->callback(query, -ETIMEDOUT, NULL); 1969 + query->callback(query, -ETIMEDOUT, 0, NULL); 2059 1970 break; 2060 1971 case IB_WC_WR_FLUSH_ERR: 2061 - query->callback(query, -EINTR, NULL); 1972 + query->callback(query, -EINTR, 0, NULL); 2062 1973 break; 2063 1974 default: 2064 - query->callback(query, -EIO, NULL); 1975 + query->callback(query, -EIO, 0, NULL); 2065 1976 break; 2066 1977 } 2067 1978 ··· 2089 2000 if (mad_recv_wc->wc->status == IB_WC_SUCCESS) 2090 2001 query->callback(query, 2091 2002 mad_recv_wc->recv_buf.mad->mad_hdr.status ? 2092 - -EINVAL : 0, 2003 + -EINVAL : 0, 1, 2093 2004 (struct ib_sa_mad *) mad_recv_wc->recv_buf.mad); 2094 2005 else 2095 - query->callback(query, -EIO, NULL); 2006 + query->callback(query, -EIO, 0, NULL); 2096 2007 } 2097 2008 2098 2009 ib_free_recv_mad(mad_recv_wc);
+5 -5
drivers/infiniband/core/ucma.c
··· 754 754 { 755 755 struct rdma_dev_addr *dev_addr; 756 756 757 - resp->num_paths = route->num_paths; 758 - switch (route->num_paths) { 757 + resp->num_paths = route->num_pri_alt_paths; 758 + switch (route->num_pri_alt_paths) { 759 759 case 0: 760 760 dev_addr = &route->addr.dev_addr; 761 761 rdma_addr_get_dgid(dev_addr, ··· 781 781 struct rdma_route *route) 782 782 { 783 783 784 - resp->num_paths = route->num_paths; 785 - switch (route->num_paths) { 784 + resp->num_paths = route->num_pri_alt_paths; 785 + switch (route->num_pri_alt_paths) { 786 786 case 0: 787 787 rdma_ip2gid((struct sockaddr *)&route->addr.dst_addr, 788 788 (union ib_gid *)&resp->ib_route[0].dgid); ··· 921 921 if (!resp) 922 922 return -ENOMEM; 923 923 924 - resp->num_paths = ctx->cm_id->route.num_paths; 924 + resp->num_paths = ctx->cm_id->route.num_pri_alt_paths; 925 925 for (i = 0, out_len -= sizeof(*resp); 926 926 i < resp->num_paths && out_len > sizeof(struct ib_path_rec_data); 927 927 i++, out_len -= sizeof(struct ib_path_rec_data)) {
-2
drivers/infiniband/core/umem_odp.c
··· 43 43 #include <linux/hmm.h> 44 44 #include <linux/pagemap.h> 45 45 46 - #include <rdma/ib_verbs.h> 47 - #include <rdma/ib_umem.h> 48 46 #include <rdma/ib_umem_odp.h> 49 47 50 48 #include "uverbs.h"
+4 -1
drivers/infiniband/core/uverbs_cmd.c
··· 739 739 mr->uobject = uobj; 740 740 atomic_inc(&pd->usecnt); 741 741 mr->iova = cmd.hca_va; 742 + mr->length = cmd.length; 742 743 743 744 rdma_restrack_new(&mr->res, RDMA_RESTRACK_MR); 744 745 rdma_restrack_set_name(&mr->res, NULL); ··· 862 861 mr->pd = new_pd; 863 862 atomic_inc(&new_pd->usecnt); 864 863 } 865 - if (cmd.flags & IB_MR_REREG_TRANS) 864 + if (cmd.flags & IB_MR_REREG_TRANS) { 866 865 mr->iova = cmd.hca_va; 866 + mr->length = cmd.length; 867 + } 867 868 } 868 869 869 870 memset(&resp, 0, sizeof(resp));
+8
drivers/infiniband/core/uverbs_ioctl.c
··· 337 337 338 338 break; 339 339 340 + case UVERBS_ATTR_TYPE_RAW_FD: 341 + if (uattr->attr_data.reserved || uattr->len != 0 || 342 + uattr->data_s64 < INT_MIN || uattr->data_s64 > INT_MAX) 343 + return -EINVAL; 344 + /* _uverbs_get_const_signed() is the accessor */ 345 + e->ptr_attr.data = uattr->data_s64; 346 + break; 347 + 340 348 case UVERBS_ATTR_TYPE_IDRS_ARRAY: 341 349 return uverbs_process_idrs_array(pbundle, attr_uapi, 342 350 &e->objs_arr_attr, uattr,
+3 -1
drivers/infiniband/core/verbs.c
··· 1038 1038 ret = pd->device->ops.create_srq(srq, srq_init_attr, udata); 1039 1039 if (ret) { 1040 1040 rdma_restrack_put(&srq->res); 1041 - atomic_dec(&srq->pd->usecnt); 1041 + atomic_dec(&pd->usecnt); 1042 1042 if (srq->srq_type == IB_SRQT_XRC && srq->ext.xrc.xrcd) 1043 1043 atomic_dec(&srq->ext.xrc.xrcd->usecnt); 1044 1044 if (ib_srq_has_cq(srq->srq_type)) ··· 2149 2149 mr->pd = pd; 2150 2150 mr->dm = NULL; 2151 2151 atomic_inc(&pd->usecnt); 2152 + mr->iova = virt_addr; 2153 + mr->length = length; 2152 2154 2153 2155 rdma_restrack_new(&mr->res, RDMA_RESTRACK_MR); 2154 2156 rdma_restrack_parent_name(&mr->res, &pd->res);
+1 -1
drivers/infiniband/hw/bnxt_re/main.c
··· 725 725 726 726 /* ib device init */ 727 727 ibdev->node_type = RDMA_NODE_IB_CA; 728 - strlcpy(ibdev->node_desc, BNXT_RE_DESC " HCA", 728 + strscpy(ibdev->node_desc, BNXT_RE_DESC " HCA", 729 729 strlen(BNXT_RE_DESC) + 5); 730 730 ibdev->phys_port_cnt = 1; 731 731
+5 -1
drivers/infiniband/hw/efa/efa_admin_cmds_defs.h
··· 444 444 /* 445 445 * 4:0 : cq_entry_size_words - size of CQ entry in 446 446 * 32-bit words, valid values: 4, 8. 447 - * 7:5 : reserved7 - MBZ 447 + * 5 : set_src_addr - If set, source address will be 448 + * filled on RX completions from unknown senders. 449 + * Requires 8 words CQ entry size. 450 + * 7:6 : reserved7 - MBZ 448 451 */ 449 452 u8 cq_caps_2; 450 453 ··· 983 980 #define EFA_ADMIN_CREATE_CQ_CMD_INTERRUPT_MODE_ENABLED_MASK BIT(5) 984 981 #define EFA_ADMIN_CREATE_CQ_CMD_VIRT_MASK BIT(6) 985 982 #define EFA_ADMIN_CREATE_CQ_CMD_CQ_ENTRY_SIZE_WORDS_MASK GENMASK(4, 0) 983 + #define EFA_ADMIN_CREATE_CQ_CMD_SET_SRC_ADDR_MASK BIT(5) 986 984 987 985 /* create_cq_resp */ 988 986 #define EFA_ADMIN_CREATE_CQ_RESP_DB_VALID_MASK BIT(0)
+4 -1
drivers/infiniband/hw/efa/efa_com_cmd.c
··· 168 168 EFA_ADMIN_CREATE_CQ_CMD_INTERRUPT_MODE_ENABLED, 1); 169 169 create_cmd.eqn = params->eqn; 170 170 } 171 - 171 + if (params->set_src_addr) { 172 + EFA_SET(&create_cmd.cq_caps_2, 173 + EFA_ADMIN_CREATE_CQ_CMD_SET_SRC_ADDR, 1); 174 + } 172 175 efa_com_set_dma_addr(params->dma_addr, 173 176 &create_cmd.cq_ba.mem_addr_high, 174 177 &create_cmd.cq_ba.mem_addr_low);
+2 -1
drivers/infiniband/hw/efa/efa_com_cmd.h
··· 75 75 u16 uarn; 76 76 u16 eqn; 77 77 u8 entry_size_in_bytes; 78 - bool interrupt_mode_enabled; 78 + u8 interrupt_mode_enabled : 1; 79 + u8 set_src_addr : 1; 79 80 }; 80 81 81 82 struct efa_com_create_cq_result {
+289
drivers/infiniband/hw/efa/efa_io_defs.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */ 2 + /* 3 + * Copyright 2018-2022 Amazon.com, Inc. or its affiliates. All rights reserved. 4 + */ 5 + 6 + #ifndef _EFA_IO_H_ 7 + #define _EFA_IO_H_ 8 + 9 + #define EFA_IO_TX_DESC_NUM_BUFS 2 10 + #define EFA_IO_TX_DESC_NUM_RDMA_BUFS 1 11 + #define EFA_IO_TX_DESC_INLINE_MAX_SIZE 32 12 + #define EFA_IO_TX_DESC_IMM_DATA_SIZE 4 13 + 14 + enum efa_io_queue_type { 15 + /* send queue (of a QP) */ 16 + EFA_IO_SEND_QUEUE = 1, 17 + /* recv queue (of a QP) */ 18 + EFA_IO_RECV_QUEUE = 2, 19 + }; 20 + 21 + enum efa_io_send_op_type { 22 + /* send message */ 23 + EFA_IO_SEND = 0, 24 + /* RDMA read */ 25 + EFA_IO_RDMA_READ = 1, 26 + }; 27 + 28 + enum efa_io_comp_status { 29 + /* Successful completion */ 30 + EFA_IO_COMP_STATUS_OK = 0, 31 + /* Flushed during QP destroy */ 32 + EFA_IO_COMP_STATUS_FLUSHED = 1, 33 + /* Internal QP error */ 34 + EFA_IO_COMP_STATUS_LOCAL_ERROR_QP_INTERNAL_ERROR = 2, 35 + /* Bad operation type */ 36 + EFA_IO_COMP_STATUS_LOCAL_ERROR_INVALID_OP_TYPE = 3, 37 + /* Bad AH */ 38 + EFA_IO_COMP_STATUS_LOCAL_ERROR_INVALID_AH = 4, 39 + /* LKEY not registered or does not match IOVA */ 40 + EFA_IO_COMP_STATUS_LOCAL_ERROR_INVALID_LKEY = 5, 41 + /* Message too long */ 42 + EFA_IO_COMP_STATUS_LOCAL_ERROR_BAD_LENGTH = 6, 43 + /* Destination ENI is down or does not run EFA */ 44 + EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_ADDRESS = 7, 45 + /* Connection was reset by remote side */ 46 + EFA_IO_COMP_STATUS_REMOTE_ERROR_ABORT = 8, 47 + /* Bad dest QP number (QP does not exist or is in error state) */ 48 + EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_DEST_QPN = 9, 49 + /* Destination resource not ready (no WQEs posted on RQ) */ 50 + EFA_IO_COMP_STATUS_REMOTE_ERROR_RNR = 10, 51 + /* Receiver SGL too short */ 52 + EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_LENGTH = 11, 53 + /* Unexpected status returned by responder */ 54 + EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_STATUS = 12, 55 + /* Unresponsive remote - detected locally */ 56 + EFA_IO_COMP_STATUS_LOCAL_ERROR_UNRESP_REMOTE = 13, 57 + }; 58 + 59 + struct efa_io_tx_meta_desc { 60 + /* Verbs-generated Request ID */ 61 + u16 req_id; 62 + 63 + /* 64 + * control flags 65 + * 3:0 : op_type - operation type: send/rdma/fast mem 66 + * ops/etc 67 + * 4 : has_imm - immediate_data field carries valid 68 + * data. 69 + * 5 : inline_msg - inline mode - inline message data 70 + * follows this descriptor (no buffer descriptors). 71 + * Note that it is different from immediate data 72 + * 6 : meta_extension - Extended metadata. MBZ 73 + * 7 : meta_desc - Indicates metadata descriptor. 74 + * Must be set. 75 + */ 76 + u8 ctrl1; 77 + 78 + /* 79 + * control flags 80 + * 0 : phase 81 + * 1 : reserved25 - MBZ 82 + * 2 : first - Indicates first descriptor in 83 + * transaction. Must be set. 84 + * 3 : last - Indicates last descriptor in 85 + * transaction. Must be set. 86 + * 4 : comp_req - Indicates whether completion should 87 + * be posted, after packet is transmitted. Valid only 88 + * for the first descriptor 89 + * 7:5 : reserved29 - MBZ 90 + */ 91 + u8 ctrl2; 92 + 93 + u16 dest_qp_num; 94 + 95 + /* 96 + * If inline_msg bit is set, length of inline message in bytes, 97 + * otherwise length of SGL (number of buffers). 98 + */ 99 + u16 length; 100 + 101 + /* 102 + * immediate data: if has_imm is set, then this field is included 103 + * within Tx message and reported in remote Rx completion. 104 + */ 105 + u32 immediate_data; 106 + 107 + u16 ah; 108 + 109 + u16 reserved; 110 + 111 + /* Queue key */ 112 + u32 qkey; 113 + 114 + u8 reserved2[12]; 115 + }; 116 + 117 + /* 118 + * Tx queue buffer descriptor, for any transport type. Preceded by metadata 119 + * descriptor. 120 + */ 121 + struct efa_io_tx_buf_desc { 122 + /* length in bytes */ 123 + u32 length; 124 + 125 + /* 126 + * 23:0 : lkey - local memory translation key 127 + * 31:24 : reserved - MBZ 128 + */ 129 + u32 lkey; 130 + 131 + /* Buffer address bits[31:0] */ 132 + u32 buf_addr_lo; 133 + 134 + /* Buffer address bits[63:32] */ 135 + u32 buf_addr_hi; 136 + }; 137 + 138 + struct efa_io_remote_mem_addr { 139 + /* length in bytes */ 140 + u32 length; 141 + 142 + /* remote memory translation key */ 143 + u32 rkey; 144 + 145 + /* Buffer address bits[31:0] */ 146 + u32 buf_addr_lo; 147 + 148 + /* Buffer address bits[63:32] */ 149 + u32 buf_addr_hi; 150 + }; 151 + 152 + struct efa_io_rdma_req { 153 + /* Remote memory address */ 154 + struct efa_io_remote_mem_addr remote_mem; 155 + 156 + /* Local memory address */ 157 + struct efa_io_tx_buf_desc local_mem[1]; 158 + }; 159 + 160 + /* 161 + * Tx WQE, composed of tx meta descriptors followed by either tx buffer 162 + * descriptors or inline data 163 + */ 164 + struct efa_io_tx_wqe { 165 + /* TX meta */ 166 + struct efa_io_tx_meta_desc meta; 167 + 168 + union { 169 + /* Send buffer descriptors */ 170 + struct efa_io_tx_buf_desc sgl[2]; 171 + 172 + u8 inline_data[32]; 173 + 174 + /* RDMA local and remote memory addresses */ 175 + struct efa_io_rdma_req rdma_req; 176 + } data; 177 + }; 178 + 179 + /* 180 + * Rx buffer descriptor; RX WQE is composed of one or more RX buffer 181 + * descriptors. 182 + */ 183 + struct efa_io_rx_desc { 184 + /* Buffer address bits[31:0] */ 185 + u32 buf_addr_lo; 186 + 187 + /* Buffer Pointer[63:32] */ 188 + u32 buf_addr_hi; 189 + 190 + /* Verbs-generated request id. */ 191 + u16 req_id; 192 + 193 + /* Length in bytes. */ 194 + u16 length; 195 + 196 + /* 197 + * LKey and control flags 198 + * 23:0 : lkey 199 + * 29:24 : reserved - MBZ 200 + * 30 : first - Indicates first descriptor in WQE 201 + * 31 : last - Indicates last descriptor in WQE 202 + */ 203 + u32 lkey_ctrl; 204 + }; 205 + 206 + /* Common IO completion descriptor */ 207 + struct efa_io_cdesc_common { 208 + /* 209 + * verbs-generated request ID, as provided in the completed tx or rx 210 + * descriptor. 211 + */ 212 + u16 req_id; 213 + 214 + u8 status; 215 + 216 + /* 217 + * flags 218 + * 0 : phase - Phase bit 219 + * 2:1 : q_type - enum efa_io_queue_type: send/recv 220 + * 3 : has_imm - indicates that immediate data is 221 + * present - for RX completions only 222 + * 7:4 : reserved28 - MBZ 223 + */ 224 + u8 flags; 225 + 226 + /* local QP number */ 227 + u16 qp_num; 228 + 229 + /* Transferred length */ 230 + u16 length; 231 + }; 232 + 233 + /* Tx completion descriptor */ 234 + struct efa_io_tx_cdesc { 235 + /* Common completion info */ 236 + struct efa_io_cdesc_common common; 237 + }; 238 + 239 + /* Rx Completion Descriptor */ 240 + struct efa_io_rx_cdesc { 241 + /* Common completion info */ 242 + struct efa_io_cdesc_common common; 243 + 244 + /* Remote Address Handle FW index, 0xFFFF indicates invalid ah */ 245 + u16 ah; 246 + 247 + u16 src_qp_num; 248 + 249 + /* Immediate data */ 250 + u32 imm; 251 + }; 252 + 253 + /* Extended Rx Completion Descriptor */ 254 + struct efa_io_rx_cdesc_ex { 255 + /* Base RX completion info */ 256 + struct efa_io_rx_cdesc rx_cdesc_base; 257 + 258 + /* 259 + * Valid only in case of unknown AH (0xFFFF) and CQ set_src_addr is 260 + * enabled. 261 + */ 262 + u8 src_addr[16]; 263 + }; 264 + 265 + /* tx_meta_desc */ 266 + #define EFA_IO_TX_META_DESC_OP_TYPE_MASK GENMASK(3, 0) 267 + #define EFA_IO_TX_META_DESC_HAS_IMM_MASK BIT(4) 268 + #define EFA_IO_TX_META_DESC_INLINE_MSG_MASK BIT(5) 269 + #define EFA_IO_TX_META_DESC_META_EXTENSION_MASK BIT(6) 270 + #define EFA_IO_TX_META_DESC_META_DESC_MASK BIT(7) 271 + #define EFA_IO_TX_META_DESC_PHASE_MASK BIT(0) 272 + #define EFA_IO_TX_META_DESC_FIRST_MASK BIT(2) 273 + #define EFA_IO_TX_META_DESC_LAST_MASK BIT(3) 274 + #define EFA_IO_TX_META_DESC_COMP_REQ_MASK BIT(4) 275 + 276 + /* tx_buf_desc */ 277 + #define EFA_IO_TX_BUF_DESC_LKEY_MASK GENMASK(23, 0) 278 + 279 + /* rx_desc */ 280 + #define EFA_IO_RX_DESC_LKEY_MASK GENMASK(23, 0) 281 + #define EFA_IO_RX_DESC_FIRST_MASK BIT(30) 282 + #define EFA_IO_RX_DESC_LAST_MASK BIT(31) 283 + 284 + /* cdesc_common */ 285 + #define EFA_IO_CDESC_COMMON_PHASE_MASK BIT(0) 286 + #define EFA_IO_CDESC_COMMON_Q_TYPE_MASK GENMASK(2, 1) 287 + #define EFA_IO_CDESC_COMMON_HAS_IMM_MASK BIT(3) 288 + 289 + #endif /* _EFA_IO_H_ */
+9 -2
drivers/infiniband/hw/efa/efa_verbs.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB 2 2 /* 3 - * Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All rights reserved. 3 + * Copyright 2018-2022 Amazon.com, Inc. or its affiliates. All rights reserved. 4 4 */ 5 5 6 6 #include <linux/dma-buf.h> ··· 15 15 #include <rdma/uverbs_ioctl.h> 16 16 17 17 #include "efa.h" 18 + #include "efa_io_defs.h" 18 19 19 20 enum { 20 21 EFA_MMAP_DMA_PAGE = 0, ··· 243 242 resp.max_rq_wr = dev_attr->max_rq_depth; 244 243 resp.max_rdma_size = dev_attr->max_rdma_size; 245 244 245 + resp.device_caps |= EFA_QUERY_DEVICE_CAPS_CQ_WITH_SGID; 246 246 if (EFA_DEV_CAP(dev, RDMA_READ)) 247 247 resp.device_caps |= EFA_QUERY_DEVICE_CAPS_RDMA_READ; 248 248 ··· 1066 1064 struct efa_ibv_create_cq cmd = {}; 1067 1065 struct efa_cq *cq = to_ecq(ibcq); 1068 1066 int entries = attr->cqe; 1067 + bool set_src_addr; 1069 1068 int err; 1070 1069 1071 1070 ibdev_dbg(ibdev, "create_cq entries %d\n", entries); ··· 1112 1109 goto err_out; 1113 1110 } 1114 1111 1115 - if (!cmd.cq_entry_size) { 1112 + set_src_addr = !!(cmd.flags & EFA_CREATE_CQ_WITH_SGID); 1113 + if ((cmd.cq_entry_size != sizeof(struct efa_io_rx_cdesc_ex)) && 1114 + (set_src_addr || 1115 + cmd.cq_entry_size != sizeof(struct efa_io_rx_cdesc))) { 1116 1116 ibdev_dbg(ibdev, 1117 1117 "Invalid entry size [%u]\n", cmd.cq_entry_size); 1118 1118 err = -EINVAL; ··· 1144 1138 params.dma_addr = cq->dma_addr; 1145 1139 params.entry_size_in_bytes = cmd.cq_entry_size; 1146 1140 params.num_sub_cqs = cmd.num_sub_cqs; 1141 + params.set_src_addr = set_src_addr; 1147 1142 if (cmd.flags & EFA_CREATE_CQ_WITH_COMPLETION_CHANNEL) { 1148 1143 cq->eq = efa_vec2eq(dev, attr->comp_vector); 1149 1144 params.eqn = cq->eq->eeq.eqn;
+3 -1
drivers/infiniband/hw/erdma/erdma.h
··· 9 9 10 10 #include <linux/bitfield.h> 11 11 #include <linux/netdevice.h> 12 + #include <linux/pci.h> 12 13 #include <linux/xarray.h> 13 14 #include <rdma/ib_verbs.h> 14 15 ··· 197 196 struct erdma_devattr attrs; 198 197 /* physical port state (only one port per device) */ 199 198 enum ib_port_state state; 199 + u32 mtu; 200 200 201 201 /* cmdq and aeq use the same msix vector */ 202 202 struct erdma_irq comm_irq; ··· 271 269 void erdma_cmdq_destroy(struct erdma_dev *dev); 272 270 273 271 void erdma_cmdq_build_reqhdr(u64 *hdr, u32 mod, u32 op); 274 - int erdma_post_cmd_wait(struct erdma_cmdq *cmdq, u64 *req, u32 req_size, 272 + int erdma_post_cmd_wait(struct erdma_cmdq *cmdq, void *req, u32 req_size, 275 273 u64 *resp0, u64 *resp1); 276 274 void erdma_cmdq_completion_handler(struct erdma_cmdq *cmdq); 277 275
-8
drivers/infiniband/hw/erdma/erdma_cm.c
··· 10 10 /* Copyright (c) 2008-2019, IBM Corporation */ 11 11 /* Copyright (c) 2017, Open Grid Computing, Inc. */ 12 12 13 - #include <linux/errno.h> 14 - #include <linux/inetdevice.h> 15 - #include <linux/net.h> 16 - #include <linux/types.h> 17 13 #include <linux/workqueue.h> 18 - #include <net/addrconf.h> 19 - 20 - #include <rdma/ib_user_verbs.h> 21 - #include <rdma/ib_verbs.h> 22 14 23 15 #include "erdma.h" 24 16 #include "erdma_cm.h"
+1 -7
drivers/infiniband/hw/erdma/erdma_cmdq.c
··· 4 4 /* Kai Shen <kaishen@linux.alibaba.com> */ 5 5 /* Copyright (c) 2020-2022, Alibaba Group. */ 6 6 7 - #include <linux/kernel.h> 8 - #include <linux/pci.h> 9 - #include <linux/types.h> 10 - 11 7 #include "erdma.h" 12 - #include "erdma_hw.h" 13 - #include "erdma_verbs.h" 14 8 15 9 static void arm_cmdq_cq(struct erdma_cmdq *cmdq) 16 10 { ··· 435 441 FIELD_PREP(ERDMA_CMD_HDR_OPCODE_MASK, op); 436 442 } 437 443 438 - int erdma_post_cmd_wait(struct erdma_cmdq *cmdq, u64 *req, u32 req_size, 444 + int erdma_post_cmd_wait(struct erdma_cmdq *cmdq, void *req, u32 req_size, 439 445 u64 *resp0, u64 *resp1) 440 446 { 441 447 struct erdma_comp_wait *comp_wait;
-4
drivers/infiniband/hw/erdma/erdma_cq.c
··· 4 4 /* Kai Shen <kaishen@linux.alibaba.com> */ 5 5 /* Copyright (c) 2020-2022, Alibaba Group. */ 6 6 7 - #include <rdma/ib_verbs.h> 8 - 9 - #include "erdma_hw.h" 10 7 #include "erdma_verbs.h" 11 8 12 9 static void *get_next_valid_cqe(struct erdma_cq *cq) ··· 59 62 [ERDMA_OP_RECV_IMM] = IB_WC_RECV_RDMA_WITH_IMM, 60 63 [ERDMA_OP_RECV_INV] = IB_WC_RECV, 61 64 [ERDMA_OP_WRITE_WITH_IMM] = IB_WC_RDMA_WRITE, 62 - [ERDMA_OP_INVALIDATE] = IB_WC_LOCAL_INV, 63 65 [ERDMA_OP_RSP_SEND_IMM] = IB_WC_RECV, 64 66 [ERDMA_OP_SEND_WITH_INV] = IB_WC_SEND, 65 67 [ERDMA_OP_REG_MR] = IB_WC_REG_MR,
+2 -11
drivers/infiniband/hw/erdma/erdma_eq.c
··· 4 4 /* Kai Shen <kaishen@linux.alibaba.com> */ 5 5 /* Copyright (c) 2020-2022, Alibaba Group. */ 6 6 7 - #include <linux/errno.h> 8 - #include <linux/pci.h> 9 - #include <linux/types.h> 10 - 11 - #include "erdma.h" 12 - #include "erdma_hw.h" 13 7 #include "erdma_verbs.h" 14 8 15 9 #define MAX_POLL_CHUNK_SIZE 16 ··· 223 229 req.db_dma_addr_l = lower_32_bits(db_info_dma_addr); 224 230 req.db_dma_addr_h = upper_32_bits(db_info_dma_addr); 225 231 226 - return erdma_post_cmd_wait(&dev->cmdq, (u64 *)&req, 227 - sizeof(struct erdma_cmdq_create_eq_req), 228 - NULL, NULL); 232 + return erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), NULL, NULL); 229 233 } 230 234 231 235 static int erdma_ceq_init_one(struct erdma_dev *dev, u16 ceqn) ··· 273 281 req.qtype = ERDMA_EQ_TYPE_CEQ; 274 282 req.vector_idx = ceqn + 1; 275 283 276 - err = erdma_post_cmd_wait(&dev->cmdq, (u64 *)&req, sizeof(req), NULL, 277 - NULL); 284 + err = erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), NULL, NULL); 278 285 if (err) 279 286 return; 280 287
+10 -4
drivers/infiniband/hw/erdma/erdma_hw.h
··· 153 153 CMDQ_OPCODE_CREATE_EQ = 0, 154 154 CMDQ_OPCODE_DESTROY_EQ = 1, 155 155 CMDQ_OPCODE_QUERY_FW_INFO = 2, 156 + CMDQ_OPCODE_CONF_MTU = 3, 156 157 }; 157 158 158 159 /* cmdq-SQE HDR */ ··· 189 188 u8 eqn; 190 189 u8 rsvd1; 191 190 u8 qtype; 191 + }; 192 + 193 + struct erdma_cmdq_config_mtu_req { 194 + u64 hdr; 195 + u32 mtu; 192 196 }; 193 197 194 198 /* create_cq cfg0 */ ··· 456 450 ERDMA_OP_RECV_IMM = 5, 457 451 ERDMA_OP_RECV_INV = 6, 458 452 459 - ERDMA_OP_REQ_ERR = 7, 460 - ERDMA_OP_READ_RESPONSE = 8, 453 + ERDMA_OP_RSVD0 = 7, 454 + ERDMA_OP_RSVD1 = 8, 461 455 ERDMA_OP_WRITE_WITH_IMM = 9, 462 456 463 - ERDMA_OP_RECV_ERR = 10, 457 + ERDMA_OP_RSVD2 = 10, 458 + ERDMA_OP_RSVD3 = 11, 464 459 465 - ERDMA_OP_INVALIDATE = 11, 466 460 ERDMA_OP_RSP_SEND_IMM = 12, 467 461 ERDMA_OP_SEND_WITH_INV = 13, 468 462
+7 -10
drivers/infiniband/hw/erdma/erdma_main.c
··· 4 4 /* Kai Shen <kaishen@linux.alibaba.com> */ 5 5 /* Copyright (c) 2020-2022, Alibaba Group. */ 6 6 7 - #include <linux/errno.h> 8 - #include <linux/init.h> 9 - #include <linux/kernel.h> 10 - #include <linux/list.h> 11 7 #include <linux/module.h> 12 - #include <linux/netdevice.h> 13 - #include <linux/pci.h> 14 8 #include <net/addrconf.h> 15 9 #include <rdma/erdma-abi.h> 16 - #include <rdma/ib_verbs.h> 17 - #include <rdma/ib_user_verbs.h> 18 10 19 11 #include "erdma.h" 20 12 #include "erdma_cm.h" 21 - #include "erdma_hw.h" 22 13 #include "erdma_verbs.h" 23 14 24 15 MODULE_AUTHOR("Cheng Xu <chengyou@linux.alibaba.com>"); ··· 34 43 dev->state = IB_PORT_DOWN; 35 44 erdma_port_event(dev, IB_EVENT_PORT_ERR); 36 45 break; 46 + case NETDEV_CHANGEMTU: 47 + if (dev->mtu != netdev->mtu) { 48 + erdma_set_mtu(dev, netdev->mtu); 49 + dev->mtu = netdev->mtu; 50 + } 51 + break; 37 52 case NETDEV_REGISTER: 38 53 case NETDEV_UNREGISTER: 39 54 case NETDEV_CHANGEADDR: 40 - case NETDEV_CHANGEMTU: 41 55 case NETDEV_GOING_DOWN: 42 56 case NETDEV_CHANGE: 43 57 default: ··· 100 104 if (ret) 101 105 return ret; 102 106 107 + dev->mtu = dev->netdev->mtu; 103 108 addrconf_addr_eui48((u8 *)&ibdev->node_guid, dev->netdev->dev_addr); 104 109 105 110 ret = ib_register_device(ibdev, "erdma_%d", &dev->pdev->dev);
+2 -13
drivers/infiniband/hw/erdma/erdma_qp.c
··· 6 6 /* Authors: Bernard Metzler <bmt@zurich.ibm.com> */ 7 7 /* Copyright (c) 2008-2019, IBM Corporation */ 8 8 9 - #include <linux/errno.h> 10 - #include <linux/pci.h> 11 - #include <linux/scatterlist.h> 12 - #include <linux/types.h> 13 - 14 - #include <rdma/ib_user_verbs.h> 15 - #include <rdma/ib_verbs.h> 16 - 17 - #include "erdma.h" 18 9 #include "erdma_cm.h" 19 10 #include "erdma_verbs.h" 20 11 ··· 96 105 req.send_nxt += MPA_DEFAULT_HDR_LEN + qp->attrs.pd_len; 97 106 req.recv_nxt = tp->rcv_nxt; 98 107 99 - return erdma_post_cmd_wait(&dev->cmdq, (u64 *)&req, sizeof(req), NULL, 100 - NULL); 108 + return erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), NULL, NULL); 101 109 } 102 110 103 111 static int erdma_modify_qp_state_to_stop(struct erdma_qp *qp, ··· 114 124 req.cfg = FIELD_PREP(ERDMA_CMD_MODIFY_QP_STATE_MASK, attrs->state) | 115 125 FIELD_PREP(ERDMA_CMD_MODIFY_QP_QPN_MASK, QP_ID(qp)); 116 126 117 - return erdma_post_cmd_wait(&dev->cmdq, (u64 *)&req, sizeof(req), NULL, 118 - NULL); 127 + return erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), NULL, NULL); 119 128 } 120 129 121 130 int erdma_modify_qp_internal(struct erdma_qp *qp, struct erdma_qp_attrs *attrs,
+17 -18
drivers/infiniband/hw/erdma/erdma_verbs.c
··· 9 9 10 10 /* Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved. */ 11 11 12 - #include <linux/errno.h> 13 - #include <linux/pci.h> 14 - #include <linux/types.h> 15 - #include <linux/uaccess.h> 16 12 #include <linux/vmalloc.h> 17 13 #include <net/addrconf.h> 18 14 #include <rdma/erdma-abi.h> 19 15 #include <rdma/ib_umem.h> 20 - #include <rdma/ib_user_verbs.h> 21 - #include <rdma/ib_verbs.h> 22 16 #include <rdma/uverbs_ioctl.h> 23 17 24 18 #include "erdma.h" 25 19 #include "erdma_cm.h" 26 - #include "erdma_hw.h" 27 20 #include "erdma_verbs.h" 28 21 29 22 static int create_qp_cmd(struct erdma_dev *dev, struct erdma_qp *qp) ··· 95 102 req.rq_db_info_dma_addr = user_qp->rq_db_info_dma_addr; 96 103 } 97 104 98 - err = erdma_post_cmd_wait(&dev->cmdq, (u64 *)&req, sizeof(req), &resp0, 105 + err = erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), &resp0, 99 106 &resp1); 100 107 if (!err) 101 108 qp->attrs.cookie = ··· 144 151 } 145 152 146 153 post_cmd: 147 - return erdma_post_cmd_wait(&dev->cmdq, (u64 *)&req, sizeof(req), NULL, 148 - NULL); 154 + return erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), NULL, NULL); 149 155 } 150 156 151 157 static int create_cq_cmd(struct erdma_dev *dev, struct erdma_cq *cq) ··· 194 202 req.cq_db_info_addr = cq->user_cq.db_info_dma_addr; 195 203 } 196 204 197 - return erdma_post_cmd_wait(&dev->cmdq, (u64 *)&req, sizeof(req), NULL, 198 - NULL); 205 + return erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), NULL, NULL); 199 206 } 200 207 201 208 static int erdma_alloc_idx(struct erdma_resource_cb *res_cb) ··· 967 976 req.cfg = FIELD_PREP(ERDMA_CMD_MR_MPT_IDX_MASK, ibmr->lkey >> 8) | 968 977 FIELD_PREP(ERDMA_CMD_MR_KEY_MASK, ibmr->lkey & 0xFF); 969 978 970 - ret = erdma_post_cmd_wait(&dev->cmdq, (u64 *)&req, sizeof(req), NULL, 971 - NULL); 979 + ret = erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), NULL, NULL); 972 980 if (ret) 973 981 return ret; 974 982 ··· 992 1002 CMDQ_OPCODE_DESTROY_CQ); 993 1003 req.cqn = cq->cqn; 994 1004 995 - err = erdma_post_cmd_wait(&dev->cmdq, (u64 *)&req, sizeof(req), NULL, 996 - NULL); 1005 + err = erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), NULL, NULL); 997 1006 if (err) 998 1007 return err; 999 1008 ··· 1029 1040 CMDQ_OPCODE_DESTROY_QP); 1030 1041 req.qpn = QP_ID(qp); 1031 1042 1032 - err = erdma_post_cmd_wait(&dev->cmdq, (u64 *)&req, sizeof(req), NULL, 1033 - NULL); 1043 + err = erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), NULL, NULL); 1034 1044 if (err) 1035 1045 return err; 1036 1046 ··· 1434 1446 xa_erase(&dev->cq_xa, cq->cqn); 1435 1447 1436 1448 return ret; 1449 + } 1450 + 1451 + void erdma_set_mtu(struct erdma_dev *dev, u32 mtu) 1452 + { 1453 + struct erdma_cmdq_config_mtu_req req; 1454 + 1455 + erdma_cmdq_build_reqhdr(&req.hdr, CMDQ_SUBMOD_COMMON, 1456 + CMDQ_OPCODE_CONF_MTU); 1457 + req.mtu = mtu; 1458 + 1459 + erdma_post_cmd_wait(&dev->cmdq, &req, sizeof(req), NULL, NULL); 1437 1460 } 1438 1461 1439 1462 void erdma_port_event(struct erdma_dev *dev, enum ib_event_type reason)
+1 -8
drivers/infiniband/hw/erdma/erdma_verbs.h
··· 7 7 #ifndef __ERDMA_VERBS_H__ 8 8 #define __ERDMA_VERBS_H__ 9 9 10 - #include <linux/errno.h> 11 - 12 - #include <rdma/ib_verbs.h> 13 - #include <rdma/ib_user_verbs.h> 14 - #include <rdma/iw_cm.h> 15 - 16 10 #include "erdma.h" 17 - #include "erdma_cm.h" 18 - #include "erdma_hw.h" 19 11 20 12 /* RDMA Capability. */ 21 13 #define ERDMA_MAX_PD (128 * 1024) ··· 330 338 int erdma_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents, 331 339 unsigned int *sg_offset); 332 340 void erdma_port_event(struct erdma_dev *dev, enum ib_event_type reason); 341 + void erdma_set_mtu(struct erdma_dev *dev, u32 mtu); 333 342 334 343 #endif
+1 -1
drivers/infiniband/hw/hfi1/chip.c
··· 8753 8753 8754 8754 /* 8755 8755 * When writing a LCB CSR, out_data contains the full value to 8756 - * to be written, while in_data contains the relative LCB 8756 + * be written, while in_data contains the relative LCB 8757 8757 * address in 7:0. Do the work here, rather than the caller, 8758 8758 * of distrubting the write data to where it needs to go: 8759 8759 *
+1 -1
drivers/infiniband/hw/hfi1/file_ops.c
··· 965 965 uctxt->userversion = uinfo->userversion; 966 966 uctxt->flags = hfi1_cap_mask; /* save current flag state */ 967 967 init_waitqueue_head(&uctxt->wait); 968 - strlcpy(uctxt->comm, current->comm, sizeof(uctxt->comm)); 968 + strscpy(uctxt->comm, current->comm, sizeof(uctxt->comm)); 969 969 memcpy(uctxt->uuid, uinfo->uuid, sizeof(uctxt->uuid)); 970 970 uctxt->jkey = generate_jkey(current_uid()); 971 971 hfi1_stats.sps_ctxts++;
+1 -1
drivers/infiniband/hw/hfi1/firmware.c
··· 1114 1114 * Reset all of the fabric serdes for this HFI in preparation to take the 1115 1115 * link to Polling. 1116 1116 * 1117 - * To do a reset, we need to write to to the serdes registers. Unfortunately, 1117 + * To do a reset, we need to write to the serdes registers. Unfortunately, 1118 1118 * the fabric serdes download to the other HFI on the ASIC will have turned 1119 1119 * off the firmware validation on this HFI. This means we can't write to the 1120 1120 * registers to reset the serdes. Work around this by performing a complete
+1 -4
drivers/infiniband/hw/hfi1/ipoib_rx.c
··· 11 11 12 12 static void copy_ipoib_buf(struct sk_buff *skb, void *data, int size) 13 13 { 14 - void *dst_data; 15 - 16 14 skb_checksum_none_assert(skb); 17 15 skb->protocol = *((__be16 *)data); 18 16 19 - dst_data = skb_put(skb, size); 20 - memcpy(dst_data, data, size); 17 + skb_put_data(skb, data, size); 21 18 skb->mac_header = HFI1_IPOIB_PSEUDO_LEN; 22 19 skb_pull(skb, HFI1_IPOIB_ENCAP_LEN); 23 20 }
+2 -4
drivers/infiniband/hw/hfi1/verbs.c
··· 1447 1447 struct hfi1_ibdev *verbs_dev = dev_from_rdi(rdi); 1448 1448 struct hfi1_devdata *dd = dd_from_dev(verbs_dev); 1449 1449 struct hfi1_pportdata *ppd = &dd->pport[port_num - 1]; 1450 - int ret; 1451 1450 1452 1451 set_link_down_reason(ppd, OPA_LINKDOWN_REASON_UNKNOWN, 0, 1453 1452 OPA_LINKDOWN_REASON_UNKNOWN); 1454 - ret = set_link_state(ppd, HLS_DN_DOWNDEF); 1455 - return ret; 1453 + return set_link_state(ppd, HLS_DN_DOWNDEF); 1456 1454 } 1457 1455 1458 1456 static int hfi1_get_guid_be(struct rvt_dev_info *rdi, struct rvt_ibport *rvp, ··· 1799 1801 1800 1802 ib_set_device_ops(ibdev, &hfi1_dev_ops); 1801 1803 1802 - strlcpy(ibdev->node_desc, init_utsname()->nodename, 1804 + strscpy(ibdev->node_desc, init_utsname()->nodename, 1803 1805 sizeof(ibdev->node_desc)); 1804 1806 1805 1807 /*
-3
drivers/infiniband/hw/hfi1/verbs.h
··· 391 391 int hfi1_setup_wqe(struct rvt_qp *qp, struct rvt_swqe *wqe, 392 392 bool *call_send); 393 393 394 - extern const u32 rc_only_opcode; 395 - extern const u32 uc_only_opcode; 396 - 397 394 int hfi1_ruc_check_hdr(struct hfi1_ibport *ibp, struct hfi1_packet *packet); 398 395 399 396 u32 hfi1_make_grh(struct hfi1_ibport *ibp, struct ib_grh *hdr,
+1 -1
drivers/infiniband/hw/hns/Makefile
··· 10 10 hns_roce_cq.o hns_roce_alloc.o hns_roce_db.o hns_roce_srq.o hns_roce_restrack.o 11 11 12 12 ifdef CONFIG_INFINIBAND_HNS_HIP08 13 - hns-roce-hw-v2-objs := hns_roce_hw_v2.o hns_roce_hw_v2_dfx.o $(hns-roce-objs) 13 + hns-roce-hw-v2-objs := hns_roce_hw_v2.o $(hns-roce-objs) 14 14 obj-$(CONFIG_INFINIBAND_HNS) += hns-roce-hw-v2.o 15 15 endif
+3 -3
drivers/infiniband/hw/hns/hns_roce_cq.c
··· 454 454 hr_cq = xa_load(&hr_dev->cq_table.array, 455 455 cqn & (hr_dev->caps.num_cqs - 1)); 456 456 if (!hr_cq) { 457 - dev_warn(hr_dev->dev, "Completion event for bogus CQ 0x%06x\n", 457 + dev_warn(hr_dev->dev, "completion event for bogus CQ 0x%06x\n", 458 458 cqn); 459 459 return; 460 460 } ··· 475 475 hr_cq = xa_load(&hr_dev->cq_table.array, 476 476 cqn & (hr_dev->caps.num_cqs - 1)); 477 477 if (!hr_cq) { 478 - dev_warn(dev, "Async event for bogus CQ 0x%06x\n", cqn); 478 + dev_warn(dev, "async event for bogus CQ 0x%06x\n", cqn); 479 479 return; 480 480 } 481 481 482 482 if (event_type != HNS_ROCE_EVENT_TYPE_CQ_ID_INVALID && 483 483 event_type != HNS_ROCE_EVENT_TYPE_CQ_ACCESS_ERROR && 484 484 event_type != HNS_ROCE_EVENT_TYPE_CQ_OVERFLOW) { 485 - dev_err(dev, "Unexpected event type 0x%x on CQ 0x%06x\n", 485 + dev_err(dev, "unexpected event type 0x%x on CQ 0x%06x\n", 486 486 event_type, cqn); 487 487 return; 488 488 }
+12 -13
drivers/infiniband/hw/hns/hns_roce_device.h
··· 240 240 /* Single obj size */ 241 241 unsigned long obj_size; 242 242 unsigned long table_chunk_size; 243 - int lowmem; 244 243 struct mutex mutex; 245 244 struct hns_roce_hem **hem; 246 245 u64 **bt_l1; ··· 598 599 struct hns_roce_db rdb; 599 600 struct hns_roce_db sdb; 600 601 unsigned long en_flags; 601 - u32 doorbell_qpn; 602 602 enum ib_sig_type sq_signal_bits; 603 603 struct hns_roce_wq sq; 604 604 ··· 724 726 u32 max_sq_sg; 725 727 u32 max_sq_inline; 726 728 u32 max_rq_sg; 727 - u32 max_extend_sg; 729 + u32 rsv0; 728 730 u32 num_qps; 729 731 u32 num_pi_qps; 730 732 u32 reserved_qps; ··· 734 736 u32 max_srq_sges; 735 737 u32 max_sq_desc_sz; 736 738 u32 max_rq_desc_sz; 737 - u32 max_srq_desc_sz; 739 + u32 rsv2; 738 740 int max_qp_init_rdma; 739 741 int max_qp_dest_rdma; 740 742 u32 num_cqs; ··· 747 749 int num_comp_vectors; 748 750 int num_other_vectors; 749 751 u32 num_mtpts; 750 - u32 num_mtt_segs; 752 + u32 rsv1; 751 753 u32 num_srqwqe_segs; 752 754 u32 num_idx_segs; 753 755 int reserved_mrws; ··· 846 848 enum cong_type cong_type; 847 849 }; 848 850 849 - struct hns_roce_dfx_hw { 850 - int (*query_cqc_info)(struct hns_roce_dev *hr_dev, u32 cqn, 851 - int *buffer); 852 - }; 853 - 854 851 enum hns_roce_device_state { 855 852 HNS_ROCE_DEVICE_STATE_INITED, 856 853 HNS_ROCE_DEVICE_STATE_RST_DOWN, ··· 891 898 int (*init_eq)(struct hns_roce_dev *hr_dev); 892 899 void (*cleanup_eq)(struct hns_roce_dev *hr_dev); 893 900 int (*write_srqc)(struct hns_roce_srq *srq, void *mb_buf); 901 + int (*query_cqc)(struct hns_roce_dev *hr_dev, u32 cqn, void *buffer); 902 + int (*query_qpc)(struct hns_roce_dev *hr_dev, u32 qpn, void *buffer); 903 + int (*query_mpt)(struct hns_roce_dev *hr_dev, u32 key, void *buffer); 894 904 const struct ib_device_ops *hns_roce_dev_ops; 895 905 const struct ib_device_ops *hns_roce_dev_srq_ops; 896 906 }; ··· 955 959 void *priv; 956 960 struct workqueue_struct *irq_workq; 957 961 struct work_struct ecc_work; 958 - const struct hns_roce_dfx_hw *dfx; 959 962 u32 func_num; 960 963 u32 is_vf; 961 964 u32 cong_algo_tmpl_id; ··· 1222 1227 void hns_roce_handle_device_err(struct hns_roce_dev *hr_dev); 1223 1228 int hns_roce_init(struct hns_roce_dev *hr_dev); 1224 1229 void hns_roce_exit(struct hns_roce_dev *hr_dev); 1225 - int hns_roce_fill_res_cq_entry(struct sk_buff *msg, 1226 - struct ib_cq *ib_cq); 1230 + int hns_roce_fill_res_cq_entry(struct sk_buff *msg, struct ib_cq *ib_cq); 1231 + int hns_roce_fill_res_cq_entry_raw(struct sk_buff *msg, struct ib_cq *ib_cq); 1232 + int hns_roce_fill_res_qp_entry(struct sk_buff *msg, struct ib_qp *ib_qp); 1233 + int hns_roce_fill_res_qp_entry_raw(struct sk_buff *msg, struct ib_qp *ib_qp); 1234 + int hns_roce_fill_res_mr_entry(struct sk_buff *msg, struct ib_mr *ib_mr); 1235 + int hns_roce_fill_res_mr_entry_raw(struct sk_buff *msg, struct ib_mr *ib_mr); 1227 1236 struct hns_user_mmap_entry * 1228 1237 hns_roce_user_mmap_entry_insert(struct ib_ucontext *ucontext, u64 address, 1229 1238 size_t length,
+11 -22
drivers/infiniband/hw/hns/hns_roce_hem.c
··· 455 455 * alloc bt space chunk for MTT/CQE. 456 456 */ 457 457 size = table->type < HEM_TYPE_MTT ? mhop->buf_chunk_size : bt_size; 458 - flag = (table->lowmem ? GFP_KERNEL : GFP_HIGHUSER) | __GFP_NOWARN; 458 + flag = GFP_KERNEL | __GFP_NOWARN; 459 459 table->hem[index->buf] = hns_roce_alloc_hem(hr_dev, size >> PAGE_SHIFT, 460 460 size, flag); 461 461 if (!table->hem[index->buf]) { ··· 588 588 table->hem[i] = hns_roce_alloc_hem(hr_dev, 589 589 table->table_chunk_size >> PAGE_SHIFT, 590 590 table->table_chunk_size, 591 - (table->lowmem ? GFP_KERNEL : 592 - GFP_HIGHUSER) | __GFP_NOWARN); 591 + GFP_KERNEL | __GFP_NOWARN); 593 592 if (!table->hem[i]) { 594 593 ret = -ENOMEM; 595 594 goto out; ··· 724 725 int length; 725 726 int i, j; 726 727 727 - if (!table->lowmem) 728 - return NULL; 729 - 730 728 mutex_lock(&table->mutex); 731 729 732 730 if (!hns_roce_check_whether_mhop(hr_dev, table->type)) { ··· 779 783 780 784 int hns_roce_init_hem_table(struct hns_roce_dev *hr_dev, 781 785 struct hns_roce_hem_table *table, u32 type, 782 - unsigned long obj_size, unsigned long nobj, 783 - int use_lowmem) 786 + unsigned long obj_size, unsigned long nobj) 784 787 { 785 788 unsigned long obj_per_chunk; 786 789 unsigned long num_hem; ··· 856 861 table->type = type; 857 862 table->num_hem = num_hem; 858 863 table->obj_size = obj_size; 859 - table->lowmem = use_lowmem; 860 864 mutex_init(&table->mutex); 861 865 862 866 return 0; ··· 926 932 if (table->hem[i]) { 927 933 if (hr_dev->hw->clear_hem(hr_dev, table, 928 934 i * table->table_chunk_size / table->obj_size, 0)) 929 - dev_err(dev, "Clear HEM base address failed.\n"); 935 + dev_err(dev, "clear HEM base address failed.\n"); 930 936 931 937 hns_roce_free_hem(hr_dev, table->hem[i]); 932 938 } ··· 980 986 981 987 static struct hns_roce_hem_item * 982 988 hem_list_alloc_item(struct hns_roce_dev *hr_dev, int start, int end, int count, 983 - bool exist_bt, int bt_level) 989 + bool exist_bt) 984 990 { 985 991 struct hns_roce_hem_item *hem; 986 992 ··· 1189 1195 start_aligned = (distance / step) * step + r->offset; 1190 1196 end = min_t(int, start_aligned + step - 1, max_ofs); 1191 1197 cur = hem_list_alloc_item(hr_dev, start_aligned, end, unit, 1192 - true, level); 1198 + true); 1193 1199 if (!cur) { 1194 1200 ret = -ENOMEM; 1195 1201 goto err_exit; ··· 1241 1247 /* indicate to last region */ 1242 1248 r = &regions[region_cnt - 1]; 1243 1249 hem = hem_list_alloc_item(hr_dev, offset, r->offset + r->count - 1, 1244 - ba_num, true, 0); 1250 + ba_num, true); 1245 1251 if (!hem) 1246 1252 return ERR_PTR(-ENOMEM); 1247 1253 ··· 1258 1264 struct hns_roce_hem_item *hem; 1259 1265 1260 1266 hem = hem_list_alloc_item(hr_dev, r->offset, r->offset + r->count - 1, 1261 - r->count, false, 0); 1267 + r->count, false); 1262 1268 if (!hem) 1263 1269 return -ENOMEM; 1264 1270 ··· 1415 1421 &hem_list->btm_bt); 1416 1422 if (ret) { 1417 1423 dev_err(hr_dev->dev, 1418 - "alloc hem trunk fail ret=%d!\n", ret); 1424 + "alloc hem trunk fail ret = %d!\n", ret); 1419 1425 goto err_alloc; 1420 1426 } 1421 1427 } ··· 1424 1430 ret = hem_list_alloc_root_bt(hr_dev, hem_list, unit, regions, 1425 1431 region_cnt); 1426 1432 if (ret) 1427 - dev_err(hr_dev->dev, "alloc hem root fail ret=%d!\n", ret); 1433 + dev_err(hr_dev->dev, "alloc hem root fail ret = %d!\n", ret); 1428 1434 else 1429 1435 return 0; 1430 1436 ··· 1462 1468 1463 1469 void *hns_roce_hem_list_find_mtt(struct hns_roce_dev *hr_dev, 1464 1470 struct hns_roce_hem_list *hem_list, 1465 - int offset, int *mtt_cnt, u64 *phy_addr) 1471 + int offset, int *mtt_cnt) 1466 1472 { 1467 1473 struct list_head *head = &hem_list->btm_bt; 1468 1474 struct hns_roce_hem_item *hem, *temp_hem; 1469 1475 void *cpu_base = NULL; 1470 - u64 phy_base = 0; 1471 1476 int nr = 0; 1472 1477 1473 1478 list_for_each_entry_safe(hem, temp_hem, head, sibling) { 1474 1479 if (hem_list_page_is_in_range(hem, offset)) { 1475 1480 nr = offset - hem->start; 1476 1481 cpu_base = hem->addr + nr * BA_BYTE_LEN; 1477 - phy_base = hem->dma_addr + nr * BA_BYTE_LEN; 1478 1482 nr = hem->end + 1 - offset; 1479 1483 break; 1480 1484 } ··· 1480 1488 1481 1489 if (mtt_cnt) 1482 1490 *mtt_cnt = nr; 1483 - 1484 - if (phy_addr) 1485 - *phy_addr = phy_base; 1486 1491 1487 1492 return cpu_base; 1488 1493 }
+2 -3
drivers/infiniband/hw/hns/hns_roce_hem.h
··· 111 111 dma_addr_t *dma_handle); 112 112 int hns_roce_init_hem_table(struct hns_roce_dev *hr_dev, 113 113 struct hns_roce_hem_table *table, u32 type, 114 - unsigned long obj_size, unsigned long nobj, 115 - int use_lowmem); 114 + unsigned long obj_size, unsigned long nobj); 116 115 void hns_roce_cleanup_hem_table(struct hns_roce_dev *hr_dev, 117 116 struct hns_roce_hem_table *table); 118 117 void hns_roce_cleanup_hem(struct hns_roce_dev *hr_dev); ··· 131 132 struct hns_roce_hem_list *hem_list); 132 133 void *hns_roce_hem_list_find_mtt(struct hns_roce_dev *hr_dev, 133 134 struct hns_roce_hem_list *hem_list, 134 - int offset, int *mtt_cnt, u64 *phy_addr); 135 + int offset, int *mtt_cnt); 135 136 136 137 static inline void hns_roce_hem_first(struct hns_roce_hem *hem, 137 138 struct hns_roce_hem_iter *iter)
+106 -58
drivers/infiniband/hw/hns/hns_roce_hw_v2.c
··· 193 193 unsigned int *sge_idx, u32 msg_len) 194 194 { 195 195 struct ib_device *ibdev = &(to_hr_dev(qp->ibqp.device))->ib_dev; 196 - unsigned int dseg_len = sizeof(struct hns_roce_v2_wqe_data_seg); 197 - unsigned int ext_sge_sz = qp->sq.max_gs * dseg_len; 196 + unsigned int ext_sge_sz = qp->sq.max_gs * HNS_ROCE_SGE_SIZE; 198 197 unsigned int left_len_in_pg; 199 198 unsigned int idx = *sge_idx; 200 199 unsigned int i = 0; ··· 221 222 if (len <= left_len_in_pg) { 222 223 memcpy(dseg, addr, len); 223 224 224 - idx += len / dseg_len; 225 + idx += len / HNS_ROCE_SGE_SIZE; 225 226 226 227 i++; 227 228 if (i >= wr->num_sge) ··· 236 237 237 238 len -= left_len_in_pg; 238 239 addr += left_len_in_pg; 239 - idx += left_len_in_pg / dseg_len; 240 + idx += left_len_in_pg / HNS_ROCE_SGE_SIZE; 240 241 dseg = hns_roce_get_extend_sge(qp, 241 242 idx & (qp->sge.sge_cnt - 1)); 242 243 left_len_in_pg = 1 << HNS_HW_PAGE_SHIFT; ··· 380 381 if (unlikely(ibqp->qp_type != IB_QPT_RC && 381 382 ibqp->qp_type != IB_QPT_GSI && 382 383 ibqp->qp_type != IB_QPT_UD)) { 383 - ibdev_err(ibdev, "Not supported QP(0x%x)type!\n", 384 + ibdev_err(ibdev, "not supported QP(0x%x)type!\n", 384 385 ibqp->qp_type); 385 386 return -EOPNOTSUPP; 386 387 } else if (unlikely(hr_qp->state == IB_QPS_RESET || ··· 636 637 } else { 637 638 struct hns_roce_v2_db sq_db = {}; 638 639 639 - hr_reg_write(&sq_db, DB_TAG, qp->doorbell_qpn); 640 + hr_reg_write(&sq_db, DB_TAG, qp->qpn); 640 641 hr_reg_write(&sq_db, DB_CMD, HNS_ROCE_V2_SQ_DB); 641 642 hr_reg_write(&sq_db, DB_PI, qp->sq.head); 642 643 hr_reg_write(&sq_db, DB_SL, qp->sl); ··· 1405 1406 hr_dev->dis_db = true; 1406 1407 1407 1408 dev_warn(hr_dev->dev, 1408 - "Func clear is pending, device in resetting state.\n"); 1409 + "func clear is pending, device in resetting state.\n"); 1409 1410 end = HNS_ROCE_V2_HW_RST_TIMEOUT; 1410 1411 while (end) { 1411 1412 if (!ops->get_hw_reset_stat(handle)) { 1412 1413 hr_dev->is_reset = true; 1413 1414 dev_info(hr_dev->dev, 1414 - "Func clear success after reset.\n"); 1415 + "func clear success after reset.\n"); 1415 1416 return; 1416 1417 } 1417 1418 msleep(HNS_ROCE_V2_HW_RST_COMPLETION_WAIT); 1418 1419 end -= HNS_ROCE_V2_HW_RST_COMPLETION_WAIT; 1419 1420 } 1420 1421 1421 - dev_warn(hr_dev->dev, "Func clear failed.\n"); 1422 + dev_warn(hr_dev->dev, "func clear failed.\n"); 1422 1423 } 1423 1424 1424 1425 static void func_clr_sw_resetting_state(struct hns_roce_dev *hr_dev, ··· 1430 1431 hr_dev->dis_db = true; 1431 1432 1432 1433 dev_warn(hr_dev->dev, 1433 - "Func clear is pending, device in resetting state.\n"); 1434 + "func clear is pending, device in resetting state.\n"); 1434 1435 end = HNS_ROCE_V2_HW_RST_TIMEOUT; 1435 1436 while (end) { 1436 1437 if (ops->ae_dev_reset_cnt(handle) != 1437 1438 hr_dev->reset_cnt) { 1438 1439 hr_dev->is_reset = true; 1439 1440 dev_info(hr_dev->dev, 1440 - "Func clear success after sw reset\n"); 1441 + "func clear success after sw reset\n"); 1441 1442 return; 1442 1443 } 1443 1444 msleep(HNS_ROCE_V2_HW_RST_COMPLETION_WAIT); 1444 1445 end -= HNS_ROCE_V2_HW_RST_COMPLETION_WAIT; 1445 1446 } 1446 1447 1447 - dev_warn(hr_dev->dev, "Func clear failed because of unfinished sw reset\n"); 1448 + dev_warn(hr_dev->dev, "func clear failed because of unfinished sw reset\n"); 1448 1449 } 1449 1450 1450 1451 static void hns_roce_func_clr_rst_proc(struct hns_roce_dev *hr_dev, int retval, ··· 1457 1458 if (ops->ae_dev_reset_cnt(handle) != hr_dev->reset_cnt) { 1458 1459 hr_dev->dis_db = true; 1459 1460 hr_dev->is_reset = true; 1460 - dev_info(hr_dev->dev, "Func clear success after reset.\n"); 1461 + dev_info(hr_dev->dev, "func clear success after reset.\n"); 1461 1462 return; 1462 1463 } 1463 1464 ··· 1474 1475 1475 1476 if (retval && !flag) 1476 1477 dev_warn(hr_dev->dev, 1477 - "Func clear read failed, ret = %d.\n", retval); 1478 + "func clear read failed, ret = %d.\n", retval); 1478 1479 1479 - dev_warn(hr_dev->dev, "Func clear failed.\n"); 1480 + dev_warn(hr_dev->dev, "func clear failed.\n"); 1480 1481 } 1481 1482 1482 1483 static void __hns_roce_function_clear(struct hns_roce_dev *hr_dev, int vf_id) ··· 1497 1498 ret = hns_roce_cmq_send(hr_dev, &desc, 1); 1498 1499 if (ret) { 1499 1500 fclr_write_fail_flag = true; 1500 - dev_err(hr_dev->dev, "Func clear write failed, ret = %d.\n", 1501 + dev_err(hr_dev->dev, "func clear write failed, ret = %d.\n", 1501 1502 ret); 1502 1503 goto out; 1503 1504 } ··· 1965 1966 caps->min_cqes = HNS_ROCE_MIN_CQE_NUM; 1966 1967 caps->max_cqes = HNS_ROCE_V2_MAX_CQE_NUM; 1967 1968 caps->max_sq_sg = HNS_ROCE_V2_MAX_SQ_SGE_NUM; 1968 - caps->max_extend_sg = HNS_ROCE_V2_MAX_EXTEND_SGE_NUM; 1969 1969 caps->max_rq_sg = HNS_ROCE_V2_MAX_RQ_SGE_NUM; 1970 1970 1971 1971 caps->num_uars = HNS_ROCE_V2_UAR_NUM; ··· 1982 1984 caps->max_qp_dest_rdma = HNS_ROCE_V2_MAX_QP_DEST_RDMA; 1983 1985 caps->max_sq_desc_sz = HNS_ROCE_V2_MAX_SQ_DESC_SZ; 1984 1986 caps->max_rq_desc_sz = HNS_ROCE_V2_MAX_RQ_DESC_SZ; 1985 - caps->max_srq_desc_sz = HNS_ROCE_V2_MAX_SRQ_DESC_SZ; 1986 1987 caps->irrl_entry_sz = HNS_ROCE_V2_IRRL_ENTRY_SZ; 1987 1988 caps->trrl_entry_sz = HNS_ROCE_V2_EXT_ATOMIC_TRRL_ENTRY_SZ; 1988 1989 caps->cqc_entry_sz = HNS_ROCE_V2_CQC_ENTRY_SZ; ··· 2182 2185 caps->num_xrcds = HNS_ROCE_V2_MAX_XRCD_NUM; 2183 2186 caps->reserved_xrcds = HNS_ROCE_V2_RSV_XRCD_NUM; 2184 2187 2185 - caps->num_mtt_segs = HNS_ROCE_V2_MAX_MTT_SEGS; 2186 2188 caps->num_srqwqe_segs = HNS_ROCE_V2_MAX_SRQWQE_SEGS; 2187 2189 caps->num_idx_segs = HNS_ROCE_V2_MAX_IDX_SEGS; 2188 2190 2189 2191 if (!caps->num_comp_vectors) 2190 - caps->num_comp_vectors = min_t(u32, caps->eqc_bt_num - 1, 2191 - (u32)priv->handle->rinfo.num_vectors - 2); 2192 + caps->num_comp_vectors = 2193 + min_t(u32, caps->eqc_bt_num - HNS_ROCE_V2_AEQE_VEC_NUM, 2194 + (u32)priv->handle->rinfo.num_vectors - 2195 + (HNS_ROCE_V2_AEQE_VEC_NUM + HNS_ROCE_V2_ABNORMAL_VEC_NUM)); 2192 2196 2193 2197 if (hr_dev->pci_dev->revision >= PCI_REVISION_ID_HIP09) { 2194 2198 caps->eqe_hop_num = HNS_ROCE_V3_EQE_HOP_NUM; ··· 2270 2272 caps->max_sq_inline = le16_to_cpu(resp_a->max_sq_inline); 2271 2273 caps->max_rq_sg = le16_to_cpu(resp_a->max_rq_sg); 2272 2274 caps->max_rq_sg = roundup_pow_of_two(caps->max_rq_sg); 2273 - caps->max_extend_sg = le32_to_cpu(resp_a->max_extend_sg); 2274 2275 caps->max_srq_sges = le16_to_cpu(resp_a->max_srq_sges); 2275 2276 caps->max_srq_sges = roundup_pow_of_two(caps->max_srq_sges); 2276 2277 caps->num_aeq_vectors = resp_a->num_aeq_vectors; 2277 2278 caps->num_other_vectors = resp_a->num_other_vectors; 2278 2279 caps->max_sq_desc_sz = resp_a->max_sq_desc_sz; 2279 2280 caps->max_rq_desc_sz = resp_a->max_rq_desc_sz; 2280 - caps->max_srq_desc_sz = resp_a->max_srq_desc_sz; 2281 2281 caps->cqe_sz = resp_a->cqe_sz; 2282 2282 2283 2283 caps->mtpt_entry_sz = resp_b->mtpt_entry_sz; ··· 4295 4299 4296 4300 static void modify_qp_reset_to_init(struct ib_qp *ibqp, 4297 4301 const struct ib_qp_attr *attr, 4298 - int attr_mask, 4299 4302 struct hns_roce_v2_qp_context *context, 4300 4303 struct hns_roce_v2_qp_context *qpc_mask) 4301 4304 { ··· 4358 4363 } 4359 4364 4360 4365 static void modify_qp_init_to_init(struct ib_qp *ibqp, 4361 - const struct ib_qp_attr *attr, int attr_mask, 4366 + const struct ib_qp_attr *attr, 4362 4367 struct hns_roce_v2_qp_context *context, 4363 4368 struct hns_roce_v2_qp_context *qpc_mask) 4364 4369 { ··· 4607 4612 hr_reg_clear(qpc_mask, QPC_DQPN); 4608 4613 } 4609 4614 4610 - memcpy(&(context->dmac), dmac, sizeof(u32)); 4615 + memcpy(&context->dmac, dmac, sizeof(u32)); 4611 4616 hr_reg_write(context, QPC_DMAC_H, *((u16 *)(&dmac[4]))); 4612 4617 qpc_mask->dmac = 0; 4613 4618 hr_reg_clear(qpc_mask, QPC_DMAC_H); ··· 5009 5014 5010 5015 if (cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT) { 5011 5016 memset(qpc_mask, 0, hr_dev->caps.qpc_sz); 5012 - modify_qp_reset_to_init(ibqp, attr, attr_mask, context, 5013 - qpc_mask); 5017 + modify_qp_reset_to_init(ibqp, attr, context, qpc_mask); 5014 5018 } else if (cur_state == IB_QPS_INIT && new_state == IB_QPS_INIT) { 5015 - modify_qp_init_to_init(ibqp, attr, attr_mask, context, 5016 - qpc_mask); 5019 + modify_qp_init_to_init(ibqp, attr, context, qpc_mask); 5017 5020 } else if (cur_state == IB_QPS_INIT && new_state == IB_QPS_RTR) { 5018 5021 ret = modify_qp_init_to_rtr(ibqp, attr, attr_mask, context, 5019 5022 qpc_mask); ··· 5032 5039 if (hr_dev->pci_dev->revision == PCI_REVISION_ID_HIP08) { 5033 5040 if (*timeout > QP_ACK_TIMEOUT_MAX_HIP08) { 5034 5041 ibdev_warn(&hr_dev->ib_dev, 5035 - "Local ACK timeout shall be 0 to 20.\n"); 5042 + "local ACK timeout shall be 0 to 20.\n"); 5036 5043 return false; 5037 5044 } 5038 5045 *timeout += QP_ACK_TIMEOUT_OFFSET; 5039 5046 } else if (hr_dev->pci_dev->revision > PCI_REVISION_ID_HIP08) { 5040 5047 if (*timeout > QP_ACK_TIMEOUT_MAX) { 5041 5048 ibdev_warn(&hr_dev->ib_dev, 5042 - "Local ACK timeout shall be 0 to 31.\n"); 5049 + "local ACK timeout shall be 0 to 31.\n"); 5043 5050 return false; 5044 5051 } 5045 5052 } ··· 5299 5306 return (state < ARRAY_SIZE(map)) ? map[state] : -1; 5300 5307 } 5301 5308 5302 - static int hns_roce_v2_query_qpc(struct hns_roce_dev *hr_dev, 5303 - struct hns_roce_qp *hr_qp, 5304 - struct hns_roce_v2_qp_context *hr_context) 5309 + static int hns_roce_v2_query_qpc(struct hns_roce_dev *hr_dev, u32 qpn, 5310 + void *buffer) 5305 5311 { 5306 5312 struct hns_roce_cmd_mailbox *mailbox; 5307 5313 int ret; ··· 5310 5318 return PTR_ERR(mailbox); 5311 5319 5312 5320 ret = hns_roce_cmd_mbox(hr_dev, 0, mailbox->dma, HNS_ROCE_CMD_QUERY_QPC, 5313 - hr_qp->qpn); 5321 + qpn); 5314 5322 if (ret) 5315 5323 goto out; 5316 5324 5317 - memcpy(hr_context, mailbox->buf, hr_dev->caps.qpc_sz); 5325 + memcpy(buffer, mailbox->buf, hr_dev->caps.qpc_sz); 5318 5326 5319 5327 out: 5320 5328 hns_roce_free_cmd_mailbox(hr_dev, mailbox); ··· 5344 5352 goto done; 5345 5353 } 5346 5354 5347 - ret = hns_roce_v2_query_qpc(hr_dev, hr_qp, &context); 5355 + ret = hns_roce_v2_query_qpc(hr_dev, hr_qp->qpn, &context); 5348 5356 if (ret) { 5349 5357 ibdev_err(ibdev, "failed to query QPC, ret = %d.\n", ret); 5350 5358 ret = -EINVAL; ··· 5542 5550 msleep(20); 5543 5551 } 5544 5552 5545 - ibdev_err(ibdev, "Query SCC clr done flag overtime.\n"); 5553 + ibdev_err(ibdev, "query SCC clr done flag overtime.\n"); 5546 5554 ret = -ETIMEDOUT; 5547 5555 5548 5556 out: ··· 5765 5773 return ret; 5766 5774 } 5767 5775 5776 + static int hns_roce_v2_query_cqc(struct hns_roce_dev *hr_dev, u32 cqn, 5777 + void *buffer) 5778 + { 5779 + struct hns_roce_v2_cq_context *context; 5780 + struct hns_roce_cmd_mailbox *mailbox; 5781 + int ret; 5782 + 5783 + mailbox = hns_roce_alloc_cmd_mailbox(hr_dev); 5784 + if (IS_ERR(mailbox)) 5785 + return PTR_ERR(mailbox); 5786 + 5787 + context = mailbox->buf; 5788 + ret = hns_roce_cmd_mbox(hr_dev, 0, mailbox->dma, 5789 + HNS_ROCE_CMD_QUERY_CQC, cqn); 5790 + if (ret) { 5791 + ibdev_err(&hr_dev->ib_dev, 5792 + "failed to process cmd when querying CQ, ret = %d.\n", 5793 + ret); 5794 + goto err_mailbox; 5795 + } 5796 + 5797 + memcpy(buffer, context, sizeof(*context)); 5798 + 5799 + err_mailbox: 5800 + hns_roce_free_cmd_mailbox(hr_dev, mailbox); 5801 + 5802 + return ret; 5803 + } 5804 + 5805 + static int hns_roce_v2_query_mpt(struct hns_roce_dev *hr_dev, u32 key, 5806 + void *buffer) 5807 + { 5808 + struct hns_roce_v2_mpt_entry *context; 5809 + struct hns_roce_cmd_mailbox *mailbox; 5810 + int ret; 5811 + 5812 + mailbox = hns_roce_alloc_cmd_mailbox(hr_dev); 5813 + if (IS_ERR(mailbox)) 5814 + return PTR_ERR(mailbox); 5815 + 5816 + context = mailbox->buf; 5817 + ret = hns_roce_cmd_mbox(hr_dev, 0, mailbox->dma, HNS_ROCE_CMD_QUERY_MPT, 5818 + key_to_hw_index(key)); 5819 + if (ret) { 5820 + ibdev_err(&hr_dev->ib_dev, 5821 + "failed to process cmd when querying MPT, ret = %d.\n", 5822 + ret); 5823 + goto err_mailbox; 5824 + } 5825 + 5826 + memcpy(buffer, context, sizeof(*context)); 5827 + 5828 + err_mailbox: 5829 + hns_roce_free_cmd_mailbox(hr_dev, mailbox); 5830 + 5831 + return ret; 5832 + } 5833 + 5768 5834 static void hns_roce_irq_work_handle(struct work_struct *work) 5769 5835 { 5770 5836 struct hns_roce_work *irq_work = ··· 5831 5781 5832 5782 switch (irq_work->event_type) { 5833 5783 case HNS_ROCE_EVENT_TYPE_PATH_MIG: 5834 - ibdev_info(ibdev, "Path migrated succeeded.\n"); 5784 + ibdev_info(ibdev, "path migrated succeeded.\n"); 5835 5785 break; 5836 5786 case HNS_ROCE_EVENT_TYPE_PATH_MIG_FAILED: 5837 - ibdev_warn(ibdev, "Path migration failed.\n"); 5787 + ibdev_warn(ibdev, "path migration failed.\n"); 5838 5788 break; 5839 5789 case HNS_ROCE_EVENT_TYPE_COMM_EST: 5840 5790 break; 5841 5791 case HNS_ROCE_EVENT_TYPE_SQ_DRAINED: 5842 - ibdev_warn(ibdev, "Send queue drained.\n"); 5792 + ibdev_warn(ibdev, "send queue drained.\n"); 5843 5793 break; 5844 5794 case HNS_ROCE_EVENT_TYPE_WQ_CATAS_ERROR: 5845 - ibdev_err(ibdev, "Local work queue 0x%x catast error, sub_event type is: %d\n", 5795 + ibdev_err(ibdev, "local work queue 0x%x catast error, sub_event type is: %d\n", 5846 5796 irq_work->queue_num, irq_work->sub_type); 5847 5797 break; 5848 5798 case HNS_ROCE_EVENT_TYPE_INV_REQ_LOCAL_WQ_ERROR: 5849 - ibdev_err(ibdev, "Invalid request local work queue 0x%x error.\n", 5799 + ibdev_err(ibdev, "invalid request local work queue 0x%x error.\n", 5850 5800 irq_work->queue_num); 5851 5801 break; 5852 5802 case HNS_ROCE_EVENT_TYPE_LOCAL_WQ_ACCESS_ERROR: 5853 - ibdev_err(ibdev, "Local access violation work queue 0x%x error, sub_event type is: %d\n", 5803 + ibdev_err(ibdev, "local access violation work queue 0x%x error, sub_event type is: %d\n", 5854 5804 irq_work->queue_num, irq_work->sub_type); 5855 5805 break; 5856 5806 case HNS_ROCE_EVENT_TYPE_SRQ_LIMIT_REACH: ··· 5872 5822 ibdev_warn(ibdev, "DB overflow.\n"); 5873 5823 break; 5874 5824 case HNS_ROCE_EVENT_TYPE_FLR: 5875 - ibdev_warn(ibdev, "Function level reset.\n"); 5825 + ibdev_warn(ibdev, "function level reset.\n"); 5876 5826 break; 5877 5827 case HNS_ROCE_EVENT_TYPE_XRCD_VIOLATION: 5878 5828 ibdev_err(ibdev, "xrc domain violation error.\n"); ··· 5896 5846 if (!irq_work) 5897 5847 return; 5898 5848 5899 - INIT_WORK(&(irq_work->work), hns_roce_irq_work_handle); 5849 + INIT_WORK(&irq_work->work, hns_roce_irq_work_handle); 5900 5850 irq_work->hr_dev = hr_dev; 5901 5851 irq_work->event_type = eq->event_type; 5902 5852 irq_work->sub_type = eq->sub_type; 5903 5853 irq_work->queue_num = queue_num; 5904 - queue_work(hr_dev->irq_workq, &(irq_work->work)); 5854 + queue_work(hr_dev->irq_workq, &irq_work->work); 5905 5855 } 5906 5856 5907 5857 static void update_eq_db(struct hns_roce_eq *eq) ··· 5991 5941 case HNS_ROCE_EVENT_TYPE_FLR: 5992 5942 break; 5993 5943 default: 5994 - dev_err(dev, "Unhandled event %d on EQ %d at idx %u.\n", 5944 + dev_err(dev, "unhandled event %d on EQ %d at idx %u.\n", 5995 5945 event_type, eq->eqn, eq->cons_index); 5996 5946 break; 5997 5947 } ··· 6061 6011 /* Completion event interrupt */ 6062 6012 int_work = hns_roce_v2_ceq_int(hr_dev, eq); 6063 6013 else 6064 - /* Asychronous event interrupt */ 6014 + /* Asynchronous event interrupt */ 6065 6015 int_work = hns_roce_v2_aeq_int(hr_dev, eq); 6066 6016 6067 6017 return IRQ_RETVAL(int_work); ··· 6382 6332 hr_dev->caps.eqe_ba_pg_sz + PAGE_SHIFT, NULL, 6383 6333 0); 6384 6334 if (err) 6385 - dev_err(hr_dev->dev, "Failed to alloc EQE mtr, err %d\n", err); 6335 + dev_err(hr_dev->dev, "failed to alloc EQE mtr, err %d\n", err); 6386 6336 6387 6337 return err; 6388 6338 } ··· 6471 6421 0, hr_dev->irq_names[j - comp_num], 6472 6422 &eq_table->eq[j - other_num]); 6473 6423 if (ret) { 6474 - dev_err(hr_dev->dev, "Request irq error!\n"); 6424 + dev_err(hr_dev->dev, "request irq error!\n"); 6475 6425 goto err_request_failed; 6476 6426 } 6477 6427 } ··· 6624 6574 kfree(eq_table->eq); 6625 6575 } 6626 6576 6627 - static const struct hns_roce_dfx_hw hns_roce_dfx_hw_v2 = { 6628 - .query_cqc_info = hns_roce_v2_query_cqc_info, 6629 - }; 6630 - 6631 6577 static const struct ib_device_ops hns_roce_v2_dev_ops = { 6632 6578 .destroy_qp = hns_roce_v2_destroy_qp, 6633 6579 .modify_cq = hns_roce_v2_modify_cq, ··· 6664 6618 .init_eq = hns_roce_v2_init_eq_table, 6665 6619 .cleanup_eq = hns_roce_v2_cleanup_eq_table, 6666 6620 .write_srqc = hns_roce_v2_write_srqc, 6621 + .query_cqc = hns_roce_v2_query_cqc, 6622 + .query_qpc = hns_roce_v2_query_qpc, 6623 + .query_mpt = hns_roce_v2_query_mpt, 6667 6624 .hns_roce_dev_ops = &hns_roce_v2_dev_ops, 6668 6625 .hns_roce_dev_srq_ops = &hns_roce_v2_dev_srq_ops, 6669 6626 }; ··· 6698 6649 hr_dev->is_vf = id->driver_data; 6699 6650 hr_dev->dev = &handle->pdev->dev; 6700 6651 hr_dev->hw = &hns_roce_hw_v2; 6701 - hr_dev->dfx = &hns_roce_dfx_hw_v2; 6702 6652 hr_dev->sdb_offset = ROCEE_DB_SQ_L_0_REG; 6703 6653 hr_dev->odb_offset = hr_dev->sdb_offset; 6704 6654 ··· 6893 6845 dev_err(dev, "In reset process RoCE reinit failed %d.\n", ret); 6894 6846 } else { 6895 6847 handle->rinfo.reset_state = HNS_ROCE_STATE_RST_INITED; 6896 - dev_info(dev, "Reset done, RoCE client reinit finished.\n"); 6848 + dev_info(dev, "reset done, RoCE client reinit finished.\n"); 6897 6849 } 6898 6850 6899 6851 return ret;
+5 -9
drivers/infiniband/hw/hns/hns_roce_hw_v2.h
··· 46 46 #define HNS_ROCE_V2_MAX_CQE_NUM 0x400000 47 47 #define HNS_ROCE_V2_MAX_RQ_SGE_NUM 64 48 48 #define HNS_ROCE_V2_MAX_SQ_SGE_NUM 64 49 - #define HNS_ROCE_V2_MAX_EXTEND_SGE_NUM 0x200000 50 49 #define HNS_ROCE_V2_MAX_SQ_INLINE 0x20 51 50 #define HNS_ROCE_V3_MAX_SQ_INLINE 0x400 52 51 #define HNS_ROCE_V2_MAX_RC_INL_INN_SZ 32 ··· 54 55 #define HNS_ROCE_V2_AEQE_VEC_NUM 1 55 56 #define HNS_ROCE_V2_ABNORMAL_VEC_NUM 1 56 57 #define HNS_ROCE_V2_MAX_MTPT_NUM 0x100000 57 - #define HNS_ROCE_V2_MAX_MTT_SEGS 0x1000000 58 58 #define HNS_ROCE_V2_MAX_SRQWQE_SEGS 0x1000000 59 59 #define HNS_ROCE_V2_MAX_IDX_SEGS 0x1000000 60 60 #define HNS_ROCE_V2_MAX_PD_NUM 0x1000000 ··· 63 65 #define HNS_ROCE_V2_MAX_QP_DEST_RDMA 128 64 66 #define HNS_ROCE_V2_MAX_SQ_DESC_SZ 64 65 67 #define HNS_ROCE_V2_MAX_RQ_DESC_SZ 16 66 - #define HNS_ROCE_V2_MAX_SRQ_DESC_SZ 64 67 68 #define HNS_ROCE_V2_IRRL_ENTRY_SZ 64 68 69 #define HNS_ROCE_V2_EXT_ATOMIC_TRRL_ENTRY_SZ 100 69 70 #define HNS_ROCE_V2_CQC_ENTRY_SZ 64 ··· 403 406 struct hns_roce_v2_qp_context_ex { 404 407 __le32 data[64]; 405 408 }; 409 + 406 410 struct hns_roce_v2_qp_context { 407 411 __le32 byte_4_sqpn_tst; 408 412 __le32 wqe_sge_ba; ··· 756 758 #define MPT_INNER_PA_VLD MPT_FIELD_LOC(71, 71) 757 759 #define MPT_MW_BIND_QPN MPT_FIELD_LOC(95, 72) 758 760 #define MPT_BOUND_LKEY MPT_FIELD_LOC(127, 96) 759 - #define MPT_LEN MPT_FIELD_LOC(191, 128) 761 + #define MPT_LEN_L MPT_FIELD_LOC(159, 128) 762 + #define MPT_LEN_H MPT_FIELD_LOC(191, 160) 760 763 #define MPT_LKEY MPT_FIELD_LOC(223, 192) 761 764 #define MPT_VA MPT_FIELD_LOC(287, 224) 762 765 #define MPT_PBL_SIZE MPT_FIELD_LOC(319, 288) ··· 1172 1173 __le16 max_sq_sg; 1173 1174 __le16 max_sq_inline; 1174 1175 __le16 max_rq_sg; 1175 - __le32 max_extend_sg; 1176 + __le32 rsv0; 1176 1177 __le16 num_qpc_timer; 1177 1178 __le16 num_cqc_timer; 1178 1179 __le16 max_srq_sges; ··· 1180 1181 u8 num_other_vectors; 1181 1182 u8 max_sq_desc_sz; 1182 1183 u8 max_rq_desc_sz; 1183 - u8 max_srq_desc_sz; 1184 + u8 rsv1; 1184 1185 u8 cqe_sz; 1185 1186 }; 1186 1187 ··· 1460 1461 __le32 clr_done; 1461 1462 __le32 rsv[5]; 1462 1463 }; 1463 - 1464 - int hns_roce_v2_query_cqc_info(struct hns_roce_dev *hr_dev, u32 cqn, 1465 - int *buffer); 1466 1464 1467 1465 static inline void hns_roce_write64(struct hns_roce_dev *hr_dev, __le32 val[2], 1468 1466 void __iomem *dest)
-34
drivers/infiniband/hw/hns/hns_roce_hw_v2_dfx.c
··· 1 - // SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 - // Copyright (c) 2019 Hisilicon Limited. 3 - 4 - #include "hnae3.h" 5 - #include "hns_roce_device.h" 6 - #include "hns_roce_cmd.h" 7 - #include "hns_roce_hw_v2.h" 8 - 9 - int hns_roce_v2_query_cqc_info(struct hns_roce_dev *hr_dev, u32 cqn, 10 - int *buffer) 11 - { 12 - struct hns_roce_v2_cq_context *cq_context; 13 - struct hns_roce_cmd_mailbox *mailbox; 14 - int ret; 15 - 16 - mailbox = hns_roce_alloc_cmd_mailbox(hr_dev); 17 - if (IS_ERR(mailbox)) 18 - return PTR_ERR(mailbox); 19 - 20 - cq_context = mailbox->buf; 21 - ret = hns_roce_cmd_mbox(hr_dev, 0, mailbox->dma, HNS_ROCE_CMD_QUERY_CQC, 22 - cqn); 23 - if (ret) { 24 - dev_err(hr_dev->dev, "QUERY cqc cmd process error\n"); 25 - goto err_mailbox; 26 - } 27 - 28 - memcpy(buffer, cq_context, sizeof(*cq_context)); 29 - 30 - err_mailbox: 31 - hns_roce_free_cmd_mailbox(hr_dev, mailbox); 32 - 33 - return ret; 34 - }
+36 -28
drivers/infiniband/hw/hns/hns_roce_main.c
··· 97 97 98 98 netdev = hr_dev->iboe.netdevs[port]; 99 99 if (!netdev) { 100 - dev_err(dev, "Can't find netdev on port(%u)!\n", port); 100 + dev_err(dev, "can't find netdev on port(%u)!\n", port); 101 101 return -ENODEV; 102 102 } 103 103 ··· 239 239 net_dev = hr_dev->iboe.netdevs[port]; 240 240 if (!net_dev) { 241 241 spin_unlock_irqrestore(&hr_dev->iboe.lock, flags); 242 - dev_err(dev, "Find netdev %u failed!\n", port); 242 + dev_err(dev, "find netdev %u failed!\n", port); 243 243 return -EINVAL; 244 244 } 245 245 ··· 515 515 .destroy_ah = hns_roce_destroy_ah, 516 516 .destroy_cq = hns_roce_destroy_cq, 517 517 .disassociate_ucontext = hns_roce_disassociate_ucontext, 518 - .fill_res_cq_entry = hns_roce_fill_res_cq_entry, 519 518 .get_dma_mr = hns_roce_get_dma_mr, 520 519 .get_link_layer = hns_roce_get_link_layer, 521 520 .get_port_immutable = hns_roce_port_immutable, ··· 565 566 INIT_RDMA_OBJ_SIZE(ib_xrcd, hns_roce_xrcd, ibxrcd), 566 567 }; 567 568 569 + static const struct ib_device_ops hns_roce_dev_restrack_ops = { 570 + .fill_res_cq_entry = hns_roce_fill_res_cq_entry, 571 + .fill_res_cq_entry_raw = hns_roce_fill_res_cq_entry_raw, 572 + .fill_res_qp_entry = hns_roce_fill_res_qp_entry, 573 + .fill_res_qp_entry_raw = hns_roce_fill_res_qp_entry_raw, 574 + .fill_res_mr_entry = hns_roce_fill_res_mr_entry, 575 + .fill_res_mr_entry_raw = hns_roce_fill_res_mr_entry_raw, 576 + }; 577 + 568 578 static int hns_roce_register_device(struct hns_roce_dev *hr_dev) 569 579 { 570 580 int ret; ··· 613 605 614 606 ib_set_device_ops(ib_dev, hr_dev->hw->hns_roce_dev_ops); 615 607 ib_set_device_ops(ib_dev, &hns_roce_dev_ops); 608 + ib_set_device_ops(ib_dev, &hns_roce_dev_restrack_ops); 616 609 for (i = 0; i < hr_dev->caps.num_ports; i++) { 617 610 if (!hr_dev->iboe.netdevs[i]) 618 611 continue; ··· 659 650 660 651 ret = hns_roce_init_hem_table(hr_dev, &hr_dev->mr_table.mtpt_table, 661 652 HEM_TYPE_MTPT, hr_dev->caps.mtpt_entry_sz, 662 - hr_dev->caps.num_mtpts, 1); 653 + hr_dev->caps.num_mtpts); 663 654 if (ret) { 664 - dev_err(dev, "Failed to init MTPT context memory, aborting.\n"); 655 + dev_err(dev, "failed to init MTPT context memory, aborting.\n"); 665 656 return ret; 666 657 } 667 658 668 659 ret = hns_roce_init_hem_table(hr_dev, &hr_dev->qp_table.qp_table, 669 660 HEM_TYPE_QPC, hr_dev->caps.qpc_sz, 670 - hr_dev->caps.num_qps, 1); 661 + hr_dev->caps.num_qps); 671 662 if (ret) { 672 - dev_err(dev, "Failed to init QP context memory, aborting.\n"); 663 + dev_err(dev, "failed to init QP context memory, aborting.\n"); 673 664 goto err_unmap_dmpt; 674 665 } 675 666 ··· 677 668 HEM_TYPE_IRRL, 678 669 hr_dev->caps.irrl_entry_sz * 679 670 hr_dev->caps.max_qp_init_rdma, 680 - hr_dev->caps.num_qps, 1); 671 + hr_dev->caps.num_qps); 681 672 if (ret) { 682 - dev_err(dev, "Failed to init irrl_table memory, aborting.\n"); 673 + dev_err(dev, "failed to init irrl_table memory, aborting.\n"); 683 674 goto err_unmap_qp; 684 675 } 685 676 ··· 689 680 HEM_TYPE_TRRL, 690 681 hr_dev->caps.trrl_entry_sz * 691 682 hr_dev->caps.max_qp_dest_rdma, 692 - hr_dev->caps.num_qps, 1); 683 + hr_dev->caps.num_qps); 693 684 if (ret) { 694 685 dev_err(dev, 695 - "Failed to init trrl_table memory, aborting.\n"); 686 + "failed to init trrl_table memory, aborting.\n"); 696 687 goto err_unmap_irrl; 697 688 } 698 689 } 699 690 700 691 ret = hns_roce_init_hem_table(hr_dev, &hr_dev->cq_table.table, 701 692 HEM_TYPE_CQC, hr_dev->caps.cqc_entry_sz, 702 - hr_dev->caps.num_cqs, 1); 693 + hr_dev->caps.num_cqs); 703 694 if (ret) { 704 - dev_err(dev, "Failed to init CQ context memory, aborting.\n"); 695 + dev_err(dev, "failed to init CQ context memory, aborting.\n"); 705 696 goto err_unmap_trrl; 706 697 } 707 698 ··· 709 700 ret = hns_roce_init_hem_table(hr_dev, &hr_dev->srq_table.table, 710 701 HEM_TYPE_SRQC, 711 702 hr_dev->caps.srqc_entry_sz, 712 - hr_dev->caps.num_srqs, 1); 703 + hr_dev->caps.num_srqs); 713 704 if (ret) { 714 705 dev_err(dev, 715 - "Failed to init SRQ context memory, aborting.\n"); 706 + "failed to init SRQ context memory, aborting.\n"); 716 707 goto err_unmap_cq; 717 708 } 718 709 } ··· 722 713 &hr_dev->qp_table.sccc_table, 723 714 HEM_TYPE_SCCC, 724 715 hr_dev->caps.sccc_sz, 725 - hr_dev->caps.num_qps, 1); 716 + hr_dev->caps.num_qps); 726 717 if (ret) { 727 718 dev_err(dev, 728 - "Failed to init SCC context memory, aborting.\n"); 719 + "failed to init SCC context memory, aborting.\n"); 729 720 goto err_unmap_srq; 730 721 } 731 722 } ··· 734 725 ret = hns_roce_init_hem_table(hr_dev, &hr_dev->qpc_timer_table, 735 726 HEM_TYPE_QPC_TIMER, 736 727 hr_dev->caps.qpc_timer_entry_sz, 737 - hr_dev->caps.qpc_timer_bt_num, 1); 728 + hr_dev->caps.qpc_timer_bt_num); 738 729 if (ret) { 739 730 dev_err(dev, 740 - "Failed to init QPC timer memory, aborting.\n"); 731 + "failed to init QPC timer memory, aborting.\n"); 741 732 goto err_unmap_ctx; 742 733 } 743 734 } ··· 746 737 ret = hns_roce_init_hem_table(hr_dev, &hr_dev->cqc_timer_table, 747 738 HEM_TYPE_CQC_TIMER, 748 739 hr_dev->caps.cqc_timer_entry_sz, 749 - hr_dev->caps.cqc_timer_bt_num, 1); 740 + hr_dev->caps.cqc_timer_bt_num); 750 741 if (ret) { 751 742 dev_err(dev, 752 - "Failed to init CQC timer memory, aborting.\n"); 743 + "failed to init CQC timer memory, aborting.\n"); 753 744 goto err_unmap_qpc_timer; 754 745 } 755 746 } ··· 758 749 ret = hns_roce_init_hem_table(hr_dev, &hr_dev->gmv_table, 759 750 HEM_TYPE_GMV, 760 751 hr_dev->caps.gmv_entry_sz, 761 - hr_dev->caps.gmv_entry_num, 1); 752 + hr_dev->caps.gmv_entry_num); 762 753 if (ret) { 763 754 dev_err(dev, 764 755 "failed to init gmv table memory, ret = %d\n", ··· 827 818 828 819 ret = hns_roce_uar_alloc(hr_dev, &hr_dev->priv_uar); 829 820 if (ret) { 830 - dev_err(dev, "Failed to allocate priv_uar.\n"); 821 + dev_err(dev, "failed to allocate priv_uar.\n"); 831 822 goto err_uar_table_free; 832 823 } 833 824 834 825 ret = hns_roce_init_qp_table(hr_dev); 835 826 if (ret) { 836 - dev_err(dev, "Failed to init qp_table.\n"); 827 + dev_err(dev, "failed to init qp_table.\n"); 837 828 goto err_uar_table_free; 838 829 } 839 830 ··· 846 837 847 838 hns_roce_init_cq_table(hr_dev); 848 839 849 - if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_SRQ) { 840 + if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_SRQ) 850 841 hns_roce_init_srq_table(hr_dev); 851 - } 852 842 853 843 return 0; 854 844 ··· 910 902 if (hr_dev->hw->cmq_init) { 911 903 ret = hr_dev->hw->cmq_init(hr_dev); 912 904 if (ret) { 913 - dev_err(dev, "Init RoCE Command Queue failed!\n"); 905 + dev_err(dev, "init RoCE Command Queue failed!\n"); 914 906 return ret; 915 907 } 916 908 } 917 909 918 910 ret = hr_dev->hw->hw_profile(hr_dev); 919 911 if (ret) { 920 - dev_err(dev, "Get RoCE engine profile failed!\n"); 912 + dev_err(dev, "get RoCE engine profile failed!\n"); 921 913 goto error_failed_cmd_init; 922 914 } 923 915
+3 -4
drivers/infiniband/hw/hns/hns_roce_mr.c
··· 190 190 int ret; 191 191 192 192 mr = kzalloc(sizeof(*mr), GFP_KERNEL); 193 - if (mr == NULL) 193 + if (!mr) 194 194 return ERR_PTR(-ENOMEM); 195 195 196 196 mr->type = MR_TYPE_DMA; ··· 249 249 goto err_alloc_pbl; 250 250 251 251 mr->ibmr.rkey = mr->ibmr.lkey = mr->key; 252 - mr->ibmr.length = length; 253 252 254 253 return &mr->ibmr; 255 254 ··· 585 586 while (offset < end && npage < max_count) { 586 587 count = 0; 587 588 mtts = hns_roce_hem_list_find_mtt(hr_dev, &mtr->hem_list, 588 - offset, &count, NULL); 589 + offset, &count); 589 590 if (!mtts) 590 591 return -ENOBUFS; 591 592 ··· 834 835 mtt_count = 0; 835 836 mtts = hns_roce_hem_list_find_mtt(hr_dev, &mtr->hem_list, 836 837 start_index + total, 837 - &mtt_count, NULL); 838 + &mtt_count); 838 839 if (!mtts || !mtt_count) 839 840 goto done; 840 841
+8 -11
drivers/infiniband/hw/hns/hns_roce_qp.c
··· 56 56 if (test_and_clear_bit(HNS_ROCE_FLUSH_FLAG, &hr_qp->flush_flag)) { 57 57 ret = hns_roce_modify_qp(&hr_qp->ibqp, &attr, attr_mask, NULL); 58 58 if (ret) 59 - dev_err(dev, "Modify QP to error state failed(%d) during CQE flush\n", 59 + dev_err(dev, "modify QP to error state failed(%d) during CQE flush\n", 60 60 ret); 61 61 } 62 62 ··· 105 105 xa_unlock(&hr_dev->qp_table_xa); 106 106 107 107 if (!qp) { 108 - dev_warn(dev, "Async event for bogus QP %08x\n", qpn); 108 + dev_warn(dev, "async event for bogus QP %08x\n", qpn); 109 109 return; 110 110 } 111 111 ··· 218 218 219 219 if (hr_qp->ibqp.qp_type == IB_QPT_GSI) { 220 220 num = 1; 221 - hr_qp->doorbell_qpn = 1; 222 221 } else { 223 222 mutex_lock(&qp_table->bank_mutex); 224 223 bankid = get_least_load_bankid_for_qp(qp_table->bank); ··· 233 234 234 235 qp_table->bank[bankid].inuse++; 235 236 mutex_unlock(&qp_table->bank_mutex); 236 - 237 - hr_qp->doorbell_qpn = (u32)num; 238 237 } 239 238 240 239 hr_qp->qpn = num; ··· 275 278 276 279 ret = xa_err(xa_store_irq(xa, hr_qp->qpn, hr_qp, GFP_KERNEL)); 277 280 if (ret) 278 - dev_err(hr_dev->dev, "Failed to xa store for QPC\n"); 281 + dev_err(hr_dev->dev, "failed to xa store for QPC\n"); 279 282 else 280 283 /* add QP to device's QP list for softwc */ 281 284 add_qp_to_list(hr_dev, hr_qp, init_attr->send_cq, ··· 296 299 /* Alloc memory for QPC */ 297 300 ret = hns_roce_table_get(hr_dev, &qp_table->qp_table, hr_qp->qpn); 298 301 if (ret) { 299 - dev_err(dev, "Failed to get QPC table\n"); 302 + dev_err(dev, "failed to get QPC table\n"); 300 303 goto err_out; 301 304 } 302 305 303 306 /* Alloc memory for IRRL */ 304 307 ret = hns_roce_table_get(hr_dev, &qp_table->irrl_table, hr_qp->qpn); 305 308 if (ret) { 306 - dev_err(dev, "Failed to get IRRL table\n"); 309 + dev_err(dev, "failed to get IRRL table\n"); 307 310 goto err_put_qp; 308 311 } 309 312 ··· 312 315 ret = hns_roce_table_get(hr_dev, &qp_table->trrl_table, 313 316 hr_qp->qpn); 314 317 if (ret) { 315 - dev_err(dev, "Failed to get TRRL table\n"); 318 + dev_err(dev, "failed to get TRRL table\n"); 316 319 goto err_put_irrl; 317 320 } 318 321 } ··· 322 325 ret = hns_roce_table_get(hr_dev, &qp_table->sccc_table, 323 326 hr_qp->qpn); 324 327 if (ret) { 325 - dev_err(dev, "Failed to get SCC CTX table\n"); 328 + dev_err(dev, "failed to get SCC CTX table\n"); 326 329 goto err_put_trrl; 327 330 } 328 331 } ··· 1203 1206 1204 1207 ret = hns_roce_create_qp_common(hr_dev, pd, init_attr, udata, hr_qp); 1205 1208 if (ret) 1206 - ibdev_err(ibdev, "Create QP type 0x%x failed(%d)\n", 1209 + ibdev_err(ibdev, "create QP type 0x%x failed(%d)\n", 1207 1210 init_attr->qp_type, ret); 1208 1211 1209 1212 return ret;
+184 -52
drivers/infiniband/hw/hns/hns_roce_restrack.c
··· 9 9 #include "hns_roce_device.h" 10 10 #include "hns_roce_hw_v2.h" 11 11 12 - static int hns_roce_fill_cq(struct sk_buff *msg, 13 - struct hns_roce_v2_cq_context *context) 12 + #define MAX_ENTRY_NUM 256 13 + 14 + int hns_roce_fill_res_cq_entry(struct sk_buff *msg, struct ib_cq *ib_cq) 14 15 { 15 - if (rdma_nl_put_driver_u32(msg, "state", 16 - hr_reg_read(context, CQC_ARM_ST))) 16 + struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq); 17 + struct nlattr *table_attr; 17 18 19 + table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER); 20 + if (!table_attr) 21 + return -EMSGSIZE; 22 + 23 + if (rdma_nl_put_driver_u32(msg, "cq_depth", hr_cq->cq_depth)) 18 24 goto err; 19 25 20 - if (rdma_nl_put_driver_u32(msg, "ceqn", 21 - hr_reg_read(context, CQC_CEQN))) 26 + if (rdma_nl_put_driver_u32(msg, "cons_index", hr_cq->cons_index)) 22 27 goto err; 23 28 24 - if (rdma_nl_put_driver_u32(msg, "cqn", 25 - hr_reg_read(context, CQC_CQN))) 29 + if (rdma_nl_put_driver_u32(msg, "cqe_size", hr_cq->cqe_size)) 26 30 goto err; 27 31 28 - if (rdma_nl_put_driver_u32(msg, "hopnum", 29 - hr_reg_read(context, CQC_CQE_HOP_NUM))) 32 + if (rdma_nl_put_driver_u32(msg, "arm_sn", hr_cq->arm_sn)) 30 33 goto err; 31 34 32 - if (rdma_nl_put_driver_u32(msg, "pi", 33 - hr_reg_read(context, CQC_CQ_PRODUCER_IDX))) 34 - goto err; 35 - 36 - if (rdma_nl_put_driver_u32(msg, "ci", 37 - hr_reg_read(context, CQC_CQ_CONSUMER_IDX))) 38 - goto err; 39 - 40 - if (rdma_nl_put_driver_u32(msg, "coalesce", 41 - hr_reg_read(context, CQC_CQ_MAX_CNT))) 42 - goto err; 43 - 44 - if (rdma_nl_put_driver_u32(msg, "period", 45 - hr_reg_read(context, CQC_CQ_PERIOD))) 46 - goto err; 47 - 48 - if (rdma_nl_put_driver_u32(msg, "cnt", 49 - hr_reg_read(context, CQC_CQE_CNT))) 50 - goto err; 35 + nla_nest_end(msg, table_attr); 51 36 52 37 return 0; 53 38 54 39 err: 40 + nla_nest_cancel(msg, table_attr); 41 + 55 42 return -EMSGSIZE; 56 43 } 57 44 58 - int hns_roce_fill_res_cq_entry(struct sk_buff *msg, 59 - struct ib_cq *ib_cq) 45 + int hns_roce_fill_res_cq_entry_raw(struct sk_buff *msg, struct ib_cq *ib_cq) 60 46 { 61 47 struct hns_roce_dev *hr_dev = to_hr_dev(ib_cq->device); 62 48 struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq); 63 - struct hns_roce_v2_cq_context *context; 64 - struct nlattr *table_attr; 49 + struct hns_roce_v2_cq_context context; 50 + u32 data[MAX_ENTRY_NUM] = {}; 51 + int offset = 0; 65 52 int ret; 66 53 67 - if (!hr_dev->dfx->query_cqc_info) 54 + if (!hr_dev->hw->query_cqc) 68 55 return -EINVAL; 69 56 70 - context = kzalloc(sizeof(struct hns_roce_v2_cq_context), GFP_KERNEL); 71 - if (!context) 72 - return -ENOMEM; 73 - 74 - ret = hr_dev->dfx->query_cqc_info(hr_dev, hr_cq->cqn, (int *)context); 57 + ret = hr_dev->hw->query_cqc(hr_dev, hr_cq->cqn, &context); 75 58 if (ret) 76 - goto err; 59 + return -EINVAL; 60 + 61 + data[offset++] = hr_reg_read(&context, CQC_CQ_ST); 62 + data[offset++] = hr_reg_read(&context, CQC_SHIFT); 63 + data[offset++] = hr_reg_read(&context, CQC_CQE_SIZE); 64 + data[offset++] = hr_reg_read(&context, CQC_CQE_CNT); 65 + data[offset++] = hr_reg_read(&context, CQC_CQ_PRODUCER_IDX); 66 + data[offset++] = hr_reg_read(&context, CQC_CQ_CONSUMER_IDX); 67 + data[offset++] = hr_reg_read(&context, CQC_DB_RECORD_EN); 68 + data[offset++] = hr_reg_read(&context, CQC_ARM_ST); 69 + data[offset++] = hr_reg_read(&context, CQC_CMD_SN); 70 + data[offset++] = hr_reg_read(&context, CQC_CEQN); 71 + data[offset++] = hr_reg_read(&context, CQC_CQ_MAX_CNT); 72 + data[offset++] = hr_reg_read(&context, CQC_CQ_PERIOD); 73 + data[offset++] = hr_reg_read(&context, CQC_CQE_HOP_NUM); 74 + data[offset++] = hr_reg_read(&context, CQC_CQE_BAR_PG_SZ); 75 + data[offset++] = hr_reg_read(&context, CQC_CQE_BUF_PG_SZ); 76 + 77 + ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, offset * sizeof(u32), data); 78 + 79 + return ret; 80 + } 81 + 82 + int hns_roce_fill_res_qp_entry(struct sk_buff *msg, struct ib_qp *ib_qp) 83 + { 84 + struct hns_roce_qp *hr_qp = to_hr_qp(ib_qp); 85 + struct nlattr *table_attr; 77 86 78 87 table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER); 79 - if (!table_attr) { 80 - ret = -EMSGSIZE; 81 - goto err; 82 - } 88 + if (!table_attr) 89 + return -EMSGSIZE; 83 90 84 - if (hns_roce_fill_cq(msg, context)) { 85 - ret = -EMSGSIZE; 86 - goto err_cancel_table; 87 - } 91 + if (rdma_nl_put_driver_u32_hex(msg, "sq_wqe_cnt", hr_qp->sq.wqe_cnt)) 92 + goto err; 93 + 94 + if (rdma_nl_put_driver_u32_hex(msg, "sq_max_gs", hr_qp->sq.max_gs)) 95 + goto err; 96 + 97 + if (rdma_nl_put_driver_u32_hex(msg, "rq_wqe_cnt", hr_qp->rq.wqe_cnt)) 98 + goto err; 99 + 100 + if (rdma_nl_put_driver_u32_hex(msg, "rq_max_gs", hr_qp->rq.max_gs)) 101 + goto err; 102 + 103 + if (rdma_nl_put_driver_u32_hex(msg, "ext_sge_sge_cnt", hr_qp->sge.sge_cnt)) 104 + goto err; 88 105 89 106 nla_nest_end(msg, table_attr); 90 - kfree(context); 91 107 92 108 return 0; 93 109 94 - err_cancel_table: 95 - nla_nest_cancel(msg, table_attr); 96 110 err: 97 - kfree(context); 111 + nla_nest_cancel(msg, table_attr); 112 + 113 + return -EMSGSIZE; 114 + } 115 + 116 + int hns_roce_fill_res_qp_entry_raw(struct sk_buff *msg, struct ib_qp *ib_qp) 117 + { 118 + struct hns_roce_dev *hr_dev = to_hr_dev(ib_qp->device); 119 + struct hns_roce_qp *hr_qp = to_hr_qp(ib_qp); 120 + struct hns_roce_v2_qp_context context; 121 + u32 data[MAX_ENTRY_NUM] = {}; 122 + int offset = 0; 123 + int ret; 124 + 125 + if (!hr_dev->hw->query_qpc) 126 + return -EINVAL; 127 + 128 + ret = hr_dev->hw->query_qpc(hr_dev, hr_qp->qpn, &context); 129 + if (ret) 130 + return -EINVAL; 131 + 132 + data[offset++] = hr_reg_read(&context, QPC_QP_ST); 133 + data[offset++] = hr_reg_read(&context, QPC_ERR_TYPE); 134 + data[offset++] = hr_reg_read(&context, QPC_CHECK_FLG); 135 + data[offset++] = hr_reg_read(&context, QPC_SRQ_EN); 136 + data[offset++] = hr_reg_read(&context, QPC_SRQN); 137 + data[offset++] = hr_reg_read(&context, QPC_QKEY_XRCD); 138 + data[offset++] = hr_reg_read(&context, QPC_TX_CQN); 139 + data[offset++] = hr_reg_read(&context, QPC_RX_CQN); 140 + data[offset++] = hr_reg_read(&context, QPC_SQ_PRODUCER_IDX); 141 + data[offset++] = hr_reg_read(&context, QPC_SQ_CONSUMER_IDX); 142 + data[offset++] = hr_reg_read(&context, QPC_RQ_RECORD_EN); 143 + data[offset++] = hr_reg_read(&context, QPC_RQ_PRODUCER_IDX); 144 + data[offset++] = hr_reg_read(&context, QPC_RQ_CONSUMER_IDX); 145 + data[offset++] = hr_reg_read(&context, QPC_SQ_SHIFT); 146 + data[offset++] = hr_reg_read(&context, QPC_RQWS); 147 + data[offset++] = hr_reg_read(&context, QPC_RQ_SHIFT); 148 + data[offset++] = hr_reg_read(&context, QPC_SGE_SHIFT); 149 + data[offset++] = hr_reg_read(&context, QPC_SQ_HOP_NUM); 150 + data[offset++] = hr_reg_read(&context, QPC_RQ_HOP_NUM); 151 + data[offset++] = hr_reg_read(&context, QPC_SGE_HOP_NUM); 152 + data[offset++] = hr_reg_read(&context, QPC_WQE_SGE_BA_PG_SZ); 153 + data[offset++] = hr_reg_read(&context, QPC_WQE_SGE_BUF_PG_SZ); 154 + data[offset++] = hr_reg_read(&context, QPC_RETRY_NUM_INIT); 155 + data[offset++] = hr_reg_read(&context, QPC_RETRY_CNT); 156 + data[offset++] = hr_reg_read(&context, QPC_SQ_CUR_PSN); 157 + data[offset++] = hr_reg_read(&context, QPC_SQ_MAX_PSN); 158 + data[offset++] = hr_reg_read(&context, QPC_SQ_FLUSH_IDX); 159 + data[offset++] = hr_reg_read(&context, QPC_SQ_MAX_IDX); 160 + data[offset++] = hr_reg_read(&context, QPC_SQ_TX_ERR); 161 + data[offset++] = hr_reg_read(&context, QPC_SQ_RX_ERR); 162 + data[offset++] = hr_reg_read(&context, QPC_RQ_RX_ERR); 163 + data[offset++] = hr_reg_read(&context, QPC_RQ_TX_ERR); 164 + data[offset++] = hr_reg_read(&context, QPC_RQ_CQE_IDX); 165 + data[offset++] = hr_reg_read(&context, QPC_RQ_RTY_TX_ERR); 166 + 167 + ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, offset * sizeof(u32), data); 168 + 169 + return ret; 170 + } 171 + 172 + int hns_roce_fill_res_mr_entry(struct sk_buff *msg, struct ib_mr *ib_mr) 173 + { 174 + struct hns_roce_mr *hr_mr = to_hr_mr(ib_mr); 175 + struct nlattr *table_attr; 176 + 177 + table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER); 178 + if (!table_attr) 179 + return -EMSGSIZE; 180 + 181 + if (rdma_nl_put_driver_u32_hex(msg, "pbl_hop_num", hr_mr->pbl_hop_num)) 182 + goto err; 183 + 184 + if (rdma_nl_put_driver_u32_hex(msg, "ba_pg_shift", 185 + hr_mr->pbl_mtr.hem_cfg.ba_pg_shift)) 186 + goto err; 187 + 188 + if (rdma_nl_put_driver_u32_hex(msg, "buf_pg_shift", 189 + hr_mr->pbl_mtr.hem_cfg.buf_pg_shift)) 190 + goto err; 191 + 192 + nla_nest_end(msg, table_attr); 193 + 194 + return 0; 195 + 196 + err: 197 + nla_nest_cancel(msg, table_attr); 198 + 199 + return -EMSGSIZE; 200 + } 201 + 202 + int hns_roce_fill_res_mr_entry_raw(struct sk_buff *msg, struct ib_mr *ib_mr) 203 + { 204 + struct hns_roce_dev *hr_dev = to_hr_dev(ib_mr->device); 205 + struct hns_roce_mr *hr_mr = to_hr_mr(ib_mr); 206 + struct hns_roce_v2_mpt_entry context; 207 + u32 data[MAX_ENTRY_NUM] = {}; 208 + int offset = 0; 209 + int ret; 210 + 211 + if (!hr_dev->hw->query_mpt) 212 + return -EINVAL; 213 + 214 + ret = hr_dev->hw->query_mpt(hr_dev, hr_mr->key, &context); 215 + if (ret) 216 + return -EINVAL; 217 + 218 + data[offset++] = hr_reg_read(&context, MPT_ST); 219 + data[offset++] = hr_reg_read(&context, MPT_PD); 220 + data[offset++] = hr_reg_read(&context, MPT_LKEY); 221 + data[offset++] = hr_reg_read(&context, MPT_LEN_L); 222 + data[offset++] = hr_reg_read(&context, MPT_LEN_H); 223 + data[offset++] = hr_reg_read(&context, MPT_PBL_SIZE); 224 + data[offset++] = hr_reg_read(&context, MPT_PBL_HOP_NUM); 225 + data[offset++] = hr_reg_read(&context, MPT_PBL_BA_PG_SZ); 226 + data[offset++] = hr_reg_read(&context, MPT_PBL_BUF_PG_SZ); 227 + 228 + ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, offset * sizeof(u32), data); 229 + 98 230 return ret; 99 231 }
+1
drivers/infiniband/hw/irdma/defs.h
··· 314 314 #define IRDMA_AE_IB_REMOTE_ACCESS_ERROR 0x020d 315 315 #define IRDMA_AE_IB_REMOTE_OP_ERROR 0x020e 316 316 #define IRDMA_AE_WQE_LSMM_TOO_LONG 0x0220 317 + #define IRDMA_AE_INVALID_REQUEST 0x0223 317 318 #define IRDMA_AE_DDP_INVALID_MSN_GAP_IN_MSN 0x0301 318 319 #define IRDMA_AE_DDP_UBE_DDP_MESSAGE_TOO_LONG_FOR_AVAILABLE_BUFFER 0x0303 319 320 #define IRDMA_AE_DDP_UBE_INVALID_DDP_VERSION 0x0304
+31 -22
drivers/infiniband/hw/irdma/hw.c
··· 138 138 qp->event_type = IRDMA_QP_EVENT_CATASTROPHIC; 139 139 140 140 switch (info->ae_id) { 141 - case IRDMA_AE_AMP_UNALLOCATED_STAG: 142 141 case IRDMA_AE_AMP_BOUNDS_VIOLATION: 143 142 case IRDMA_AE_AMP_INVALID_STAG: 144 - qp->event_type = IRDMA_QP_EVENT_ACCESS_ERR; 145 - fallthrough; 143 + case IRDMA_AE_AMP_RIGHTS_VIOLATION: 144 + case IRDMA_AE_AMP_UNALLOCATED_STAG: 146 145 case IRDMA_AE_AMP_BAD_PD: 147 - case IRDMA_AE_UDA_XMIT_BAD_PD: 148 - qp->flush_code = FLUSH_PROT_ERR; 149 - break; 150 146 case IRDMA_AE_AMP_BAD_QP: 151 - case IRDMA_AE_WQE_UNEXPECTED_OPCODE: 152 - qp->flush_code = FLUSH_LOC_QP_OP_ERR; 153 - break; 154 147 case IRDMA_AE_AMP_BAD_STAG_KEY: 155 148 case IRDMA_AE_AMP_BAD_STAG_INDEX: 156 149 case IRDMA_AE_AMP_TO_WRAP: 157 - case IRDMA_AE_AMP_RIGHTS_VIOLATION: 158 - case IRDMA_AE_AMP_INVALIDATE_NO_REMOTE_ACCESS_RIGHTS: 159 150 case IRDMA_AE_PRIV_OPERATION_DENIED: 160 - case IRDMA_AE_IB_INVALID_REQUEST: 151 + qp->flush_code = FLUSH_PROT_ERR; 152 + qp->event_type = IRDMA_QP_EVENT_ACCESS_ERR; 153 + break; 154 + case IRDMA_AE_UDA_XMIT_BAD_PD: 155 + case IRDMA_AE_WQE_UNEXPECTED_OPCODE: 156 + qp->flush_code = FLUSH_LOC_QP_OP_ERR; 157 + qp->event_type = IRDMA_QP_EVENT_CATASTROPHIC; 158 + break; 159 + case IRDMA_AE_UDA_XMIT_DGRAM_TOO_LONG: 160 + case IRDMA_AE_UDA_XMIT_DGRAM_TOO_SHORT: 161 + case IRDMA_AE_UDA_L4LEN_INVALID: 162 + case IRDMA_AE_DDP_UBE_INVALID_MO: 163 + case IRDMA_AE_DDP_UBE_DDP_MESSAGE_TOO_LONG_FOR_AVAILABLE_BUFFER: 164 + qp->flush_code = FLUSH_LOC_LEN_ERR; 165 + qp->event_type = IRDMA_QP_EVENT_CATASTROPHIC; 166 + break; 167 + case IRDMA_AE_AMP_INVALIDATE_NO_REMOTE_ACCESS_RIGHTS: 161 168 case IRDMA_AE_IB_REMOTE_ACCESS_ERROR: 162 169 qp->flush_code = FLUSH_REM_ACCESS_ERR; 163 170 qp->event_type = IRDMA_QP_EVENT_ACCESS_ERR; 164 171 break; 165 172 case IRDMA_AE_LLP_SEGMENT_TOO_SMALL: 166 - case IRDMA_AE_DDP_UBE_DDP_MESSAGE_TOO_LONG_FOR_AVAILABLE_BUFFER: 167 - case IRDMA_AE_UDA_XMIT_DGRAM_TOO_LONG: 168 - case IRDMA_AE_UDA_XMIT_DGRAM_TOO_SHORT: 169 - case IRDMA_AE_UDA_L4LEN_INVALID: 173 + case IRDMA_AE_LLP_RECEIVED_MPA_CRC_ERROR: 170 174 case IRDMA_AE_ROCE_RSP_LENGTH_ERROR: 171 - qp->flush_code = FLUSH_LOC_LEN_ERR; 175 + case IRDMA_AE_IB_REMOTE_OP_ERROR: 176 + qp->flush_code = FLUSH_REM_OP_ERR; 177 + qp->event_type = IRDMA_QP_EVENT_CATASTROPHIC; 172 178 break; 173 179 case IRDMA_AE_LCE_QP_CATASTROPHIC: 174 180 qp->flush_code = FLUSH_FATAL_ERR; 181 + qp->event_type = IRDMA_QP_EVENT_CATASTROPHIC; 175 182 break; 176 - case IRDMA_AE_DDP_UBE_INVALID_MO: 177 183 case IRDMA_AE_IB_RREQ_AND_Q1_FULL: 178 - case IRDMA_AE_LLP_RECEIVED_MPA_CRC_ERROR: 179 184 qp->flush_code = FLUSH_GENERAL_ERR; 180 185 break; 181 186 case IRDMA_AE_LLP_TOO_MANY_RETRIES: 182 187 qp->flush_code = FLUSH_RETRY_EXC_ERR; 188 + qp->event_type = IRDMA_QP_EVENT_CATASTROPHIC; 183 189 break; 184 190 case IRDMA_AE_AMP_MWBIND_INVALID_RIGHTS: 185 191 case IRDMA_AE_AMP_MWBIND_BIND_DISABLED: 186 192 case IRDMA_AE_AMP_MWBIND_INVALID_BOUNDS: 187 193 qp->flush_code = FLUSH_MW_BIND_ERR; 194 + qp->event_type = IRDMA_QP_EVENT_ACCESS_ERR; 188 195 break; 189 - case IRDMA_AE_IB_REMOTE_OP_ERROR: 190 - qp->flush_code = FLUSH_REM_OP_ERR; 196 + case IRDMA_AE_IB_INVALID_REQUEST: 197 + qp->flush_code = FLUSH_REM_INV_REQ_ERR; 198 + qp->event_type = IRDMA_QP_EVENT_REQ_ERR; 191 199 break; 192 200 default: 193 - qp->flush_code = FLUSH_FATAL_ERR; 201 + qp->flush_code = FLUSH_GENERAL_ERR; 202 + qp->event_type = IRDMA_QP_EVENT_CATASTROPHIC; 194 203 break; 195 204 } 196 205 }
+1
drivers/infiniband/hw/irdma/type.h
··· 98 98 enum irdma_qp_event_type { 99 99 IRDMA_QP_EVENT_CATASTROPHIC, 100 100 IRDMA_QP_EVENT_ACCESS_ERR, 101 + IRDMA_QP_EVENT_REQ_ERR, 101 102 }; 102 103 103 104 enum irdma_hw_stats_index_32b {
+1
drivers/infiniband/hw/irdma/user.h
··· 103 103 FLUSH_FATAL_ERR, 104 104 FLUSH_RETRY_EXC_ERR, 105 105 FLUSH_MW_BIND_ERR, 106 + FLUSH_REM_INV_REQ_ERR, 106 107 }; 107 108 108 109 enum irdma_cmpl_status {
+3
drivers/infiniband/hw/irdma/utils.c
··· 2479 2479 case IRDMA_QP_EVENT_ACCESS_ERR: 2480 2480 ibevent.event = IB_EVENT_QP_ACCESS_ERR; 2481 2481 break; 2482 + case IRDMA_QP_EVENT_REQ_ERR: 2483 + ibevent.event = IB_EVENT_QP_REQ_ERR; 2484 + break; 2482 2485 } 2483 2486 ibevent.device = iwqp->ibqp.device; 2484 2487 ibevent.element.qp = &iwqp->ibqp;
+62 -7
drivers/infiniband/hw/irdma/verbs.c
··· 299 299 static int irdma_alloc_ucontext(struct ib_ucontext *uctx, 300 300 struct ib_udata *udata) 301 301 { 302 + #define IRDMA_ALLOC_UCTX_MIN_REQ_LEN offsetofend(struct irdma_alloc_ucontext_req, rsvd8) 303 + #define IRDMA_ALLOC_UCTX_MIN_RESP_LEN offsetofend(struct irdma_alloc_ucontext_resp, rsvd) 302 304 struct ib_device *ibdev = uctx->device; 303 305 struct irdma_device *iwdev = to_iwdev(ibdev); 304 - struct irdma_alloc_ucontext_req req; 306 + struct irdma_alloc_ucontext_req req = {}; 305 307 struct irdma_alloc_ucontext_resp uresp = {}; 306 308 struct irdma_ucontext *ucontext = to_ucontext(uctx); 307 309 struct irdma_uk_attrs *uk_attrs; 310 + 311 + if (udata->inlen < IRDMA_ALLOC_UCTX_MIN_REQ_LEN || 312 + udata->outlen < IRDMA_ALLOC_UCTX_MIN_RESP_LEN) 313 + return -EINVAL; 308 314 309 315 if (ib_copy_from_udata(&req, udata, min(sizeof(req), udata->inlen))) 310 316 return -EINVAL; ··· 323 317 324 318 uk_attrs = &iwdev->rf->sc_dev.hw_attrs.uk_attrs; 325 319 /* GEN_1 legacy support with libi40iw */ 326 - if (udata->outlen < sizeof(uresp)) { 320 + if (udata->outlen == IRDMA_ALLOC_UCTX_MIN_RESP_LEN) { 327 321 if (uk_attrs->hw_rev != IRDMA_GEN_1) 328 322 return -EOPNOTSUPP; 329 323 ··· 395 389 */ 396 390 static int irdma_alloc_pd(struct ib_pd *pd, struct ib_udata *udata) 397 391 { 392 + #define IRDMA_ALLOC_PD_MIN_RESP_LEN offsetofend(struct irdma_alloc_pd_resp, rsvd) 398 393 struct irdma_pd *iwpd = to_iwpd(pd); 399 394 struct irdma_device *iwdev = to_iwdev(pd->device); 400 395 struct irdma_sc_dev *dev = &iwdev->rf->sc_dev; ··· 404 397 struct irdma_sc_pd *sc_pd; 405 398 u32 pd_id = 0; 406 399 int err; 400 + 401 + if (udata && udata->outlen < IRDMA_ALLOC_PD_MIN_RESP_LEN) 402 + return -EINVAL; 407 403 408 404 err = irdma_alloc_rsrc(rf, rf->allocated_pds, rf->max_pd, &pd_id, 409 405 &rf->next_pd); ··· 824 814 struct ib_qp_init_attr *init_attr, 825 815 struct ib_udata *udata) 826 816 { 817 + #define IRDMA_CREATE_QP_MIN_REQ_LEN offsetofend(struct irdma_create_qp_req, user_compl_ctx) 818 + #define IRDMA_CREATE_QP_MIN_RESP_LEN offsetofend(struct irdma_create_qp_resp, rsvd) 827 819 struct ib_pd *ibpd = ibqp->pd; 828 820 struct irdma_pd *iwpd = to_iwpd(ibpd); 829 821 struct irdma_device *iwdev = to_iwdev(ibpd->device); 830 822 struct irdma_pci_f *rf = iwdev->rf; 831 823 struct irdma_qp *iwqp = to_iwqp(ibqp); 832 - struct irdma_create_qp_req req; 824 + struct irdma_create_qp_req req = {}; 833 825 struct irdma_create_qp_resp uresp = {}; 834 826 u32 qp_num = 0; 835 827 int err_code; ··· 847 835 err_code = irdma_validate_qp_attrs(init_attr, iwdev); 848 836 if (err_code) 849 837 return err_code; 838 + 839 + if (udata && (udata->inlen < IRDMA_CREATE_QP_MIN_REQ_LEN || 840 + udata->outlen < IRDMA_CREATE_QP_MIN_RESP_LEN)) 841 + return -EINVAL; 850 842 851 843 sq_size = init_attr->cap.max_send_wr; 852 844 rq_size = init_attr->cap.max_recv_wr; ··· 1136 1120 int irdma_modify_qp_roce(struct ib_qp *ibqp, struct ib_qp_attr *attr, 1137 1121 int attr_mask, struct ib_udata *udata) 1138 1122 { 1123 + #define IRDMA_MODIFY_QP_MIN_REQ_LEN offsetofend(struct irdma_modify_qp_req, rq_flush) 1124 + #define IRDMA_MODIFY_QP_MIN_RESP_LEN offsetofend(struct irdma_modify_qp_resp, push_valid) 1139 1125 struct irdma_pd *iwpd = to_iwpd(ibqp->pd); 1140 1126 struct irdma_qp *iwqp = to_iwqp(ibqp); 1141 1127 struct irdma_device *iwdev = iwqp->iwdev; ··· 1155 1137 ctx_info = &iwqp->ctx_info; 1156 1138 roce_info = &iwqp->roce_info; 1157 1139 udp_info = &iwqp->udp_info; 1140 + 1141 + if (udata) { 1142 + /* udata inlen/outlen can be 0 when supporting legacy libi40iw */ 1143 + if ((udata->inlen && udata->inlen < IRDMA_MODIFY_QP_MIN_REQ_LEN) || 1144 + (udata->outlen && udata->outlen < IRDMA_MODIFY_QP_MIN_RESP_LEN)) 1145 + return -EINVAL; 1146 + } 1158 1147 1159 1148 if (attr_mask & ~IB_QP_ATTR_STANDARD_BITS) 1160 1149 return -EOPNOTSUPP; ··· 1399 1374 1400 1375 if (iwqp->iwarp_state == IRDMA_QP_STATE_ERROR) { 1401 1376 spin_unlock_irqrestore(&iwqp->lock, flags); 1402 - if (udata) { 1377 + if (udata && udata->inlen) { 1403 1378 if (ib_copy_from_udata(&ureq, udata, 1404 1379 min(sizeof(ureq), udata->inlen))) 1405 1380 return -EINVAL; ··· 1451 1426 } else { 1452 1427 iwqp->ibqp_state = attr->qp_state; 1453 1428 } 1454 - if (udata && dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_2) { 1429 + if (udata && udata->outlen && dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_2) { 1455 1430 struct irdma_ucontext *ucontext; 1456 1431 1457 1432 ucontext = rdma_udata_to_drv_context(udata, ··· 1491 1466 int irdma_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask, 1492 1467 struct ib_udata *udata) 1493 1468 { 1469 + #define IRDMA_MODIFY_QP_MIN_REQ_LEN offsetofend(struct irdma_modify_qp_req, rq_flush) 1470 + #define IRDMA_MODIFY_QP_MIN_RESP_LEN offsetofend(struct irdma_modify_qp_resp, push_valid) 1494 1471 struct irdma_qp *iwqp = to_iwqp(ibqp); 1495 1472 struct irdma_device *iwdev = iwqp->iwdev; 1496 1473 struct irdma_sc_dev *dev = &iwdev->rf->sc_dev; ··· 1506 1479 u8 dont_wait = 0; 1507 1480 int err; 1508 1481 unsigned long flags; 1482 + 1483 + if (udata) { 1484 + /* udata inlen/outlen can be 0 when supporting legacy libi40iw */ 1485 + if ((udata->inlen && udata->inlen < IRDMA_MODIFY_QP_MIN_REQ_LEN) || 1486 + (udata->outlen && udata->outlen < IRDMA_MODIFY_QP_MIN_RESP_LEN)) 1487 + return -EINVAL; 1488 + } 1509 1489 1510 1490 if (attr_mask & ~IB_QP_ATTR_STANDARD_BITS) 1511 1491 return -EOPNOTSUPP; ··· 1599 1565 case IB_QPS_RESET: 1600 1566 if (iwqp->iwarp_state == IRDMA_QP_STATE_ERROR) { 1601 1567 spin_unlock_irqrestore(&iwqp->lock, flags); 1602 - if (udata) { 1568 + if (udata && udata->inlen) { 1603 1569 if (ib_copy_from_udata(&ureq, udata, 1604 1570 min(sizeof(ureq), udata->inlen))) 1605 1571 return -EINVAL; ··· 1696 1662 } 1697 1663 } 1698 1664 } 1699 - if (attr_mask & IB_QP_STATE && udata && 1665 + if (attr_mask & IB_QP_STATE && udata && udata->outlen && 1700 1666 dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_2) { 1701 1667 struct irdma_ucontext *ucontext; 1702 1668 ··· 1831 1797 static int irdma_resize_cq(struct ib_cq *ibcq, int entries, 1832 1798 struct ib_udata *udata) 1833 1799 { 1800 + #define IRDMA_RESIZE_CQ_MIN_REQ_LEN offsetofend(struct irdma_resize_cq_req, user_cq_buffer) 1834 1801 struct irdma_cq *iwcq = to_iwcq(ibcq); 1835 1802 struct irdma_sc_dev *dev = iwcq->sc_cq.dev; 1836 1803 struct irdma_cqp_request *cqp_request; ··· 1853 1818 if (!(rf->sc_dev.hw_attrs.uk_attrs.feature_flags & 1854 1819 IRDMA_FEATURE_CQ_RESIZE)) 1855 1820 return -EOPNOTSUPP; 1821 + 1822 + if (udata && udata->inlen < IRDMA_RESIZE_CQ_MIN_REQ_LEN) 1823 + return -EINVAL; 1856 1824 1857 1825 if (entries > rf->max_cqe) 1858 1826 return -EINVAL; ··· 1989 1951 const struct ib_cq_init_attr *attr, 1990 1952 struct ib_udata *udata) 1991 1953 { 1954 + #define IRDMA_CREATE_CQ_MIN_REQ_LEN offsetofend(struct irdma_create_cq_req, user_cq_buf) 1955 + #define IRDMA_CREATE_CQ_MIN_RESP_LEN offsetofend(struct irdma_create_cq_resp, cq_size) 1992 1956 struct ib_device *ibdev = ibcq->device; 1993 1957 struct irdma_device *iwdev = to_iwdev(ibdev); 1994 1958 struct irdma_pci_f *rf = iwdev->rf; ··· 2009 1969 err_code = cq_validate_flags(attr->flags, dev->hw_attrs.uk_attrs.hw_rev); 2010 1970 if (err_code) 2011 1971 return err_code; 1972 + 1973 + if (udata && (udata->inlen < IRDMA_CREATE_CQ_MIN_REQ_LEN || 1974 + udata->outlen < IRDMA_CREATE_CQ_MIN_RESP_LEN)) 1975 + return -EINVAL; 1976 + 2012 1977 err_code = irdma_alloc_rsrc(rf, rf->allocated_cqs, rf->max_cq, &cq_num, 2013 1978 &rf->next_cq); 2014 1979 if (err_code) ··· 2791 2746 u64 virt, int access, 2792 2747 struct ib_udata *udata) 2793 2748 { 2749 + #define IRDMA_MEM_REG_MIN_REQ_LEN offsetofend(struct irdma_mem_reg_req, sq_pages) 2794 2750 struct irdma_device *iwdev = to_iwdev(pd->device); 2795 2751 struct irdma_ucontext *ucontext; 2796 2752 struct irdma_pble_alloc *palloc; ··· 2807 2761 int ret; 2808 2762 2809 2763 if (len > iwdev->rf->sc_dev.hw_attrs.max_mr_size) 2764 + return ERR_PTR(-EINVAL); 2765 + 2766 + if (udata->inlen < IRDMA_MEM_REG_MIN_REQ_LEN) 2810 2767 return ERR_PTR(-EINVAL); 2811 2768 2812 2769 region = ib_umem_get(pd->device, start, len, access); ··· 3364 3315 return IB_WC_RETRY_EXC_ERR; 3365 3316 case FLUSH_MW_BIND_ERR: 3366 3317 return IB_WC_MW_BIND_ERR; 3318 + case FLUSH_REM_INV_REQ_ERR: 3319 + return IB_WC_REM_INV_REQ_ERR; 3367 3320 case FLUSH_FATAL_ERR: 3368 3321 default: 3369 3322 return IB_WC_FATAL_ERR; ··· 4347 4296 struct rdma_ah_init_attr *attr, 4348 4297 struct ib_udata *udata) 4349 4298 { 4299 + #define IRDMA_CREATE_AH_MIN_RESP_LEN offsetofend(struct irdma_create_ah_resp, rsvd) 4350 4300 struct irdma_ah *ah = container_of(ibah, struct irdma_ah, ibah); 4351 4301 struct irdma_device *iwdev = to_iwdev(ibah->pd->device); 4352 4302 struct irdma_create_ah_resp uresp; 4353 4303 struct irdma_ah *parent_ah; 4354 4304 int err; 4305 + 4306 + if (udata && udata->outlen < IRDMA_CREATE_AH_MIN_RESP_LEN) 4307 + return -EINVAL; 4355 4308 4356 4309 err = irdma_setup_ah(ibah, attr); 4357 4310 if (err)
-1
drivers/infiniband/hw/mlx4/mr.c
··· 439 439 goto err_mr; 440 440 441 441 mr->ibmr.rkey = mr->ibmr.lkey = mr->mmr.key; 442 - mr->ibmr.length = length; 443 442 mr->ibmr.page_size = 1U << shift; 444 443 445 444 return &mr->ibmr;
+41 -16
drivers/infiniband/hw/mlx5/devx.c
··· 907 907 case MLX5_CMD_OP_QUERY_HCA_CAP: 908 908 case MLX5_CMD_OP_QUERY_HCA_VPORT_CONTEXT: 909 909 case MLX5_CMD_OP_QUERY_ESW_VPORT_CONTEXT: 910 + case MLX5_CMD_OP_QUERY_ESW_FUNCTIONS: 910 911 return true; 911 912 default: 912 913 return false; ··· 963 962 case MLX5_CMD_OP_QUERY_CONG_PARAMS: 964 963 case MLX5_CMD_OP_QUERY_CONG_STATISTICS: 965 964 case MLX5_CMD_OP_QUERY_LAG: 965 + case MLX5_CMD_OP_QUERY_ESW_FUNCTIONS: 966 966 return true; 967 967 default: 968 968 return false; ··· 2160 2158 2161 2159 static int devx_umem_get(struct mlx5_ib_dev *dev, struct ib_ucontext *ucontext, 2162 2160 struct uverbs_attr_bundle *attrs, 2163 - struct devx_umem *obj) 2161 + struct devx_umem *obj, u32 access_flags) 2164 2162 { 2165 2163 u64 addr; 2166 2164 size_t size; 2167 - u32 access; 2168 2165 int err; 2169 2166 2170 2167 if (uverbs_copy_from(&addr, attrs, MLX5_IB_ATTR_DEVX_UMEM_REG_ADDR) || 2171 2168 uverbs_copy_from(&size, attrs, MLX5_IB_ATTR_DEVX_UMEM_REG_LEN)) 2172 2169 return -EFAULT; 2173 2170 2174 - err = uverbs_get_flags32(&access, attrs, 2175 - MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS, 2176 - IB_ACCESS_LOCAL_WRITE | 2177 - IB_ACCESS_REMOTE_WRITE | 2178 - IB_ACCESS_REMOTE_READ); 2171 + err = ib_check_mr_access(&dev->ib_dev, access_flags); 2179 2172 if (err) 2180 2173 return err; 2181 2174 2182 - err = ib_check_mr_access(&dev->ib_dev, access); 2183 - if (err) 2184 - return err; 2175 + if (uverbs_attr_is_valid(attrs, MLX5_IB_ATTR_DEVX_UMEM_REG_DMABUF_FD)) { 2176 + struct ib_umem_dmabuf *umem_dmabuf; 2177 + int dmabuf_fd; 2185 2178 2186 - obj->umem = ib_umem_get(&dev->ib_dev, addr, size, access); 2187 - if (IS_ERR(obj->umem)) 2188 - return PTR_ERR(obj->umem); 2179 + err = uverbs_get_raw_fd(&dmabuf_fd, attrs, 2180 + MLX5_IB_ATTR_DEVX_UMEM_REG_DMABUF_FD); 2181 + if (err) 2182 + return -EFAULT; 2183 + 2184 + umem_dmabuf = ib_umem_dmabuf_get_pinned( 2185 + &dev->ib_dev, addr, size, dmabuf_fd, access_flags); 2186 + if (IS_ERR(umem_dmabuf)) 2187 + return PTR_ERR(umem_dmabuf); 2188 + obj->umem = &umem_dmabuf->umem; 2189 + } else { 2190 + obj->umem = ib_umem_get(&dev->ib_dev, addr, size, access_flags); 2191 + if (IS_ERR(obj->umem)) 2192 + return PTR_ERR(obj->umem); 2193 + } 2189 2194 return 0; 2190 2195 } 2191 2196 ··· 2231 2222 static int devx_umem_reg_cmd_alloc(struct mlx5_ib_dev *dev, 2232 2223 struct uverbs_attr_bundle *attrs, 2233 2224 struct devx_umem *obj, 2234 - struct devx_umem_reg_cmd *cmd) 2225 + struct devx_umem_reg_cmd *cmd, 2226 + int access) 2235 2227 { 2236 2228 unsigned long pgsz_bitmap; 2237 2229 unsigned int page_size; ··· 2281 2271 MLX5_SET(umem, umem, page_offset, 2282 2272 ib_umem_dma_offset(obj->umem, page_size)); 2283 2273 2274 + if (mlx5_umem_needs_ats(dev, obj->umem, access)) 2275 + MLX5_SET(umem, umem, ats, 1); 2276 + 2284 2277 mlx5_ib_populate_pas(obj->umem, page_size, mtt, 2285 2278 (obj->umem->writable ? MLX5_IB_MTT_WRITE : 0) | 2286 2279 MLX5_IB_MTT_READ); ··· 2301 2288 struct mlx5_ib_ucontext *c = rdma_udata_to_drv_context( 2302 2289 &attrs->driver_udata, struct mlx5_ib_ucontext, ibucontext); 2303 2290 struct mlx5_ib_dev *dev = to_mdev(c->ibucontext.device); 2291 + int access_flags; 2304 2292 int err; 2305 2293 2306 2294 if (!c->devx_uid) 2307 2295 return -EINVAL; 2308 2296 2297 + err = uverbs_get_flags32(&access_flags, attrs, 2298 + MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS, 2299 + IB_ACCESS_LOCAL_WRITE | 2300 + IB_ACCESS_REMOTE_WRITE | 2301 + IB_ACCESS_REMOTE_READ | 2302 + IB_ACCESS_RELAXED_ORDERING); 2303 + if (err) 2304 + return err; 2305 + 2309 2306 obj = kzalloc(sizeof(struct devx_umem), GFP_KERNEL); 2310 2307 if (!obj) 2311 2308 return -ENOMEM; 2312 2309 2313 - err = devx_umem_get(dev, &c->ibucontext, attrs, obj); 2310 + err = devx_umem_get(dev, &c->ibucontext, attrs, obj, access_flags); 2314 2311 if (err) 2315 2312 goto err_obj_free; 2316 2313 2317 - err = devx_umem_reg_cmd_alloc(dev, attrs, obj, &cmd); 2314 + err = devx_umem_reg_cmd_alloc(dev, attrs, obj, &cmd, access_flags); 2318 2315 if (err) 2319 2316 goto err_umem_release; 2320 2317 ··· 2856 2833 UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_UMEM_REG_LEN, 2857 2834 UVERBS_ATTR_TYPE(u64), 2858 2835 UA_MANDATORY), 2836 + UVERBS_ATTR_RAW_FD(MLX5_IB_ATTR_DEVX_UMEM_REG_DMABUF_FD, 2837 + UA_OPTIONAL), 2859 2838 UVERBS_ATTR_FLAGS_IN(MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS, 2860 2839 enum ib_access_flags), 2861 2840 UVERBS_ATTR_CONST_IN(MLX5_IB_ATTR_DEVX_UMEM_REG_PGSZ_BITMAP,
+4 -2
drivers/infiniband/hw/mlx5/main.c
··· 26 26 #include <linux/mlx5/eswitch.h> 27 27 #include <linux/list.h> 28 28 #include <rdma/ib_smi.h> 29 - #include <rdma/ib_umem.h> 29 + #include <rdma/ib_umem_odp.h> 30 30 #include <rdma/lag.h> 31 31 #include <linux/in.h> 32 32 #include <linux/etherdevice.h> ··· 46 46 #include <rdma/uverbs_ioctl.h> 47 47 #include <rdma/mlx5_user_ioctl_verbs.h> 48 48 #include <rdma/mlx5_user_ioctl_cmds.h> 49 - #include <rdma/ib_umem_odp.h> 50 49 51 50 #define UVERBS_MODULE_NAME mlx5_ib 52 51 #include <rdma/uverbs_named_ioctl.h> ··· 1824 1825 1825 1826 if (MLX5_CAP_GEN(dev->mdev, drain_sigerr)) 1826 1827 resp->comp_mask |= MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_SQD2RTS; 1828 + 1829 + resp->comp_mask |= 1830 + MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_MKEY_UPDATE_TAG; 1827 1831 1828 1832 return 0; 1829 1833 }
+1 -1
drivers/infiniband/hw/mlx5/mem.c
··· 30 30 * SOFTWARE. 31 31 */ 32 32 33 - #include <rdma/ib_umem.h> 34 33 #include <rdma/ib_umem_odp.h> 35 34 #include "mlx5_ib.h" 36 35 #include <linux/jiffies.h> ··· 151 152 for (i = 0; i < 8; i++) 152 153 mlx5_write64(&mmio_wqe[i * 2], 153 154 bf->bfreg->map + bf->offset + i * 8); 155 + io_stop_wc(); 154 156 155 157 bf->offset ^= bf->buf_size; 156 158
+36
drivers/infiniband/hw/mlx5/mlx5_ib.h
··· 1563 1563 return ts_cap == MLX5_TIMESTAMP_FORMAT_CAP_REAL_TIME || 1564 1564 ts_cap == MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME; 1565 1565 } 1566 + 1567 + /* 1568 + * PCI Peer to Peer is a trainwreck. If no switch is present then things 1569 + * sometimes work, depending on the pci_distance_p2p logic for excluding broken 1570 + * root complexes. However if a switch is present in the path, then things get 1571 + * really ugly depending on how the switch is setup. This table assumes that the 1572 + * root complex is strict and is validating that all req/reps are matches 1573 + * perfectly - so any scenario where it sees only half the transaction is a 1574 + * failure. 1575 + * 1576 + * CR/RR/DT ATS RO P2P 1577 + * 00X X X OK 1578 + * 010 X X fails (request is routed to root but root never sees comp) 1579 + * 011 0 X fails (request is routed to root but root never sees comp) 1580 + * 011 1 X OK 1581 + * 10X X 1 OK 1582 + * 101 X 0 fails (completion is routed to root but root didn't see req) 1583 + * 110 X 0 SLOW 1584 + * 111 0 0 SLOW 1585 + * 111 1 0 fails (completion is routed to root but root didn't see req) 1586 + * 111 1 1 OK 1587 + * 1588 + * Unfortunately we cannot reliably know if a switch is present or what the 1589 + * CR/RR/DT ACS settings are, as in a VM that is all hidden. Assume that 1590 + * CR/RR/DT is 111 if the ATS cap is enabled and follow the last three rows. 1591 + * 1592 + * For now assume if the umem is a dma_buf then it is P2P. 1593 + */ 1594 + static inline bool mlx5_umem_needs_ats(struct mlx5_ib_dev *dev, 1595 + struct ib_umem *umem, int access_flags) 1596 + { 1597 + if (!MLX5_CAP_GEN(dev->mdev, ats) || !umem->is_dmabuf) 1598 + return false; 1599 + return access_flags & IB_ACCESS_RELAXED_ORDERING; 1600 + } 1601 + 1566 1602 #endif /* MLX5_IB_H */
+4 -4
drivers/infiniband/hw/mlx5/mr.c
··· 39 39 #include <linux/delay.h> 40 40 #include <linux/dma-buf.h> 41 41 #include <linux/dma-resv.h> 42 - #include <rdma/ib_umem.h> 43 42 #include <rdma/ib_umem_odp.h> 44 - #include <rdma/ib_verbs.h> 45 43 #include "dm.h" 46 44 #include "mlx5_ib.h" 47 45 #include "umr.h" ··· 935 937 * cache then synchronously create an uncached one. 936 938 */ 937 939 if (!ent || ent->limit == 0 || 938 - !mlx5r_umr_can_reconfig(dev, 0, access_flags)) { 940 + !mlx5r_umr_can_reconfig(dev, 0, access_flags) || 941 + mlx5_umem_needs_ats(dev, umem, access_flags)) { 939 942 mutex_lock(&dev->slow_path_mutex); 940 943 mr = reg_create(pd, umem, iova, access_flags, page_size, false); 941 944 mutex_unlock(&dev->slow_path_mutex); ··· 1017 1018 MLX5_SET(mkc, mkc, translations_octword_size, 1018 1019 get_octo_len(iova, umem->length, mr->page_shift)); 1019 1020 MLX5_SET(mkc, mkc, log_page_size, mr->page_shift); 1021 + if (mlx5_umem_needs_ats(dev, umem, access_flags)) 1022 + MLX5_SET(mkc, mkc, ma_translation_mode, 1); 1020 1023 if (populate) { 1021 1024 MLX5_SET(create_mkey_in, in, translations_octword_actual_size, 1022 1025 get_octo_len(iova, umem->length, mr->page_shift)); ··· 1403 1402 upd_flags |= MLX5_IB_UPD_XLT_ACCESS; 1404 1403 } 1405 1404 1406 - mr->ibmr.length = new_umem->length; 1407 1405 mr->ibmr.iova = iova; 1408 1406 mr->ibmr.length = new_umem->length; 1409 1407 mr->page_shift = order_base_2(page_size);
+2 -2
drivers/infiniband/hw/mlx5/odp.c
··· 30 30 * SOFTWARE. 31 31 */ 32 32 33 - #include <rdma/ib_umem.h> 34 33 #include <rdma/ib_umem_odp.h> 35 34 #include <linux/kernel.h> 36 35 #include <linux/dma-buf.h> ··· 794 795 { 795 796 if (!mmkey) 796 797 return false; 797 - if (mmkey->type == MLX5_MKEY_MW) 798 + if (mmkey->type == MLX5_MKEY_MW || 799 + mmkey->type == MLX5_MKEY_INDIRECT_DEVX) 798 800 return mlx5_base_mkey(mmkey->key) == mlx5_base_mkey(key); 799 801 return mmkey->key == key; 800 802 }
+1 -1
drivers/infiniband/hw/mthca/mthca_cmd.c
··· 1252 1252 1253 1253 if (be16_to_cpup(vsd + VSD_OFFSET_SIG1) == VSD_SIGNATURE_TOPSPIN && 1254 1254 be16_to_cpup(vsd + VSD_OFFSET_SIG2) == VSD_SIGNATURE_TOPSPIN) { 1255 - strlcpy(board_id, vsd + VSD_OFFSET_TS_BOARD_ID, MTHCA_BOARD_ID_LEN); 1255 + strscpy(board_id, vsd + VSD_OFFSET_TS_BOARD_ID, MTHCA_BOARD_ID_LEN); 1256 1256 } else { 1257 1257 /* 1258 1258 * The board ID is a string but the firmware byte
+1 -1
drivers/infiniband/hw/ocrdma/ocrdma_hw.c
··· 1363 1363 dev->hba_port_num = (hba_attribs->ptpnum_maxdoms_hbast_cv & 1364 1364 OCRDMA_HBA_ATTRB_PTNUM_MASK) 1365 1365 >> OCRDMA_HBA_ATTRB_PTNUM_SHIFT; 1366 - strlcpy(dev->model_number, 1366 + strscpy(dev->model_number, 1367 1367 hba_attribs->controller_model_number, 1368 1368 sizeof(dev->model_number)); 1369 1369 }
+1 -1
drivers/infiniband/hw/qib/qib_iba7322.c
··· 2124 2124 2125 2125 if (hwerrs & HWE_MASK(PowerOnBISTFailed)) { 2126 2126 isfatal = 1; 2127 - strlcpy(msg, 2127 + strscpy(msg, 2128 2128 "[Memory BIST test failed, InfiniPath hardware unusable]", 2129 2129 msgl); 2130 2130 /* ignore from now on, so disable until driver reloaded */
+1 -1
drivers/infiniband/hw/qib/qib_pcie.c
··· 295 295 * Setup pcie interrupt stuff again after a reset. I'd like to just call 296 296 * pci_enable_msi() again for msi, but when I do that, 297 297 * the MSI enable bit doesn't get set in the command word, and 298 - * we switch to to a different interrupt vector, which is confusing, 298 + * we switch to a different interrupt vector, which is confusing, 299 299 * so I instead just do it all inline. Perhaps somehow can tie this 300 300 * into the PCIe hotplug support at some point 301 301 */
-3
drivers/infiniband/hw/usnic/usnic_uiom.c
··· 95 95 int ret; 96 96 int off; 97 97 int i; 98 - int flags; 99 98 dma_addr_t pa; 100 99 unsigned int gup_flags; 101 100 struct mm_struct *mm; ··· 131 132 goto out; 132 133 } 133 134 134 - flags = IOMMU_READ | IOMMU_CACHE; 135 - flags |= (writable) ? IOMMU_WRITE : 0; 136 135 gup_flags = FOLL_WRITE; 137 136 gup_flags |= (writable) ? 0 : FOLL_FORCE; 138 137 cur_base = addr & PAGE_MASK;
+2 -2
drivers/infiniband/sw/rdmavt/vt.c
··· 15 15 MODULE_LICENSE("Dual BSD/GPL"); 16 16 MODULE_DESCRIPTION("RDMA Verbs Transport Library"); 17 17 18 - static int rvt_init(void) 18 + static int __init rvt_init(void) 19 19 { 20 20 int ret = rvt_driver_cq_init(); 21 21 ··· 26 26 } 27 27 module_init(rvt_init); 28 28 29 - static void rvt_cleanup(void) 29 + static void __exit rvt_cleanup(void) 30 30 { 31 31 rvt_cq_exit(); 32 32 }
+1 -11
drivers/infiniband/sw/rxe/rxe_icrc.c
··· 151 151 payload_size(pkt) + bth_pad(pkt)); 152 152 icrc = ~icrc; 153 153 154 - if (unlikely(icrc != pkt_icrc)) { 155 - if (skb->protocol == htons(ETH_P_IPV6)) 156 - pr_warn_ratelimited("bad ICRC from %pI6c\n", 157 - &ipv6_hdr(skb)->saddr); 158 - else if (skb->protocol == htons(ETH_P_IP)) 159 - pr_warn_ratelimited("bad ICRC from %pI4\n", 160 - &ip_hdr(skb)->saddr); 161 - else 162 - pr_warn_ratelimited("bad ICRC from unknown\n"); 163 - 154 + if (unlikely(icrc != pkt_icrc)) 164 155 return -EINVAL; 165 - } 166 156 167 157 return 0; 168 158 }
+3 -3
drivers/infiniband/sw/rxe/rxe_loc.h
··· 64 64 65 65 /* rxe_mr.c */ 66 66 u8 rxe_get_next_key(u32 last_key); 67 - void rxe_mr_init_dma(struct rxe_pd *pd, int access, struct rxe_mr *mr); 68 - int rxe_mr_init_user(struct rxe_pd *pd, u64 start, u64 length, u64 iova, 67 + void rxe_mr_init_dma(int access, struct rxe_mr *mr); 68 + int rxe_mr_init_user(struct rxe_dev *rxe, u64 start, u64 length, u64 iova, 69 69 int access, struct rxe_mr *mr); 70 - int rxe_mr_init_fast(struct rxe_pd *pd, int max_pages, struct rxe_mr *mr); 70 + int rxe_mr_init_fast(int max_pages, struct rxe_mr *mr); 71 71 int rxe_mr_copy(struct rxe_mr *mr, u64 iova, void *addr, int length, 72 72 enum rxe_mr_copy_dir dir); 73 73 int copy_data(struct rxe_pd *pd, int access, struct rxe_dma_info *dma,
+8 -14
drivers/infiniband/sw/rxe/rxe_mr.c
··· 32 32 33 33 case IB_MR_TYPE_USER: 34 34 case IB_MR_TYPE_MEM_REG: 35 - if (iova < mr->iova || length > mr->length || 36 - iova > mr->iova + mr->length - length) 35 + if (iova < mr->ibmr.iova || length > mr->ibmr.length || 36 + iova > mr->ibmr.iova + mr->ibmr.length - length) 37 37 return -EFAULT; 38 38 return 0; 39 39 ··· 103 103 return -ENOMEM; 104 104 } 105 105 106 - void rxe_mr_init_dma(struct rxe_pd *pd, int access, struct rxe_mr *mr) 106 + void rxe_mr_init_dma(int access, struct rxe_mr *mr) 107 107 { 108 108 rxe_mr_init(access, mr); 109 109 110 - mr->ibmr.pd = &pd->ibpd; 111 110 mr->access = access; 112 111 mr->state = RXE_MR_STATE_VALID; 113 112 mr->type = IB_MR_TYPE_DMA; 114 113 } 115 114 116 - int rxe_mr_init_user(struct rxe_pd *pd, u64 start, u64 length, u64 iova, 115 + int rxe_mr_init_user(struct rxe_dev *rxe, u64 start, u64 length, u64 iova, 117 116 int access, struct rxe_mr *mr) 118 117 { 119 118 struct rxe_map **map; ··· 124 125 int err; 125 126 int i; 126 127 127 - umem = ib_umem_get(pd->ibpd.device, start, length, access); 128 + umem = ib_umem_get(&rxe->ib_dev, start, length, access); 128 129 if (IS_ERR(umem)) { 129 130 pr_warn("%s: Unable to pin memory region err = %d\n", 130 131 __func__, (int)PTR_ERR(umem)); ··· 174 175 } 175 176 } 176 177 177 - mr->ibmr.pd = &pd->ibpd; 178 178 mr->umem = umem; 179 179 mr->access = access; 180 - mr->length = length; 181 - mr->iova = iova; 182 - mr->va = start; 183 180 mr->offset = ib_umem_offset(umem); 184 181 mr->state = RXE_MR_STATE_VALID; 185 182 mr->type = IB_MR_TYPE_USER; ··· 192 197 return err; 193 198 } 194 199 195 - int rxe_mr_init_fast(struct rxe_pd *pd, int max_pages, struct rxe_mr *mr) 200 + int rxe_mr_init_fast(int max_pages, struct rxe_mr *mr) 196 201 { 197 202 int err; 198 203 ··· 203 208 if (err) 204 209 goto err1; 205 210 206 - mr->ibmr.pd = &pd->ibpd; 207 211 mr->max_buf = max_pages; 208 212 mr->state = RXE_MR_STATE_FREE; 209 213 mr->type = IB_MR_TYPE_MEM_REG; ··· 216 222 static void lookup_iova(struct rxe_mr *mr, u64 iova, int *m_out, int *n_out, 217 223 size_t *offset_out) 218 224 { 219 - size_t offset = iova - mr->iova + mr->offset; 225 + size_t offset = iova - mr->ibmr.iova + mr->offset; 220 226 int map_index; 221 227 int buf_index; 222 228 u64 length; ··· 599 605 mr->access = access; 600 606 mr->lkey = key; 601 607 mr->rkey = (access & IB_ACCESS_REMOTE) ? key : 0; 602 - mr->iova = wqe->wr.wr.reg.mr->iova; 608 + mr->ibmr.iova = wqe->wr.wr.reg.mr->iova; 603 609 mr->state = RXE_MR_STATE_VALID; 604 610 605 611 return 0;
+3 -3
drivers/infiniband/sw/rxe/rxe_mw.c
··· 114 114 115 115 /* C10-75 */ 116 116 if (mw->access & IB_ZERO_BASED) { 117 - if (unlikely(wqe->wr.wr.mw.length > mr->length)) { 117 + if (unlikely(wqe->wr.wr.mw.length > mr->ibmr.length)) { 118 118 pr_err_once( 119 119 "attempt to bind a ZB MW outside of the MR\n"); 120 120 return -EINVAL; 121 121 } 122 122 } else { 123 - if (unlikely((wqe->wr.wr.mw.addr < mr->iova) || 123 + if (unlikely((wqe->wr.wr.mw.addr < mr->ibmr.iova) || 124 124 ((wqe->wr.wr.mw.addr + wqe->wr.wr.mw.length) > 125 - (mr->iova + mr->length)))) { 125 + (mr->ibmr.iova + mr->ibmr.length)))) { 126 126 pr_err_once( 127 127 "attempt to bind a VA MW outside of the MR\n"); 128 128 return -EINVAL;
-1
drivers/infiniband/sw/rxe/rxe_net.c
··· 145 145 goto drop; 146 146 147 147 if (skb_linearize(skb)) { 148 - pr_err("skb_linearize failed\n"); 149 148 ib_device_put(&rxe->ib_dev); 150 149 goto drop; 151 150 }
+32 -29
drivers/infiniband/sw/rxe/rxe_qp.c
··· 19 19 int has_srq) 20 20 { 21 21 if (cap->max_send_wr > rxe->attr.max_qp_wr) { 22 - pr_warn("invalid send wr = %d > %d\n", 23 - cap->max_send_wr, rxe->attr.max_qp_wr); 22 + pr_debug("invalid send wr = %u > %d\n", 23 + cap->max_send_wr, rxe->attr.max_qp_wr); 24 24 goto err1; 25 25 } 26 26 27 27 if (cap->max_send_sge > rxe->attr.max_send_sge) { 28 - pr_warn("invalid send sge = %d > %d\n", 29 - cap->max_send_sge, rxe->attr.max_send_sge); 28 + pr_debug("invalid send sge = %u > %d\n", 29 + cap->max_send_sge, rxe->attr.max_send_sge); 30 30 goto err1; 31 31 } 32 32 33 33 if (!has_srq) { 34 34 if (cap->max_recv_wr > rxe->attr.max_qp_wr) { 35 - pr_warn("invalid recv wr = %d > %d\n", 36 - cap->max_recv_wr, rxe->attr.max_qp_wr); 35 + pr_debug("invalid recv wr = %u > %d\n", 36 + cap->max_recv_wr, rxe->attr.max_qp_wr); 37 37 goto err1; 38 38 } 39 39 40 40 if (cap->max_recv_sge > rxe->attr.max_recv_sge) { 41 - pr_warn("invalid recv sge = %d > %d\n", 42 - cap->max_recv_sge, rxe->attr.max_recv_sge); 41 + pr_debug("invalid recv sge = %u > %d\n", 42 + cap->max_recv_sge, rxe->attr.max_recv_sge); 43 43 goto err1; 44 44 } 45 45 } 46 46 47 47 if (cap->max_inline_data > rxe->max_inline_data) { 48 - pr_warn("invalid max inline data = %d > %d\n", 49 - cap->max_inline_data, rxe->max_inline_data); 48 + pr_debug("invalid max inline data = %u > %d\n", 49 + cap->max_inline_data, rxe->max_inline_data); 50 50 goto err1; 51 51 } 52 52 ··· 73 73 } 74 74 75 75 if (!init->recv_cq || !init->send_cq) { 76 - pr_warn("missing cq\n"); 76 + pr_debug("missing cq\n"); 77 77 goto err1; 78 78 } 79 79 ··· 82 82 83 83 if (init->qp_type == IB_QPT_GSI) { 84 84 if (!rdma_is_port_valid(&rxe->ib_dev, port_num)) { 85 - pr_warn("invalid port = %d\n", port_num); 85 + pr_debug("invalid port = %d\n", port_num); 86 86 goto err1; 87 87 } 88 88 89 89 port = &rxe->port; 90 90 91 91 if (init->qp_type == IB_QPT_GSI && port->qp_gsi_index) { 92 - pr_warn("GSI QP exists for port %d\n", port_num); 92 + pr_debug("GSI QP exists for port %d\n", port_num); 93 93 goto err1; 94 94 } 95 95 } ··· 242 242 243 243 skb_queue_head_init(&qp->req_pkts); 244 244 245 - rxe_init_task(rxe, &qp->req.task, qp, 245 + rxe_init_task(&qp->req.task, qp, 246 246 rxe_requester, "req"); 247 - rxe_init_task(rxe, &qp->comp.task, qp, 247 + rxe_init_task(&qp->comp.task, qp, 248 248 rxe_completer, "comp"); 249 249 250 250 qp->qp_timeout_jiffies = 0; /* Can't be set for UD/UC in modify_qp */ ··· 292 292 293 293 skb_queue_head_init(&qp->resp_pkts); 294 294 295 - rxe_init_task(rxe, &qp->resp.task, qp, 295 + rxe_init_task(&qp->resp.task, qp, 296 296 rxe_responder, "resp"); 297 297 298 298 qp->resp.opcode = OPCODE_NONE; ··· 402 402 attr->qp_state : cur_state; 403 403 404 404 if (!ib_modify_qp_is_ok(cur_state, new_state, qp_type(qp), mask)) { 405 - pr_warn("invalid mask or state for qp\n"); 405 + pr_debug("invalid mask or state for qp\n"); 406 406 goto err1; 407 407 } 408 408 ··· 416 416 417 417 if (mask & IB_QP_PORT) { 418 418 if (!rdma_is_port_valid(&rxe->ib_dev, attr->port_num)) { 419 - pr_warn("invalid port %d\n", attr->port_num); 419 + pr_debug("invalid port %d\n", attr->port_num); 420 420 goto err1; 421 421 } 422 422 } ··· 431 431 if (rxe_av_chk_attr(rxe, &attr->alt_ah_attr)) 432 432 goto err1; 433 433 if (!rdma_is_port_valid(&rxe->ib_dev, attr->alt_port_num)) { 434 - pr_warn("invalid alt port %d\n", attr->alt_port_num); 434 + pr_debug("invalid alt port %d\n", attr->alt_port_num); 435 435 goto err1; 436 436 } 437 437 if (attr->alt_timeout > 31) { 438 - pr_warn("invalid QP alt timeout %d > 31\n", 439 - attr->alt_timeout); 438 + pr_debug("invalid QP alt timeout %d > 31\n", 439 + attr->alt_timeout); 440 440 goto err1; 441 441 } 442 442 } ··· 457 457 458 458 if (mask & IB_QP_MAX_QP_RD_ATOMIC) { 459 459 if (attr->max_rd_atomic > rxe->attr.max_qp_rd_atom) { 460 - pr_warn("invalid max_rd_atomic %d > %d\n", 461 - attr->max_rd_atomic, 462 - rxe->attr.max_qp_rd_atom); 460 + pr_debug("invalid max_rd_atomic %d > %d\n", 461 + attr->max_rd_atomic, 462 + rxe->attr.max_qp_rd_atom); 463 463 goto err1; 464 464 } 465 465 } 466 466 467 467 if (mask & IB_QP_TIMEOUT) { 468 468 if (attr->timeout > 31) { 469 - pr_warn("invalid QP timeout %d > 31\n", 470 - attr->timeout); 469 + pr_debug("invalid QP timeout %d > 31\n", attr->timeout); 471 470 goto err1; 472 471 } 473 472 } ··· 796 797 rxe_cleanup_task(&qp->comp.task); 797 798 798 799 /* flush out any receive wr's or pending requests */ 799 - __rxe_do_task(&qp->req.task); 800 + if (qp->req.task.func) 801 + __rxe_do_task(&qp->req.task); 802 + 800 803 if (qp->sq.queue) { 801 804 __rxe_do_task(&qp->comp.task); 802 805 __rxe_do_task(&qp->req.task); ··· 834 833 835 834 free_rd_atomic_resources(qp); 836 835 837 - kernel_sock_shutdown(qp->sk, SHUT_RDWR); 838 - sock_release(qp->sk); 836 + if (qp->sk) { 837 + kernel_sock_shutdown(qp->sk, SHUT_RDWR); 838 + sock_release(qp->sk); 839 + } 839 840 } 840 841 841 842 /* called when the last reference to the qp is dropped */
+7 -5
drivers/infiniband/sw/rxe/rxe_queue.c
··· 112 112 unsigned int num_elem) 113 113 { 114 114 enum queue_type type = q->type; 115 + u32 new_prod; 115 116 u32 prod; 116 117 u32 cons; 117 118 118 119 if (!queue_empty(q, q->type) && (num_elem < queue_count(q, type))) 119 120 return -EINVAL; 120 121 121 - prod = queue_get_producer(new_q, type); 122 + new_prod = queue_get_producer(new_q, type); 123 + prod = queue_get_producer(q, type); 122 124 cons = queue_get_consumer(q, type); 123 125 124 - while (!queue_empty(q, type)) { 125 - memcpy(queue_addr_from_index(new_q, prod), 126 + while ((prod - cons) & q->index_mask) { 127 + memcpy(queue_addr_from_index(new_q, new_prod), 126 128 queue_addr_from_index(q, cons), new_q->elem_size); 127 - prod = queue_next_index(new_q, prod); 129 + new_prod = queue_next_index(new_q, new_prod); 128 130 cons = queue_next_index(q, cons); 129 131 } 130 132 131 - new_q->buf->producer_index = prod; 133 + new_q->buf->producer_index = new_prod; 132 134 q->buf->consumer_index = cons; 133 135 134 136 /* update private index copies */
+27 -79
drivers/infiniband/sw/rxe/rxe_recv.c
··· 16 16 unsigned int pkt_type; 17 17 18 18 if (unlikely(!qp->valid)) 19 - goto err1; 19 + return -EINVAL; 20 20 21 21 pkt_type = pkt->opcode & 0xe0; 22 22 23 23 switch (qp_type(qp)) { 24 24 case IB_QPT_RC: 25 - if (unlikely(pkt_type != IB_OPCODE_RC)) { 26 - pr_warn_ratelimited("bad qp type\n"); 27 - goto err1; 28 - } 25 + if (unlikely(pkt_type != IB_OPCODE_RC)) 26 + return -EINVAL; 29 27 break; 30 28 case IB_QPT_UC: 31 - if (unlikely(pkt_type != IB_OPCODE_UC)) { 32 - pr_warn_ratelimited("bad qp type\n"); 33 - goto err1; 34 - } 29 + if (unlikely(pkt_type != IB_OPCODE_UC)) 30 + return -EINVAL; 35 31 break; 36 32 case IB_QPT_UD: 37 33 case IB_QPT_GSI: 38 - if (unlikely(pkt_type != IB_OPCODE_UD)) { 39 - pr_warn_ratelimited("bad qp type\n"); 40 - goto err1; 41 - } 34 + if (unlikely(pkt_type != IB_OPCODE_UD)) 35 + return -EINVAL; 42 36 break; 43 37 default: 44 - pr_warn_ratelimited("unsupported qp type\n"); 45 - goto err1; 38 + return -EINVAL; 46 39 } 47 40 48 41 if (pkt->mask & RXE_REQ_MASK) { 49 42 if (unlikely(qp->resp.state != QP_STATE_READY)) 50 - goto err1; 43 + return -EINVAL; 51 44 } else if (unlikely(qp->req.state < QP_STATE_READY || 52 - qp->req.state > QP_STATE_DRAINED)) { 53 - goto err1; 54 - } 45 + qp->req.state > QP_STATE_DRAINED)) 46 + return -EINVAL; 55 47 56 48 return 0; 57 - 58 - err1: 59 - return -EINVAL; 60 49 } 61 50 62 51 static void set_bad_pkey_cntr(struct rxe_port *port) ··· 73 84 pkt->pkey_index = 0; 74 85 75 86 if (!pkey_match(pkey, IB_DEFAULT_PKEY_FULL)) { 76 - pr_warn_ratelimited("bad pkey = 0x%x\n", pkey); 77 87 set_bad_pkey_cntr(port); 78 - goto err1; 88 + return -EINVAL; 79 89 } 80 90 81 91 if (qp_type(qp) == IB_QPT_UD || qp_type(qp) == IB_QPT_GSI) { 82 92 u32 qkey = (qpn == 1) ? GSI_QKEY : qp->attr.qkey; 83 93 84 94 if (unlikely(deth_qkey(pkt) != qkey)) { 85 - pr_warn_ratelimited("bad qkey, got 0x%x expected 0x%x for qpn 0x%x\n", 86 - deth_qkey(pkt), qkey, qpn); 87 95 set_qkey_viol_cntr(port); 88 - goto err1; 96 + return -EINVAL; 89 97 } 90 98 } 91 99 92 100 return 0; 93 - 94 - err1: 95 - return -EINVAL; 96 101 } 97 102 98 103 static int check_addr(struct rxe_dev *rxe, struct rxe_pkt_info *pkt, ··· 95 112 struct sk_buff *skb = PKT_TO_SKB(pkt); 96 113 97 114 if (qp_type(qp) != IB_QPT_RC && qp_type(qp) != IB_QPT_UC) 98 - goto done; 115 + return 0; 99 116 100 - if (unlikely(pkt->port_num != qp->attr.port_num)) { 101 - pr_warn_ratelimited("port %d != qp port %d\n", 102 - pkt->port_num, qp->attr.port_num); 103 - goto err1; 104 - } 117 + if (unlikely(pkt->port_num != qp->attr.port_num)) 118 + return -EINVAL; 105 119 106 120 if (skb->protocol == htons(ETH_P_IP)) { 107 121 struct in_addr *saddr = ··· 106 126 struct in_addr *daddr = 107 127 &qp->pri_av.dgid_addr._sockaddr_in.sin_addr; 108 128 109 - if (ip_hdr(skb)->daddr != saddr->s_addr) { 110 - pr_warn_ratelimited("dst addr %pI4 != qp source addr %pI4\n", 111 - &ip_hdr(skb)->daddr, 112 - &saddr->s_addr); 113 - goto err1; 114 - } 115 - 116 - if (ip_hdr(skb)->saddr != daddr->s_addr) { 117 - pr_warn_ratelimited("source addr %pI4 != qp dst addr %pI4\n", 118 - &ip_hdr(skb)->saddr, 119 - &daddr->s_addr); 120 - goto err1; 121 - } 129 + if ((ip_hdr(skb)->daddr != saddr->s_addr) || 130 + (ip_hdr(skb)->saddr != daddr->s_addr)) 131 + return -EINVAL; 122 132 123 133 } else if (skb->protocol == htons(ETH_P_IPV6)) { 124 134 struct in6_addr *saddr = ··· 116 146 struct in6_addr *daddr = 117 147 &qp->pri_av.dgid_addr._sockaddr_in6.sin6_addr; 118 148 119 - if (memcmp(&ipv6_hdr(skb)->daddr, saddr, sizeof(*saddr))) { 120 - pr_warn_ratelimited("dst addr %pI6 != qp source addr %pI6\n", 121 - &ipv6_hdr(skb)->daddr, saddr); 122 - goto err1; 123 - } 124 - 125 - if (memcmp(&ipv6_hdr(skb)->saddr, daddr, sizeof(*daddr))) { 126 - pr_warn_ratelimited("source addr %pI6 != qp dst addr %pI6\n", 127 - &ipv6_hdr(skb)->saddr, daddr); 128 - goto err1; 129 - } 149 + if (memcmp(&ipv6_hdr(skb)->daddr, saddr, sizeof(*saddr)) || 150 + memcmp(&ipv6_hdr(skb)->saddr, daddr, sizeof(*daddr))) 151 + return -EINVAL; 130 152 } 131 153 132 - done: 133 154 return 0; 134 - 135 - err1: 136 - return -EINVAL; 137 155 } 138 156 139 157 static int hdr_check(struct rxe_pkt_info *pkt) ··· 133 175 int index; 134 176 int err; 135 177 136 - if (unlikely(bth_tver(pkt) != BTH_TVER)) { 137 - pr_warn_ratelimited("bad tver\n"); 178 + if (unlikely(bth_tver(pkt) != BTH_TVER)) 138 179 goto err1; 139 - } 140 180 141 - if (unlikely(qpn == 0)) { 142 - pr_warn_once("QP 0 not supported"); 181 + if (unlikely(qpn == 0)) 143 182 goto err1; 144 - } 145 183 146 184 if (qpn != IB_MULTICAST_QPN) { 147 185 index = (qpn == 1) ? port->qp_gsi_index : qpn; 148 186 149 187 qp = rxe_pool_get_index(&rxe->qp_pool, index); 150 - if (unlikely(!qp)) { 151 - pr_warn_ratelimited("no qp matches qpn 0x%x\n", qpn); 188 + if (unlikely(!qp)) 152 189 goto err1; 153 - } 154 190 155 191 err = check_type_state(rxe, pkt, qp); 156 192 if (unlikely(err)) ··· 158 206 if (unlikely(err)) 159 207 goto err2; 160 208 } else { 161 - if (unlikely((pkt->mask & RXE_GRH_MASK) == 0)) { 162 - pr_warn_ratelimited("no grh for mcast qpn\n"); 209 + if (unlikely((pkt->mask & RXE_GRH_MASK) == 0)) 163 210 goto err1; 164 - } 165 211 } 166 212 167 213 pkt->qp = qp; ··· 314 364 if (unlikely(skb->len < RXE_BTH_BYTES)) 315 365 goto drop; 316 366 317 - if (rxe_chk_dgid(rxe, skb) < 0) { 318 - pr_warn_ratelimited("failed checking dgid\n"); 367 + if (rxe_chk_dgid(rxe, skb) < 0) 319 368 goto drop; 320 - } 321 369 322 370 pkt->opcode = bth_opcode(pkt); 323 371 pkt->psn = bth_psn(pkt);
+20 -33
drivers/infiniband/sw/rxe/rxe_resp.c
··· 809 809 if (!skb) 810 810 return RESPST_ERR_RNR; 811 811 812 - err = rxe_mr_copy(mr, res->read.va, payload_addr(&ack_pkt), 813 - payload, RXE_FROM_MR_OBJ); 814 - if (err) 815 - pr_err("Failed copying memory\n"); 812 + rxe_mr_copy(mr, res->read.va, payload_addr(&ack_pkt), 813 + payload, RXE_FROM_MR_OBJ); 816 814 if (mr) 817 815 rxe_put(mr); 818 816 ··· 821 823 } 822 824 823 825 err = rxe_xmit_packet(qp, &ack_pkt, skb); 824 - if (err) { 825 - pr_err("Failed sending RDMA reply.\n"); 826 + if (err) 826 827 return RESPST_ERR_RNR; 827 - } 828 828 829 829 res->read.va += payload; 830 830 res->read.resid -= payload; ··· 1024 1028 return RESPST_CLEANUP; 1025 1029 } 1026 1030 1027 - static int send_ack(struct rxe_qp *qp, u8 syndrome, u32 psn) 1031 + 1032 + static int send_common_ack(struct rxe_qp *qp, u8 syndrome, u32 psn, 1033 + int opcode, const char *msg) 1028 1034 { 1029 - int err = 0; 1035 + int err; 1030 1036 struct rxe_pkt_info ack_pkt; 1031 1037 struct sk_buff *skb; 1032 1038 1033 - skb = prepare_ack_packet(qp, &ack_pkt, IB_OPCODE_RC_ACKNOWLEDGE, 1034 - 0, psn, syndrome); 1035 - if (!skb) { 1036 - err = -ENOMEM; 1037 - goto err1; 1038 - } 1039 + skb = prepare_ack_packet(qp, &ack_pkt, opcode, 0, psn, syndrome); 1040 + if (!skb) 1041 + return -ENOMEM; 1039 1042 1040 1043 err = rxe_xmit_packet(qp, &ack_pkt, skb); 1041 1044 if (err) 1042 - pr_err_ratelimited("Failed sending ack\n"); 1045 + pr_err_ratelimited("Failed sending %s\n", msg); 1043 1046 1044 - err1: 1045 1047 return err; 1048 + } 1049 + 1050 + static int send_ack(struct rxe_qp *qp, u8 syndrome, u32 psn) 1051 + { 1052 + return send_common_ack(qp, syndrome, psn, 1053 + IB_OPCODE_RC_ACKNOWLEDGE, "ACK"); 1046 1054 } 1047 1055 1048 1056 static int send_atomic_ack(struct rxe_qp *qp, u8 syndrome, u32 psn) 1049 1057 { 1050 - int err = 0; 1051 - struct rxe_pkt_info ack_pkt; 1052 - struct sk_buff *skb; 1053 - 1054 - skb = prepare_ack_packet(qp, &ack_pkt, IB_OPCODE_RC_ATOMIC_ACKNOWLEDGE, 1055 - 0, psn, syndrome); 1056 - if (!skb) { 1057 - err = -ENOMEM; 1058 - goto out; 1059 - } 1060 - 1061 - err = rxe_xmit_packet(qp, &ack_pkt, skb); 1062 - if (err) 1063 - pr_err_ratelimited("Failed sending atomic ack\n"); 1058 + int ret = send_common_ack(qp, syndrome, psn, 1059 + IB_OPCODE_RC_ATOMIC_ACKNOWLEDGE, "ATOMIC ACK"); 1064 1060 1065 1061 /* have to clear this since it is used to trigger 1066 1062 * long read replies 1067 1063 */ 1068 1064 qp->resp.res = NULL; 1069 - out: 1070 - return err; 1065 + return ret; 1071 1066 } 1072 1067 1073 1068 static enum resp_states acknowledge(struct rxe_qp *qp,
+1 -2
drivers/infiniband/sw/rxe/rxe_task.c
··· 94 94 task->ret = ret; 95 95 } 96 96 97 - int rxe_init_task(void *obj, struct rxe_task *task, 97 + int rxe_init_task(struct rxe_task *task, 98 98 void *arg, int (*func)(void *), char *name) 99 99 { 100 - task->obj = obj; 101 100 task->arg = arg; 102 101 task->func = func; 103 102 snprintf(task->name, sizeof(task->name), "%s", name);
+1 -2
drivers/infiniband/sw/rxe/rxe_task.h
··· 19 19 * called again. 20 20 */ 21 21 struct rxe_task { 22 - void *obj; 23 22 struct tasklet_struct tasklet; 24 23 int state; 25 24 spinlock_t state_lock; /* spinlock for task state */ ··· 34 35 * arg => parameter to pass to fcn 35 36 * func => function to call until it returns != 0 36 37 */ 37 - int rxe_init_task(void *obj, struct rxe_task *task, 38 + int rxe_init_task(struct rxe_task *task, 38 39 void *arg, int (*func)(void *), char *name); 39 40 40 41 /* cleanup task */
+8 -11
drivers/infiniband/sw/rxe/rxe_verbs.c
··· 262 262 263 263 recv_wqe = queue_producer_addr(rq->queue, QUEUE_TYPE_TO_DRIVER); 264 264 recv_wqe->wr_id = ibwr->wr_id; 265 - recv_wqe->num_sge = num_sge; 266 265 267 266 memcpy(recv_wqe->dma.sge, ibwr->sg_list, 268 267 num_sge * sizeof(struct ib_sge)); ··· 525 526 const struct ib_send_wr *ibwr) 526 527 { 527 528 wr->wr_id = ibwr->wr_id; 528 - wr->num_sge = ibwr->num_sge; 529 529 wr->opcode = ibwr->opcode; 530 530 wr->send_flags = ibwr->send_flags; 531 531 ··· 901 903 return ERR_PTR(-ENOMEM); 902 904 903 905 rxe_get(pd); 904 - rxe_mr_init_dma(pd, access, mr); 906 + mr->ibmr.pd = ibpd; 907 + 908 + rxe_mr_init_dma(access, mr); 905 909 rxe_finalize(mr); 906 910 907 911 return &mr->ibmr; ··· 928 928 929 929 930 930 rxe_get(pd); 931 + mr->ibmr.pd = ibpd; 931 932 932 - err = rxe_mr_init_user(pd, start, length, iova, access, mr); 933 + err = rxe_mr_init_user(rxe, start, length, iova, access, mr); 933 934 if (err) 934 935 goto err3; 935 936 ··· 939 938 return &mr->ibmr; 940 939 941 940 err3: 942 - rxe_put(pd); 943 941 rxe_cleanup(mr); 944 942 err2: 945 943 return ERR_PTR(err); ··· 962 962 } 963 963 964 964 rxe_get(pd); 965 + mr->ibmr.pd = ibpd; 965 966 966 - err = rxe_mr_init_fast(pd, max_num_sg, mr); 967 + err = rxe_mr_init_fast(max_num_sg, mr); 967 968 if (err) 968 969 goto err2; 969 970 ··· 973 972 return &mr->ibmr; 974 973 975 974 err2: 976 - rxe_put(pd); 977 975 rxe_cleanup(mr); 978 976 err1: 979 977 return ERR_PTR(err); ··· 1007 1007 1008 1008 n = ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, rxe_set_page); 1009 1009 1010 - mr->va = ibmr->iova; 1011 - mr->iova = ibmr->iova; 1012 - mr->length = ibmr->length; 1013 1010 mr->page_shift = ilog2(ibmr->page_size); 1014 1011 mr->page_mask = ibmr->page_size - 1; 1015 - mr->offset = mr->iova & mr->page_mask; 1012 + mr->offset = ibmr->iova & mr->page_mask; 1016 1013 1017 1014 return n; 1018 1015 }
-3
drivers/infiniband/sw/rxe/rxe_verbs.h
··· 305 305 u32 rkey; 306 306 enum rxe_mr_state state; 307 307 enum ib_mr_type type; 308 - u64 va; 309 - u64 iova; 310 - size_t length; 311 308 u32 offset; 312 309 int access; 313 310
+4 -1
drivers/infiniband/sw/siw/Kconfig
··· 1 1 config RDMA_SIW 2 2 tristate "Software RDMA over TCP/IP (iWARP) driver" 3 - depends on INET && INFINIBAND && LIBCRC32C 3 + depends on INET && INFINIBAND 4 4 depends on INFINIBAND_VIRT_DMA 5 + select LIBCRC32C 6 + select CRYPTO 7 + select CRYPTO_CRC32C 5 8 help 6 9 This driver implements the iWARP RDMA transport over 7 10 the Linux TCP/IP network stack. It enables a system with a
+1
drivers/infiniband/sw/siw/siw.h
··· 418 418 struct ib_qp base_qp; 419 419 struct siw_device *sdev; 420 420 struct kref ref; 421 + struct completion qp_free; 421 422 struct list_head devq; 422 423 int tx_cpu; 423 424 struct siw_qp_attrs attrs;
+1 -1
drivers/infiniband/sw/siw/siw_qp.c
··· 1342 1342 vfree(qp->orq); 1343 1343 1344 1344 siw_put_tx_cpu(qp->tx_cpu); 1345 - 1345 + complete(&qp->qp_free); 1346 1346 atomic_dec(&sdev->num_qp); 1347 1347 }
+16 -13
drivers/infiniband/sw/siw/siw_qp_rx.c
··· 961 961 static int siw_get_trailer(struct siw_qp *qp, struct siw_rx_stream *srx) 962 962 { 963 963 struct sk_buff *skb = srx->skb; 964 + int avail = min(srx->skb_new, srx->fpdu_part_rem); 964 965 u8 *tbuf = (u8 *)&srx->trailer.crc - srx->pad; 965 966 __wsum crc_in, crc_own = 0; 966 967 967 968 siw_dbg_qp(qp, "expected %d, available %d, pad %u\n", 968 969 srx->fpdu_part_rem, srx->skb_new, srx->pad); 969 970 970 - if (srx->skb_new < srx->fpdu_part_rem) 971 + skb_copy_bits(skb, srx->skb_offset, tbuf, avail); 972 + 973 + srx->skb_new -= avail; 974 + srx->skb_offset += avail; 975 + srx->skb_copied += avail; 976 + srx->fpdu_part_rem -= avail; 977 + 978 + if (srx->fpdu_part_rem) 971 979 return -EAGAIN; 972 - 973 - skb_copy_bits(skb, srx->skb_offset, tbuf, srx->fpdu_part_rem); 974 - 975 - if (srx->mpa_crc_hd && srx->pad) 976 - crypto_shash_update(srx->mpa_crc_hd, tbuf, srx->pad); 977 - 978 - srx->skb_new -= srx->fpdu_part_rem; 979 - srx->skb_offset += srx->fpdu_part_rem; 980 - srx->skb_copied += srx->fpdu_part_rem; 981 980 982 981 if (!srx->mpa_crc_hd) 983 982 return 0; 984 983 984 + if (srx->pad) 985 + crypto_shash_update(srx->mpa_crc_hd, tbuf, srx->pad); 985 986 /* 986 987 * CRC32 is computed, transmitted and received directly in NBO, 987 988 * so there's never a reason to convert byte order. ··· 1084 1083 * completely received. 1085 1084 */ 1086 1085 if (iwarp_pktinfo[opcode].hdr_len > sizeof(struct iwarp_ctrl_tagged)) { 1087 - bytes = iwarp_pktinfo[opcode].hdr_len - MIN_DDP_HDR; 1086 + int hdrlen = iwarp_pktinfo[opcode].hdr_len; 1088 1087 1089 - if (srx->skb_new < bytes) 1090 - return -EAGAIN; 1088 + bytes = min_t(int, hdrlen - MIN_DDP_HDR, srx->skb_new); 1091 1089 1092 1090 skb_copy_bits(skb, srx->skb_offset, 1093 1091 (char *)c_hdr + srx->fpdu_part_rcvd, bytes); ··· 1096 1096 srx->skb_new -= bytes; 1097 1097 srx->skb_offset += bytes; 1098 1098 srx->skb_copied += bytes; 1099 + 1100 + if (srx->fpdu_part_rcvd < hdrlen) 1101 + return -EAGAIN; 1099 1102 } 1100 1103 1101 1104 /*
+3
drivers/infiniband/sw/siw/siw_verbs.c
··· 480 480 list_add_tail(&qp->devq, &sdev->qp_list); 481 481 spin_unlock_irqrestore(&sdev->lock, flags); 482 482 483 + init_completion(&qp->qp_free); 484 + 483 485 return 0; 484 486 485 487 err_out_xa: ··· 626 624 qp->scq = qp->rcq = NULL; 627 625 628 626 siw_qp_put(qp); 627 + wait_for_completion(&qp->qp_free); 629 628 630 629 return 0; 631 630 }
+2 -2
drivers/infiniband/ulp/ipoib/ipoib_cm.c
··· 884 884 goto err_cm; 885 885 } 886 886 887 - ret = ib_cm_listen(priv->cm.id, cpu_to_be64(IPOIB_CM_IETF_ID | priv->qp->qp_num), 888 - 0); 887 + ret = ib_cm_listen(priv->cm.id, 888 + cpu_to_be64(IPOIB_CM_IETF_ID | priv->qp->qp_num)); 889 889 if (ret) { 890 890 pr_warn("%s: failed to listen on ID 0x%llx\n", priv->ca->name, 891 891 IPOIB_CM_IETF_ID | priv->qp->qp_num);
+2 -2
drivers/infiniband/ulp/ipoib/ipoib_ethtool.c
··· 65 65 66 66 ib_get_device_fw_str(priv->ca, drvinfo->fw_version); 67 67 68 - strlcpy(drvinfo->bus_info, dev_name(priv->ca->dev.parent), 68 + strscpy(drvinfo->bus_info, dev_name(priv->ca->dev.parent), 69 69 sizeof(drvinfo->bus_info)); 70 70 71 - strlcpy(drvinfo->driver, "ib_ipoib", sizeof(drvinfo->driver)); 71 + strscpy(drvinfo->driver, "ib_ipoib", sizeof(drvinfo->driver)); 72 72 } 73 73 74 74 static int ipoib_get_coalesce(struct net_device *dev,
+1 -1
drivers/infiniband/ulp/ipoib/ipoib_main.c
··· 742 742 743 743 static void path_rec_completion(int status, 744 744 struct sa_path_rec *pathrec, 745 - void *path_ptr) 745 + int num_prs, void *path_ptr) 746 746 { 747 747 struct ipoib_path *path = path_ptr; 748 748 struct net_device *dev = path->dev;
+2 -2
drivers/infiniband/ulp/opa_vnic/opa_vnic_ethtool.c
··· 124 124 static void vnic_get_drvinfo(struct net_device *netdev, 125 125 struct ethtool_drvinfo *drvinfo) 126 126 { 127 - strlcpy(drvinfo->driver, opa_vnic_driver_name, sizeof(drvinfo->driver)); 128 - strlcpy(drvinfo->bus_info, dev_name(netdev->dev.parent), 127 + strscpy(drvinfo->driver, opa_vnic_driver_name, sizeof(drvinfo->driver)); 128 + strscpy(drvinfo->bus_info, dev_name(netdev->dev.parent), 129 129 sizeof(drvinfo->bus_info)); 130 130 } 131 131
+8 -2
drivers/infiniband/ulp/rtrs/Makefile
··· 1 1 # SPDX-License-Identifier: GPL-2.0-or-later 2 2 3 + CFLAGS_rtrs-clt-trace.o = -I$(src) 4 + 3 5 rtrs-client-y := rtrs-clt.o \ 4 6 rtrs-clt-stats.o \ 5 - rtrs-clt-sysfs.o 7 + rtrs-clt-sysfs.o \ 8 + rtrs-clt-trace.o 9 + 10 + CFLAGS_rtrs-srv-trace.o = -I$(src) 6 11 7 12 rtrs-server-y := rtrs-srv.o \ 8 13 rtrs-srv-stats.o \ 9 - rtrs-srv-sysfs.o 14 + rtrs-srv-sysfs.o \ 15 + rtrs-srv-trace.o 10 16 11 17 rtrs-core-y := rtrs.o 12 18
+15
drivers/infiniband/ulp/rtrs/rtrs-clt-trace.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * RDMA Network Block Driver 4 + * 5 + * Copyright (c) 2022 1&1 IONOS SE. All rights reserved. 6 + */ 7 + #include "rtrs.h" 8 + #include "rtrs-clt.h" 9 + 10 + /* 11 + * We include this last to have the helpers above available for the trace 12 + * event implementations. 13 + */ 14 + #define CREATE_TRACE_POINTS 15 + #include "rtrs-clt-trace.h"
+86
drivers/infiniband/ulp/rtrs/rtrs-clt-trace.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 2 + /* 3 + * RDMA Network Block Driver 4 + * 5 + * Copyright (c) 2022 1&1 IONOS SE. All rights reserved. 6 + */ 7 + #undef TRACE_SYSTEM 8 + #define TRACE_SYSTEM rtrs_clt 9 + 10 + #if !defined(_TRACE_RTRS_CLT_H) || defined(TRACE_HEADER_MULTI_READ) 11 + #define _TRACE_RTRS_CLT_H 12 + 13 + #include <linux/tracepoint.h> 14 + 15 + struct rtrs_clt_path; 16 + struct rtrs_clt_sess; 17 + 18 + TRACE_DEFINE_ENUM(RTRS_CLT_CONNECTING); 19 + TRACE_DEFINE_ENUM(RTRS_CLT_CONNECTING_ERR); 20 + TRACE_DEFINE_ENUM(RTRS_CLT_RECONNECTING); 21 + TRACE_DEFINE_ENUM(RTRS_CLT_CONNECTED); 22 + TRACE_DEFINE_ENUM(RTRS_CLT_CLOSING); 23 + TRACE_DEFINE_ENUM(RTRS_CLT_CLOSED); 24 + TRACE_DEFINE_ENUM(RTRS_CLT_DEAD); 25 + 26 + #define show_rtrs_clt_state(x) \ 27 + __print_symbolic(x, \ 28 + { RTRS_CLT_CONNECTING, "CONNECTING" }, \ 29 + { RTRS_CLT_CONNECTING_ERR, "CONNECTING_ERR" }, \ 30 + { RTRS_CLT_RECONNECTING, "RECONNECTING" }, \ 31 + { RTRS_CLT_CONNECTED, "CONNECTED" }, \ 32 + { RTRS_CLT_CLOSING, "CLOSING" }, \ 33 + { RTRS_CLT_CLOSED, "CLOSED" }, \ 34 + { RTRS_CLT_DEAD, "DEAD" }) 35 + 36 + DECLARE_EVENT_CLASS(rtrs_clt_conn_class, 37 + TP_PROTO(struct rtrs_clt_path *clt_path), 38 + 39 + TP_ARGS(clt_path), 40 + 41 + TP_STRUCT__entry( 42 + __field(int, state) 43 + __field(int, reconnect_attempts) 44 + __field(int, max_reconnect_attempts) 45 + __field(int, fail_cnt) 46 + __field(int, success_cnt) 47 + __array(char, sessname, NAME_MAX) 48 + ), 49 + 50 + TP_fast_assign( 51 + struct rtrs_clt_sess *clt = clt_path->clt; 52 + 53 + __entry->state = clt_path->state; 54 + __entry->reconnect_attempts = clt_path->reconnect_attempts; 55 + __entry->max_reconnect_attempts = clt->max_reconnect_attempts; 56 + __entry->fail_cnt = clt_path->stats->reconnects.fail_cnt; 57 + __entry->success_cnt = clt_path->stats->reconnects.successful_cnt; 58 + memcpy(__entry->sessname, kobject_name(&clt_path->kobj), NAME_MAX); 59 + ), 60 + 61 + TP_printk("RTRS-CLT: sess='%s' state=%s attempts='%d' max-attempts='%d' fail='%d' success='%d'", 62 + __entry->sessname, 63 + show_rtrs_clt_state(__entry->state), 64 + __entry->reconnect_attempts, 65 + __entry->max_reconnect_attempts, 66 + __entry->fail_cnt, 67 + __entry->success_cnt 68 + ) 69 + ); 70 + 71 + #define DEFINE_CLT_CONN_EVENT(name) \ 72 + DEFINE_EVENT(rtrs_clt_conn_class, rtrs_##name, \ 73 + TP_PROTO(struct rtrs_clt_path *clt_path), \ 74 + TP_ARGS(clt_path)) 75 + 76 + DEFINE_CLT_CONN_EVENT(clt_reconnect_work); 77 + DEFINE_CLT_CONN_EVENT(clt_close_conns); 78 + DEFINE_CLT_CONN_EVENT(rdma_error_recovery); 79 + 80 + #endif /* _TRACE_RTRS_CLT_H */ 81 + 82 + #undef TRACE_INCLUDE_PATH 83 + #define TRACE_INCLUDE_PATH . 84 + #define TRACE_INCLUDE_FILE rtrs-clt-trace 85 + #include <trace/define_trace.h> 86 +
+13 -13
drivers/infiniband/ulp/rtrs/rtrs-clt.c
··· 16 16 17 17 #include "rtrs-clt.h" 18 18 #include "rtrs-log.h" 19 + #include "rtrs-clt-trace.h" 19 20 20 21 #define RTRS_CONNECT_TIMEOUT_MS 30000 21 22 /* ··· 54 53 55 54 rcu_read_lock(); 56 55 list_for_each_entry_rcu(clt_path, &clt->paths_list, s.entry) 57 - connected |= READ_ONCE(clt_path->state) == RTRS_CLT_CONNECTED; 56 + if (READ_ONCE(clt_path->state) == RTRS_CLT_CONNECTED) { 57 + connected = true; 58 + break; 59 + } 58 60 rcu_read_unlock(); 59 61 60 62 return connected; ··· 305 301 static void rtrs_rdma_error_recovery(struct rtrs_clt_con *con) 306 302 { 307 303 struct rtrs_clt_path *clt_path = to_clt_path(con->c.path); 304 + 305 + trace_rtrs_rdma_error_recovery(clt_path); 308 306 309 307 if (rtrs_clt_change_state_from_to(clt_path, 310 308 RTRS_CLT_CONNECTED, ··· 1949 1943 1950 1944 void rtrs_clt_close_conns(struct rtrs_clt_path *clt_path, bool wait) 1951 1945 { 1946 + trace_rtrs_clt_close_conns(clt_path); 1947 + 1952 1948 if (rtrs_clt_change_state_get_old(clt_path, RTRS_CLT_CLOSING, NULL)) 1953 1949 queue_work(rtrs_wq, &clt_path->close_work); 1954 1950 if (wait) ··· 2221 2213 } 2222 2214 } 2223 2215 2224 - static inline bool xchg_paths(struct rtrs_clt_path __rcu **rcu_ppcpu_path, 2225 - struct rtrs_clt_path *clt_path, 2226 - struct rtrs_clt_path *next) 2227 - { 2228 - struct rtrs_clt_path **ppcpu_path; 2229 - 2230 - /* Call cmpxchg() without sparse warnings */ 2231 - ppcpu_path = (typeof(ppcpu_path))rcu_ppcpu_path; 2232 - return clt_path == cmpxchg(ppcpu_path, clt_path, next); 2233 - } 2234 - 2235 2216 static void rtrs_clt_remove_path_from_arr(struct rtrs_clt_path *clt_path) 2236 2217 { 2237 2218 struct rtrs_clt_sess *clt = clt_path->clt; ··· 2295 2298 * We race with IO code path, which also changes pointer, 2296 2299 * thus we have to be careful not to overwrite it. 2297 2300 */ 2298 - if (xchg_paths(ppcpu_path, clt_path, next)) 2301 + if (try_cmpxchg((struct rtrs_clt_path **)ppcpu_path, &clt_path, 2302 + next)) 2299 2303 /* 2300 2304 * @ppcpu_path was successfully replaced with @next, 2301 2305 * that means that someone could also pick up the ··· 2646 2648 clt_path = container_of(to_delayed_work(work), struct rtrs_clt_path, 2647 2649 reconnect_dwork); 2648 2650 clt = clt_path->clt; 2651 + 2652 + trace_rtrs_clt_reconnect_work(clt_path); 2649 2653 2650 2654 if (READ_ONCE(clt_path->state) != RTRS_CLT_RECONNECTING) 2651 2655 return;
+3 -4
drivers/infiniband/ulp/rtrs/rtrs-pri.h
··· 26 26 /* 27 27 * Max IB immediate data size is 2^28 (MAX_IMM_PAYL_BITS) 28 28 * and the minimum chunk size is 4096 (2^12). 29 - * So the maximum sess_queue_depth is 65536 (2^16) in theory. 30 - * But mempool_create, create_qp and ib_post_send fail with 31 - * "cannot allocate memory" error if sess_queue_depth is too big. 29 + * So the maximum sess_queue_depth is 65535 (2^16 - 1) in theory 30 + * since queue_depth in rtrs_msg_conn_rsp is defined as le16. 32 31 * Therefore the pratical max value of sess_queue_depth is 33 - * somewhere between 1 and 65534 and it depends on the system. 32 + * somewhere between 1 and 65535 and it depends on the system. 34 33 */ 35 34 #define MAX_SESS_QUEUE_DEPTH 65535 36 35
+16
drivers/infiniband/ulp/rtrs/rtrs-srv-trace.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * RDMA Network Block Driver 4 + * 5 + * Copyright (c) 2022 1&1 IONOS SE. All rights reserved. 6 + */ 7 + #include "rtrs.h" 8 + #include "rtrs-pri.h" 9 + #include "rtrs-srv.h" 10 + 11 + /* 12 + * We include this last to have the helpers above available for the trace 13 + * event implementations. 14 + */ 15 + #define CREATE_TRACE_POINTS 16 + #include "rtrs-srv-trace.h"
+88
drivers/infiniband/ulp/rtrs/rtrs-srv-trace.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 2 + /* 3 + * RDMA Network Block Driver 4 + * 5 + * Copyright (c) 2022 1&1 IONOS SE. All rights reserved. 6 + */ 7 + #undef TRACE_SYSTEM 8 + #define TRACE_SYSTEM rtrs_srv 9 + 10 + #if !defined(_TRACE_RTRS_SRV_H) || defined(TRACE_HEADER_MULTI_READ) 11 + #define _TRACE_RTRS_SRV_H 12 + 13 + #include <linux/tracepoint.h> 14 + 15 + struct rtrs_srv_op; 16 + struct rtrs_srv_con; 17 + struct rtrs_srv_path; 18 + 19 + TRACE_DEFINE_ENUM(RTRS_SRV_CONNECTING); 20 + TRACE_DEFINE_ENUM(RTRS_SRV_CONNECTED); 21 + TRACE_DEFINE_ENUM(RTRS_SRV_CLOSING); 22 + TRACE_DEFINE_ENUM(RTRS_SRV_CLOSED); 23 + 24 + #define show_rtrs_srv_state(x) \ 25 + __print_symbolic(x, \ 26 + { RTRS_SRV_CONNECTING, "CONNECTING" }, \ 27 + { RTRS_SRV_CONNECTED, "CONNECTED" }, \ 28 + { RTRS_SRV_CLOSING, "CLOSING" }, \ 29 + { RTRS_SRV_CLOSED, "CLOSED" }) 30 + 31 + TRACE_EVENT(send_io_resp_imm, 32 + TP_PROTO(struct rtrs_srv_op *id, 33 + bool need_inval, 34 + bool always_invalidate, 35 + int errno), 36 + 37 + TP_ARGS(id, need_inval, always_invalidate, errno), 38 + 39 + TP_STRUCT__entry( 40 + __field(u8, dir) 41 + __field(bool, need_inval) 42 + __field(bool, always_invalidate) 43 + __field(u32, msg_id) 44 + __field(int, wr_cnt) 45 + __field(u32, signal_interval) 46 + __field(int, state) 47 + __field(int, errno) 48 + __array(char, sessname, NAME_MAX) 49 + ), 50 + 51 + TP_fast_assign( 52 + struct rtrs_srv_con *con = id->con; 53 + struct rtrs_path *s = con->c.path; 54 + struct rtrs_srv_path *srv_path = to_srv_path(s); 55 + 56 + __entry->dir = id->dir; 57 + __entry->state = srv_path->state; 58 + __entry->errno = errno; 59 + __entry->need_inval = need_inval; 60 + __entry->always_invalidate = always_invalidate; 61 + __entry->msg_id = id->msg_id; 62 + __entry->wr_cnt = atomic_read(&con->c.wr_cnt); 63 + __entry->signal_interval = s->signal_interval; 64 + memcpy(__entry->sessname, kobject_name(&srv_path->kobj), NAME_MAX); 65 + ), 66 + 67 + TP_printk("sess='%s' state='%s' dir=%s err='%d' inval='%d' glob-inval='%d' msgid='%u' wrcnt='%d' sig-interval='%u'", 68 + __entry->sessname, 69 + show_rtrs_srv_state(__entry->state), 70 + __print_symbolic(__entry->dir, 71 + { READ, "READ" }, 72 + { WRITE, "WRITE" }), 73 + __entry->errno, 74 + __entry->need_inval, 75 + __entry->always_invalidate, 76 + __entry->msg_id, 77 + __entry->wr_cnt, 78 + __entry->signal_interval 79 + ) 80 + ); 81 + 82 + #endif /* _TRACE_RTRS_SRV_H */ 83 + 84 + #undef TRACE_INCLUDE_PATH 85 + #define TRACE_INCLUDE_PATH . 86 + #define TRACE_INCLUDE_FILE rtrs-srv-trace 87 + #include <trace/define_trace.h> 88 +
+5 -7
drivers/infiniband/ulp/rtrs/rtrs-srv.c
··· 16 16 #include "rtrs-log.h" 17 17 #include <rdma/ib_cm.h> 18 18 #include <rdma/ib_verbs.h> 19 + #include "rtrs-srv-trace.h" 19 20 20 21 MODULE_DESCRIPTION("RDMA Transport Server"); 21 22 MODULE_LICENSE("GPL"); ··· 56 55 static inline struct rtrs_srv_con *to_srv_con(struct rtrs_con *c) 57 56 { 58 57 return container_of(c, struct rtrs_srv_con, c); 59 - } 60 - 61 - static inline struct rtrs_srv_path *to_srv_path(struct rtrs_path *s) 62 - { 63 - return container_of(s, struct rtrs_srv_path, s); 64 58 } 65 59 66 60 static bool rtrs_srv_change_state(struct rtrs_srv_path *srv_path, ··· 370 374 } 371 375 } 372 376 } 377 + 378 + trace_send_io_resp_imm(id, need_inval, always_invalidate, errno); 373 379 374 380 if (need_inval && always_invalidate) { 375 381 wr = &inv_wr; ··· 1022 1024 usr_len = le16_to_cpu(msg->usr_len); 1023 1025 data_len = off - usr_len; 1024 1026 data = page_address(srv->chunks[buf_id]); 1025 - ret = ctx->ops.rdma_ev(srv->priv, id, READ, data, data_len, 1027 + ret = ctx->ops.rdma_ev(srv->priv, id, data, data_len, 1026 1028 data + data_len, usr_len); 1027 1029 1028 1030 if (ret) { ··· 1075 1077 usr_len = le16_to_cpu(req->usr_len); 1076 1078 data_len = off - usr_len; 1077 1079 data = page_address(srv->chunks[buf_id]); 1078 - ret = ctx->ops.rdma_ev(srv->priv, id, WRITE, data, data_len, 1080 + ret = ctx->ops.rdma_ev(srv->priv, id, data, data_len, 1079 1081 data + data_len, usr_len); 1080 1082 if (ret) { 1081 1083 rtrs_err_rl(s,
+5
drivers/infiniband/ulp/rtrs/rtrs-srv.h
··· 91 91 struct rtrs_srv_stats *stats; 92 92 }; 93 93 94 + static inline struct rtrs_srv_path *to_srv_path(struct rtrs_path *s) 95 + { 96 + return container_of(s, struct rtrs_srv_path, s); 97 + } 98 + 94 99 struct rtrs_srv_sess { 95 100 struct list_head paths_list; 96 101 int paths_up;
+1 -1
drivers/infiniband/ulp/rtrs/rtrs.c
··· 175 175 * length error 176 176 */ 177 177 for (i = 0; i < num_sge; i++) 178 - if (WARN_ON(sge[i].length == 0)) 178 + if (WARN_ONCE(sge[i].length == 0, "sg %d is zero length\n", i)) 179 179 return -EINVAL; 180 180 181 181 return rtrs_post_send(con->qp, head, &wr.wr, tail);
+1 -2
drivers/infiniband/ulp/rtrs/rtrs.h
··· 139 139 140 140 * @priv: Private data set by rtrs_srv_set_sess_priv() 141 141 * @id: internal RTRS operation id 142 - * @dir: READ/WRITE 143 142 * @data: Pointer to (bidirectional) rdma memory area: 144 143 * - in case of %RTRS_SRV_RDMA_EV_RECV contains 145 144 * data sent by the client ··· 150 151 * @usrlen: Size of the user message 151 152 */ 152 153 int (*rdma_ev)(void *priv, 153 - struct rtrs_srv_op *id, int dir, 154 + struct rtrs_srv_op *id, 154 155 void *data, size_t datalen, const void *usr, 155 156 size_t usrlen); 156 157 /**
+33 -33
drivers/infiniband/ulp/srp/ib_srp.c
··· 699 699 700 700 static void srp_path_rec_completion(int status, 701 701 struct sa_path_rec *pathrec, 702 - void *ch_ptr) 702 + int num_paths, void *ch_ptr) 703 703 { 704 704 struct srp_rdma_ch *ch = ch_ptr; 705 705 struct srp_target_port *target = ch->target; ··· 2789 2789 static int srp_abort(struct scsi_cmnd *scmnd) 2790 2790 { 2791 2791 struct srp_target_port *target = host_to_target(scmnd->device->host); 2792 - struct srp_request *req = (struct srp_request *) scmnd->host_scribble; 2792 + struct srp_request *req = scsi_cmd_priv(scmnd); 2793 2793 u32 tag; 2794 2794 u16 ch_idx; 2795 2795 struct srp_rdma_ch *ch; ··· 2797 2797 2798 2798 shost_printk(KERN_ERR, target->scsi_host, "SRP abort called\n"); 2799 2799 2800 - if (!req) 2801 - return SUCCESS; 2802 2800 tag = blk_mq_unique_tag(scsi_cmd_to_rq(scmnd)); 2803 2801 ch_idx = blk_mq_unique_tag_to_hwq(tag); 2804 2802 if (WARN_ON_ONCE(ch_idx >= target->ch_count)) ··· 2989 2991 { 2990 2992 struct srp_target_port *target = host_to_target(class_to_shost(dev)); 2991 2993 2992 - return sysfs_emit(buf, "%d\n", target->srp_host->port); 2994 + return sysfs_emit(buf, "%u\n", target->srp_host->port); 2993 2995 } 2994 2996 2995 2997 static DEVICE_ATTR_RO(local_ib_port); ··· 3177 3179 struct srp_host *host = 3178 3180 container_of(dev, struct srp_host, dev); 3179 3181 3180 - complete(&host->released); 3182 + kfree(host); 3181 3183 } 3184 + 3185 + static struct attribute *srp_class_attrs[]; 3186 + 3187 + ATTRIBUTE_GROUPS(srp_class); 3182 3188 3183 3189 static struct class srp_class = { 3184 3190 .name = "infiniband_srp", 3191 + .dev_groups = srp_class_groups, 3185 3192 .dev_release = srp_release_dev 3186 3193 }; 3187 3194 ··· 3887 3884 { 3888 3885 struct srp_host *host = container_of(dev, struct srp_host, dev); 3889 3886 3890 - return sysfs_emit(buf, "%d\n", host->port); 3887 + return sysfs_emit(buf, "%u\n", host->port); 3891 3888 } 3892 3889 3893 3890 static DEVICE_ATTR_RO(port); 3894 3891 3895 - static struct srp_host *srp_add_port(struct srp_device *device, u8 port) 3892 + static struct attribute *srp_class_attrs[] = { 3893 + &dev_attr_add_target.attr, 3894 + &dev_attr_ibdev.attr, 3895 + &dev_attr_port.attr, 3896 + NULL 3897 + }; 3898 + 3899 + static struct srp_host *srp_add_port(struct srp_device *device, u32 port) 3896 3900 { 3897 3901 struct srp_host *host; 3898 3902 ··· 3909 3899 3910 3900 INIT_LIST_HEAD(&host->target_list); 3911 3901 spin_lock_init(&host->target_lock); 3912 - init_completion(&host->released); 3913 3902 mutex_init(&host->add_target_mutex); 3914 3903 host->srp_dev = device; 3915 3904 host->port = port; 3916 3905 3906 + device_initialize(&host->dev); 3917 3907 host->dev.class = &srp_class; 3918 3908 host->dev.parent = device->dev->dev.parent; 3919 - dev_set_name(&host->dev, "srp-%s-%d", dev_name(&device->dev->dev), 3920 - port); 3921 - 3922 - if (device_register(&host->dev)) 3923 - goto free_host; 3924 - if (device_create_file(&host->dev, &dev_attr_add_target)) 3925 - goto err_class; 3926 - if (device_create_file(&host->dev, &dev_attr_ibdev)) 3927 - goto err_class; 3928 - if (device_create_file(&host->dev, &dev_attr_port)) 3929 - goto err_class; 3909 + if (dev_set_name(&host->dev, "srp-%s-%u", dev_name(&device->dev->dev), 3910 + port)) 3911 + goto put_host; 3912 + if (device_add(&host->dev)) 3913 + goto put_host; 3930 3914 3931 3915 return host; 3932 3916 3933 - err_class: 3934 - device_unregister(&host->dev); 3935 - 3936 - free_host: 3937 - kfree(host); 3938 - 3917 + put_host: 3918 + device_del(&host->dev); 3919 + put_device(&host->dev); 3939 3920 return NULL; 3940 3921 } 3941 3922 ··· 3938 3937 list_for_each_entry_safe(host, tmp_host, &srp_dev->dev_list, list) { 3939 3938 char name[IB_DEVICE_NAME_MAX + 8]; 3940 3939 3941 - snprintf(name, sizeof(name), "srp-%s-%d", 3940 + snprintf(name, sizeof(name), "srp-%s-%u", 3942 3941 dev_name(&device->dev), host->port); 3943 3942 device_rename(&host->dev, name); 3944 3943 } ··· 3950 3949 struct ib_device_attr *attr = &device->attrs; 3951 3950 struct srp_host *host; 3952 3951 int mr_page_shift; 3953 - unsigned int p; 3952 + u32 p; 3954 3953 u64 max_pages_per_mr; 3955 3954 unsigned int flags = 0; 3956 3955 ··· 4032 4031 srp_dev = client_data; 4033 4032 4034 4033 list_for_each_entry_safe(host, tmp_host, &srp_dev->dev_list, list) { 4035 - device_unregister(&host->dev); 4036 4034 /* 4037 - * Wait for the sysfs entry to go away, so that no new 4038 - * target ports can be created. 4035 + * Remove the add_target sysfs entry so that no new target ports 4036 + * can be created. 4039 4037 */ 4040 - wait_for_completion(&host->released); 4038 + device_del(&host->dev); 4041 4039 4042 4040 /* 4043 4041 * Remove all target ports. ··· 4054 4054 */ 4055 4055 flush_workqueue(srp_remove_wq); 4056 4056 4057 - kfree(host); 4057 + put_device(&host->dev); 4058 4058 } 4059 4059 4060 4060 ib_dealloc_pd(srp_dev->pd);
+1 -2
drivers/infiniband/ulp/srp/ib_srp.h
··· 120 120 */ 121 121 struct srp_host { 122 122 struct srp_device *srp_dev; 123 - u8 port; 123 + u32 port; 124 124 struct device dev; 125 125 struct list_head target_list; 126 126 spinlock_t target_lock; 127 - struct completion released; 128 127 struct list_head list; 129 128 struct mutex add_target_mutex; 130 129 };
+3 -3
drivers/infiniband/ulp/srpt/ib_srpt.c
··· 1421 1421 1422 1422 srp_rsp->flags |= SRP_RSP_FLAG_SNSVALID; 1423 1423 srp_rsp->sense_data_len = cpu_to_be32(sense_data_len); 1424 - memcpy(srp_rsp + 1, sense_data, sense_data_len); 1424 + memcpy(srp_rsp->data, sense_data, sense_data_len); 1425 1425 } 1426 1426 1427 1427 return sizeof(*srp_rsp) + sense_data_len; ··· 2300 2300 goto free_recv_ring; 2301 2301 } 2302 2302 2303 - strlcpy(ch->sess_name, src_addr, sizeof(ch->sess_name)); 2303 + strscpy(ch->sess_name, src_addr, sizeof(ch->sess_name)); 2304 2304 snprintf(i_port_id, sizeof(i_port_id), "0x%016llx%016llx", 2305 2305 be64_to_cpu(*(__be64 *)nexus->i_port_id), 2306 2306 be64_to_cpu(*(__be64 *)(nexus->i_port_id + 8))); ··· 3191 3191 * if this HCA is gone bad and replaced by different HCA 3192 3192 */ 3193 3193 ret = sdev->cm_id ? 3194 - ib_cm_listen(sdev->cm_id, cpu_to_be64(srpt_service_guid), 0) : 3194 + ib_cm_listen(sdev->cm_id, cpu_to_be64(srpt_service_guid)) : 3195 3195 0; 3196 3196 if (ret < 0) { 3197 3197 pr_err("ib_cm_listen() failed: %d (cm_id state = %d)\n", ret,
+8 -3
include/linux/mlx5/mlx5_ifc.h
··· 1757 1757 u8 steering_format_version[0x4]; 1758 1758 u8 create_qp_start_hint[0x18]; 1759 1759 1760 - u8 reserved_at_460[0x3]; 1760 + u8 reserved_at_460[0x1]; 1761 + u8 ats[0x1]; 1762 + u8 reserved_at_462[0x1]; 1761 1763 u8 log_max_uctx[0x5]; 1762 1764 u8 reserved_at_468[0x2]; 1763 1765 u8 ipsec_offload[0x1]; ··· 3941 3939 u8 lw[0x1]; 3942 3940 u8 lr[0x1]; 3943 3941 u8 access_mode_1_0[0x2]; 3944 - u8 reserved_at_18[0x8]; 3942 + u8 reserved_at_18[0x2]; 3943 + u8 ma_translation_mode[0x2]; 3944 + u8 reserved_at_1c[0x4]; 3945 3945 3946 3946 u8 qpn[0x18]; 3947 3947 u8 mkey_7_0[0x8]; ··· 11218 11214 struct mlx5_ifc_umem_bits { 11219 11215 u8 reserved_at_0[0x80]; 11220 11216 11221 - u8 reserved_at_80[0x1b]; 11217 + u8 ats[0x1]; 11218 + u8 reserved_at_81[0x1a]; 11222 11219 u8 log_page_size[0x5]; 11223 11220 11224 11221 u8 page_offset[0x20];
+3 -7
include/rdma/ib_cm.h
··· 294 294 void *context; 295 295 struct ib_device *device; 296 296 __be64 service_id; 297 - __be64 service_mask; 298 297 enum ib_cm_state state; /* internal CM/debug use */ 299 298 enum ib_cm_lap_state lap_state; /* internal CM/debug use */ 300 299 __be32 local_id; ··· 339 340 * and service ID resolution requests. The service ID should be specified 340 341 * network-byte order. If set to IB_CM_ASSIGN_SERVICE_ID, the CM will 341 342 * assign a service ID to the caller. 342 - * @service_mask: Mask applied to service ID used to listen across a 343 - * range of service IDs. If set to 0, the service ID is matched 344 - * exactly. This parameter is ignored if %service_id is set to 345 - * IB_CM_ASSIGN_SERVICE_ID. 346 343 */ 347 - int ib_cm_listen(struct ib_cm_id *cm_id, __be64 service_id, 348 - __be64 service_mask); 344 + int ib_cm_listen(struct ib_cm_id *cm_id, __be64 service_id); 349 345 350 346 struct ib_cm_id *ib_cm_insert_listen(struct ib_device *device, 351 347 ib_cm_handler cm_handler, ··· 348 354 349 355 struct ib_cm_req_param { 350 356 struct sa_path_rec *primary_path; 357 + struct sa_path_rec *primary_path_inbound; 358 + struct sa_path_rec *primary_path_outbound; 351 359 struct sa_path_rec *alternate_path; 352 360 const struct ib_gid_attr *ppath_sgid_attr; 353 361 __be64 service_id;
+2 -1
include/rdma/ib_sa.h
··· 186 186 struct sa_path_rec_opa opa; 187 187 }; 188 188 enum sa_path_rec_type rec_type; 189 + u32 flags; 189 190 }; 190 191 191 192 static inline enum ib_gid_type ··· 414 413 ib_sa_comp_mask comp_mask, unsigned long timeout_ms, 415 414 gfp_t gfp_mask, 416 415 void (*callback)(int status, struct sa_path_rec *resp, 417 - void *context), 416 + int num_prs, void *context), 418 417 void *context, struct ib_sa_query **query); 419 418 420 419 struct ib_sa_multicast {
+12 -1
include/rdma/rdma_cm.h
··· 49 49 struct rdma_dev_addr dev_addr; 50 50 }; 51 51 52 + #define RDMA_PRIMARY_PATH_MAX_REC_NUM 3 52 53 struct rdma_route { 53 54 struct rdma_addr addr; 54 55 struct sa_path_rec *path_rec; 55 - int num_paths; 56 + 57 + /* Optional path records of primary path */ 58 + struct sa_path_rec *path_rec_inbound; 59 + struct sa_path_rec *path_rec_outbound; 60 + 61 + /* 62 + * 0 - No primary nor alternate path is available 63 + * 1 - Only primary path is available 64 + * 2 - Both primary and alternate path are available 65 + */ 66 + int num_pri_alt_paths; 56 67 }; 57 68 58 69 struct rdma_conn_param {
+1 -1
include/rdma/rdma_vt.h
··· 445 445 * to work by setting the name manually here. 446 446 */ 447 447 dev_set_name(&rdi->ibdev.dev, fmt, name, unit); 448 - strlcpy(rdi->ibdev.name, dev_name(&rdi->ibdev.dev), IB_DEVICE_NAME_MAX); 448 + strscpy(rdi->ibdev.name, dev_name(&rdi->ibdev.dev), IB_DEVICE_NAME_MAX); 449 449 } 450 450 451 451 /**
+13
include/rdma/uverbs_ioctl.h
··· 24 24 UVERBS_ATTR_TYPE_PTR_OUT, 25 25 UVERBS_ATTR_TYPE_IDR, 26 26 UVERBS_ATTR_TYPE_FD, 27 + UVERBS_ATTR_TYPE_RAW_FD, 27 28 UVERBS_ATTR_TYPE_ENUM_IN, 28 29 UVERBS_ATTR_TYPE_IDRS_ARRAY, 29 30 }; ··· 522 521 .u.obj.access = _access, \ 523 522 __VA_ARGS__ } }) 524 523 524 + #define UVERBS_ATTR_RAW_FD(_attr_id, ...) \ 525 + (&(const struct uverbs_attr_def){ \ 526 + .id = (_attr_id), \ 527 + .attr = { .type = UVERBS_ATTR_TYPE_RAW_FD, __VA_ARGS__ } }) 528 + 525 529 #define UVERBS_ATTR_PTR_IN(_attr_id, _type, ...) \ 526 530 (&(const struct uverbs_attr_def){ \ 527 531 .id = _attr_id, \ ··· 1004 998 _default) : \ 1005 999 uverbs_get_const_default_unsigned(_to, _attrs_bundle, _idx, \ 1006 1000 _default)) 1001 + 1002 + static inline int 1003 + uverbs_get_raw_fd(int *to, const struct uverbs_attr_bundle *attrs_bundle, 1004 + size_t idx) 1005 + { 1006 + return uverbs_get_const_signed(to, attrs_bundle, idx); 1007 + } 1007 1008 1008 1009 #endif
+3 -1
include/uapi/rdma/efa-abi.h
··· 1 1 /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause) */ 2 2 /* 3 - * Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All rights reserved. 3 + * Copyright 2018-2022 Amazon.com, Inc. or its affiliates. All rights reserved. 4 4 */ 5 5 6 6 #ifndef EFA_ABI_USER_H ··· 54 54 55 55 enum { 56 56 EFA_CREATE_CQ_WITH_COMPLETION_CHANNEL = 1 << 0, 57 + EFA_CREATE_CQ_WITH_SGID = 1 << 1, 57 58 }; 58 59 59 60 struct efa_ibv_create_cq { ··· 119 118 EFA_QUERY_DEVICE_CAPS_RDMA_READ = 1 << 0, 120 119 EFA_QUERY_DEVICE_CAPS_RNR_RETRY = 1 << 1, 121 120 EFA_QUERY_DEVICE_CAPS_CQ_NOTIFICATIONS = 1 << 2, 121 + EFA_QUERY_DEVICE_CAPS_CQ_WITH_SGID = 1 << 3, 122 122 }; 123 123 124 124 struct efa_ibv_ex_query_device_resp {
+1
include/uapi/rdma/mlx5-abi.h
··· 104 104 MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_ECE = 1UL << 2, 105 105 MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_SQD2RTS = 1UL << 3, 106 106 MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_REAL_TIME_TS = 1UL << 4, 107 + MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_MKEY_UPDATE_TAG = 1UL << 5, 107 108 }; 108 109 109 110 enum mlx5_user_cmds_supp_uhw {
+1
include/uapi/rdma/mlx5_user_ioctl_cmds.h
··· 174 174 MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS, 175 175 MLX5_IB_ATTR_DEVX_UMEM_REG_OUT_ID, 176 176 MLX5_IB_ATTR_DEVX_UMEM_REG_PGSZ_BITMAP, 177 + MLX5_IB_ATTR_DEVX_UMEM_REG_DMABUF_FD, 177 178 }; 178 179 179 180 enum mlx5_ib_devx_umem_dereg_attrs {
+2 -2
include/uapi/rdma/rdma_user_rxe.h
··· 74 74 75 75 struct rxe_send_wr { 76 76 __aligned_u64 wr_id; 77 - __u32 num_sge; 77 + __u32 reserved; 78 78 __u32 opcode; 79 79 __u32 send_flags; 80 80 union { ··· 166 166 167 167 struct rxe_recv_wqe { 168 168 __aligned_u64 wr_id; 169 - __u32 num_sge; 169 + __u32 reserved; 170 170 __u32 padding; 171 171 struct rxe_dma_info dma; 172 172 };