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

IB/core: Change ib_resolve_eth_dmac to use it in create AH

The function ib_resolve_eth_dmac() requires struct qp_attr * and
qp_attr_mask as parameters while the function might be useful to resolve
dmac for address handles. This patch changes the signature of the
function so it can be used in the flow of creating an address handle.

Signed-off-by: Moni Shoua <monis@mellanox.com>
Reviewed-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>

authored by

Moni Shoua and committed by
Doug Ledford
c90ea9d8 2d1e697e

+48 -47
-3
drivers/infiniband/core/core_priv.h
··· 72 72 void ib_cache_setup(void); 73 73 void ib_cache_cleanup(void); 74 74 75 - int ib_resolve_eth_dmac(struct ib_qp *qp, 76 - struct ib_qp_attr *qp_attr, int *qp_attr_mask); 77 - 78 75 typedef void (*roce_netdev_callback)(struct ib_device *device, u8 port, 79 76 struct net_device *idev, void *cookie); 80 77
+5 -3
drivers/infiniband/core/uverbs_cmd.c
··· 2402 2402 attr->alt_ah_attr.port_num = cmd.alt_dest.port_num; 2403 2403 2404 2404 if (qp->real_qp == qp) { 2405 - ret = ib_resolve_eth_dmac(qp, attr, &cmd.attr_mask); 2406 - if (ret) 2407 - goto release_qp; 2405 + if (cmd.attr_mask & IB_QP_AV) { 2406 + ret = ib_resolve_eth_dmac(qp->device, &attr->ah_attr); 2407 + if (ret) 2408 + goto release_qp; 2409 + } 2408 2410 ret = qp->device->modify_qp(qp, attr, 2409 2411 modify_qp_mask(qp->qp_type, cmd.attr_mask), &udata); 2410 2412 } else {
+41 -41
drivers/infiniband/core/verbs.c
··· 1198 1198 } 1199 1199 EXPORT_SYMBOL(ib_modify_qp_is_ok); 1200 1200 1201 - int ib_resolve_eth_dmac(struct ib_qp *qp, 1202 - struct ib_qp_attr *qp_attr, int *qp_attr_mask) 1201 + int ib_resolve_eth_dmac(struct ib_device *device, 1202 + struct ib_ah_attr *ah_attr) 1203 1203 { 1204 1204 int ret = 0; 1205 1205 1206 - if (*qp_attr_mask & IB_QP_AV) { 1207 - if (qp_attr->ah_attr.port_num < rdma_start_port(qp->device) || 1208 - qp_attr->ah_attr.port_num > rdma_end_port(qp->device)) 1209 - return -EINVAL; 1206 + if (ah_attr->port_num < rdma_start_port(device) || 1207 + ah_attr->port_num > rdma_end_port(device)) 1208 + return -EINVAL; 1210 1209 1211 - if (!rdma_cap_eth_ah(qp->device, qp_attr->ah_attr.port_num)) 1212 - return 0; 1210 + if (!rdma_cap_eth_ah(device, ah_attr->port_num)) 1211 + return 0; 1213 1212 1214 - if (rdma_link_local_addr((struct in6_addr *)qp_attr->ah_attr.grh.dgid.raw)) { 1215 - rdma_get_ll_mac((struct in6_addr *)qp_attr->ah_attr.grh.dgid.raw, 1216 - qp_attr->ah_attr.dmac); 1217 - } else { 1218 - union ib_gid sgid; 1219 - struct ib_gid_attr sgid_attr; 1220 - int ifindex; 1221 - int hop_limit; 1213 + if (rdma_link_local_addr((struct in6_addr *)ah_attr->grh.dgid.raw)) { 1214 + rdma_get_ll_mac((struct in6_addr *)ah_attr->grh.dgid.raw, 1215 + ah_attr->dmac); 1216 + } else { 1217 + union ib_gid sgid; 1218 + struct ib_gid_attr sgid_attr; 1219 + int ifindex; 1220 + int hop_limit; 1222 1221 1223 - ret = ib_query_gid(qp->device, 1224 - qp_attr->ah_attr.port_num, 1225 - qp_attr->ah_attr.grh.sgid_index, 1226 - &sgid, &sgid_attr); 1222 + ret = ib_query_gid(device, 1223 + ah_attr->port_num, 1224 + ah_attr->grh.sgid_index, 1225 + &sgid, &sgid_attr); 1227 1226 1228 - if (ret || !sgid_attr.ndev) { 1229 - if (!ret) 1230 - ret = -ENXIO; 1231 - goto out; 1232 - } 1233 - 1234 - ifindex = sgid_attr.ndev->ifindex; 1235 - 1236 - ret = rdma_addr_find_l2_eth_by_grh(&sgid, 1237 - &qp_attr->ah_attr.grh.dgid, 1238 - qp_attr->ah_attr.dmac, 1239 - NULL, &ifindex, &hop_limit); 1240 - 1241 - dev_put(sgid_attr.ndev); 1242 - 1243 - qp_attr->ah_attr.grh.hop_limit = hop_limit; 1227 + if (ret || !sgid_attr.ndev) { 1228 + if (!ret) 1229 + ret = -ENXIO; 1230 + goto out; 1244 1231 } 1232 + 1233 + ifindex = sgid_attr.ndev->ifindex; 1234 + 1235 + ret = rdma_addr_find_l2_eth_by_grh(&sgid, 1236 + &ah_attr->grh.dgid, 1237 + ah_attr->dmac, 1238 + NULL, &ifindex, &hop_limit); 1239 + 1240 + dev_put(sgid_attr.ndev); 1241 + 1242 + ah_attr->grh.hop_limit = hop_limit; 1245 1243 } 1246 1244 out: 1247 1245 return ret; 1248 1246 } 1249 1247 EXPORT_SYMBOL(ib_resolve_eth_dmac); 1250 1248 1251 - 1252 1249 int ib_modify_qp(struct ib_qp *qp, 1253 1250 struct ib_qp_attr *qp_attr, 1254 1251 int qp_attr_mask) 1255 1252 { 1256 - int ret; 1257 1253 1258 - ret = ib_resolve_eth_dmac(qp, qp_attr, &qp_attr_mask); 1259 - if (ret) 1260 - return ret; 1254 + if (qp_attr_mask & IB_QP_AV) { 1255 + int ret; 1256 + 1257 + ret = ib_resolve_eth_dmac(qp->device, &qp_attr->ah_attr); 1258 + if (ret) 1259 + return ret; 1260 + } 1261 1261 1262 1262 return qp->device->modify_qp(qp->real_qp, qp_attr, qp_attr_mask, NULL); 1263 1263 }
+2
include/rdma/ib_verbs.h
··· 3394 3394 void ib_drain_sq(struct ib_qp *qp); 3395 3395 void ib_drain_qp(struct ib_qp *qp); 3396 3396 3397 + int ib_resolve_eth_dmac(struct ib_device *device, 3398 + struct ib_ah_attr *ah_attr); 3397 3399 #endif /* IB_VERBS_H */