IB/mlx5: Use kernel driver to help userspace create ah
authorMoni Shoua <monis@mellanox.com>
Wed, 23 Nov 2016 06:23:25 +0000 (08:23 +0200)
committerDoug Ledford <dledford@redhat.com>
Tue, 13 Dec 2016 18:38:49 +0000 (13:38 -0500)
Resolving a MAC address for a given IP address in userspace is inefficient.
This patch lets mlx5 user driver using the kernel driver to resolve the mac
and get the answer in the private section of the response.

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>
drivers/infiniband/hw/mlx5/ah.c
include/uapi/rdma/mlx5-abi.h

index ecac9ea2c85fbbae5fadb8a9baa0535ef62efbb2..d090e96f6f0133ed04c0a68d53fe86f86d606508 100644 (file)
@@ -77,6 +77,27 @@ struct ib_ah *mlx5_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
        if (ll == IB_LINK_LAYER_ETHERNET && !(ah_attr->ah_flags & IB_AH_GRH))
                return ERR_PTR(-EINVAL);
 
+       if (ll == IB_LINK_LAYER_ETHERNET && udata) {
+               int err;
+               struct mlx5_ib_create_ah_resp resp = {};
+               u32 min_resp_len = offsetof(typeof(resp), dmac) +
+                                  sizeof(resp.dmac);
+
+               if (udata->outlen < min_resp_len)
+                       return ERR_PTR(-EINVAL);
+
+               resp.response_length = min_resp_len;
+
+               err = ib_resolve_eth_dmac(pd->device, ah_attr);
+               if (err)
+                       return ERR_PTR(err);
+
+               memcpy(resp.dmac, ah_attr->dmac, ETH_ALEN);
+               err = ib_copy_to_udata(udata, &resp, resp.response_length);
+               if (err)
+                       return ERR_PTR(err);
+       }
+
        ah = kzalloc(sizeof(*ah), GFP_ATOMIC);
        if (!ah)
                return ERR_PTR(-ENOMEM);
index ac28729a124518dba42ac010942596279b9a43b4..3ebf3db24c34868e19e39bc8cd296175c4b447c7 100644 (file)
@@ -249,6 +249,12 @@ struct mlx5_ib_create_wq {
        __u32   reserved;
 };
 
+struct mlx5_ib_create_ah_resp {
+       __u32   response_length;
+       __u8    dmac[ETH_ALEN];
+       __u8    reserved[6];
+};
+
 struct mlx5_ib_create_wq_resp {
        __u32   response_length;
        __u32   reserved;