]> Git Repo - linux.git/blobdiff - drivers/infiniband/core/sa_query.c
powerpc/64s/hash: convert SLB miss handlers to C
[linux.git] / drivers / infiniband / core / sa_query.c
index 7005afb8a71263a5fa7bfb6151a02c541f39d171..7b794a14d6e851fbc4afc82711ecdb6ecf336c61 100644 (file)
@@ -1227,13 +1227,9 @@ static u8 get_src_path_mask(struct ib_device *device, u8 port_num)
        return src_path_mask;
 }
 
-static int
-roce_resolve_route_from_path(struct ib_device *device, u8 port_num,
-                            struct sa_path_rec *rec,
-                            const struct ib_gid_attr *attr)
+static int roce_resolve_route_from_path(struct sa_path_rec *rec,
+                                       const struct ib_gid_attr *attr)
 {
-       struct net_device *resolved_dev;
-       struct net_device *idev;
        struct rdma_dev_addr dev_addr = {};
        union {
                struct sockaddr     _sockaddr;
@@ -1253,9 +1249,6 @@ roce_resolve_route_from_path(struct ib_device *device, u8 port_num,
         */
        dev_addr.net = &init_net;
 
-       if (!device->get_netdev)
-               return -EOPNOTSUPP;
-
        rdma_gid2ip(&sgid_addr._sockaddr, &rec->sgid);
        rdma_gid2ip(&dgid_addr._sockaddr, &rec->dgid);
 
@@ -1270,28 +1263,8 @@ roce_resolve_route_from_path(struct ib_device *device, u8 port_num,
            rec->rec_type != SA_PATH_REC_TYPE_ROCE_V2)
                return -EINVAL;
 
-       idev = device->get_netdev(device, port_num);
-       if (!idev)
-               return -ENODEV;
-
-       resolved_dev = dev_get_by_index(dev_addr.net,
-                                       dev_addr.bound_dev_if);
-       if (!resolved_dev) {
-               ret = -ENODEV;
-               goto done;
-       }
-       rcu_read_lock();
-       if (attr->ndev != resolved_dev ||
-           (resolved_dev != idev &&
-            !rdma_is_upper_dev_rcu(idev, resolved_dev)))
-               ret = -EHOSTUNREACH;
-       rcu_read_unlock();
-       dev_put(resolved_dev);
-done:
-       dev_put(idev);
-       if (!ret)
-               rec->roce.route_resolved = true;
-       return ret;
+       rec->roce.route_resolved = true;
+       return 0;
 }
 
 static int init_ah_attr_grh_fields(struct ib_device *device, u8 port_num,
@@ -1346,8 +1319,7 @@ int ib_init_ah_attr_from_path(struct ib_device *device, u8 port_num,
        rdma_ah_set_static_rate(ah_attr, rec->rate);
 
        if (sa_path_is_roce(rec)) {
-               ret = roce_resolve_route_from_path(device, port_num, rec,
-                                                  gid_attr);
+               ret = roce_resolve_route_from_path(rec, gid_attr);
                if (ret)
                        return ret;
 
@@ -2304,6 +2276,7 @@ static void update_sm_ah(struct work_struct *work)
        struct ib_sa_sm_ah *new_ah;
        struct ib_port_attr port_attr;
        struct rdma_ah_attr   ah_attr;
+       bool grh_required;
 
        if (ib_query_port(port->agent->device, port->port_num, &port_attr)) {
                pr_warn("Couldn't query port\n");
@@ -2328,16 +2301,27 @@ static void update_sm_ah(struct work_struct *work)
        rdma_ah_set_dlid(&ah_attr, port_attr.sm_lid);
        rdma_ah_set_sl(&ah_attr, port_attr.sm_sl);
        rdma_ah_set_port_num(&ah_attr, port->port_num);
-       if (port_attr.grh_required) {
-               if (ah_attr.type == RDMA_AH_ATTR_TYPE_OPA) {
-                       rdma_ah_set_make_grd(&ah_attr, true);
-               } else {
-                       rdma_ah_set_ah_flags(&ah_attr, IB_AH_GRH);
-                       rdma_ah_set_subnet_prefix(&ah_attr,
-                                                 cpu_to_be64(port_attr.subnet_prefix));
-                       rdma_ah_set_interface_id(&ah_attr,
-                                                cpu_to_be64(IB_SA_WELL_KNOWN_GUID));
-               }
+
+       grh_required = rdma_is_grh_required(port->agent->device,
+                                           port->port_num);
+
+       /*
+        * The OPA sm_lid of 0xFFFF needs special handling so that it can be
+        * differentiated from a permissive LID of 0xFFFF.  We set the
+        * grh_required flag here so the SA can program the DGID in the
+        * address handle appropriately
+        */
+       if (ah_attr.type == RDMA_AH_ATTR_TYPE_OPA &&
+           (grh_required ||
+            port_attr.sm_lid == be16_to_cpu(IB_LID_PERMISSIVE)))
+               rdma_ah_set_make_grd(&ah_attr, true);
+
+       if (ah_attr.type == RDMA_AH_ATTR_TYPE_IB && grh_required) {
+               rdma_ah_set_ah_flags(&ah_attr, IB_AH_GRH);
+               rdma_ah_set_subnet_prefix(&ah_attr,
+                                         cpu_to_be64(port_attr.subnet_prefix));
+               rdma_ah_set_interface_id(&ah_attr,
+                                        cpu_to_be64(IB_SA_WELL_KNOWN_GUID));
        }
 
        new_ah->ah = rdma_create_ah(port->agent->qp->pd, &ah_attr);
This page took 0.041278 seconds and 4 git commands to generate.