summaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/mlx5/main.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-02-14 10:33:45 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2014-02-14 10:33:45 -0800
commite847882887ce7f969b3dcb9eeef642ad70d47b3a (patch)
tree663026eb2e99b2b5d58771c65e826473ffd9798d /drivers/infiniband/hw/mlx5/main.c
parent85643586677c877f28891200e0cb9514547af589 (diff)
parentc9459388d8b7da050de173eb85359b17ee575bd3 (diff)
downloadblackbird-obmc-linux-e847882887ce7f969b3dcb9eeef642ad70d47b3a.tar.gz
blackbird-obmc-linux-e847882887ce7f969b3dcb9eeef642ad70d47b3a.zip
Merge tag 'rdma-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband
Pull RDMA/InfiniBand fixes from Roland Dreier: - Fix some rough edges from the "IP addressing for IBoE" merge - Other misc fixes, mostly to hardware drivers * tag 'rdma-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: (21 commits) RDMA/ocrdma: Fix load time panic during GID table init RDMA/ocrdma: Fix traffic class shift IB/iser: Fix use after free in iser_snd_completion() IB/iser: Avoid dereferencing iscsi_iser conn object when not bound to iser connection IB/usnic: Fix smatch endianness error IB/mlx5: Remove dependency on X86 mlx5: Add include of <linux/slab.h> because of kzalloc()/kfree() use IB/qib: Add missing serdes init sequence RDMA/cxgb4: Add missing neigh_release in LE-Workaround path IB: Report using RoCE IP based gids in port caps IB/mlx4: Build the port IBoE GID table properly under bonding IB/mlx4: Do IBoE GID table resets per-port IB/mlx4: Do IBoE locking earlier when initializing the GID table IB/mlx4: Move rtnl locking to the right place IB/mlx4: Make sure GID index 0 is always occupied IB/mlx4: Don't allocate range of steerable UD QPs for Ethernet-only device RDMA/amso1100: Fix error return code RDMA/nes: Fix error return code IB/mlx5: Don't set "block multicast loopback" capability IB/mlx5: Fix binary compatibility with libmlx5 ...
Diffstat (limited to 'drivers/infiniband/hw/mlx5/main.c')
-rw-r--r--drivers/infiniband/hw/mlx5/main.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 9660d093f8cf..aa03e732b6a8 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -261,8 +261,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
props->device_cap_flags = IB_DEVICE_CHANGE_PHY_PORT |
IB_DEVICE_PORT_ACTIVE_EVENT |
IB_DEVICE_SYS_IMAGE_GUID |
- IB_DEVICE_RC_RNR_NAK_GEN |
- IB_DEVICE_BLOCK_MULTICAST_LOOPBACK;
+ IB_DEVICE_RC_RNR_NAK_GEN;
flags = dev->mdev.caps.flags;
if (flags & MLX5_DEV_CAP_FLAG_BAD_PKEY_CNTR)
props->device_cap_flags |= IB_DEVICE_BAD_PKEY_CNTR;
@@ -536,24 +535,38 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
struct ib_udata *udata)
{
struct mlx5_ib_dev *dev = to_mdev(ibdev);
- struct mlx5_ib_alloc_ucontext_req req;
+ struct mlx5_ib_alloc_ucontext_req_v2 req;
struct mlx5_ib_alloc_ucontext_resp resp;
struct mlx5_ib_ucontext *context;
struct mlx5_uuar_info *uuari;
struct mlx5_uar *uars;
int gross_uuars;
int num_uars;
+ int ver;
int uuarn;
int err;
int i;
+ int reqlen;
if (!dev->ib_active)
return ERR_PTR(-EAGAIN);
- err = ib_copy_from_udata(&req, udata, sizeof(req));
+ memset(&req, 0, sizeof(req));
+ reqlen = udata->inlen - sizeof(struct ib_uverbs_cmd_hdr);
+ if (reqlen == sizeof(struct mlx5_ib_alloc_ucontext_req))
+ ver = 0;
+ else if (reqlen == sizeof(struct mlx5_ib_alloc_ucontext_req_v2))
+ ver = 2;
+ else
+ return ERR_PTR(-EINVAL);
+
+ err = ib_copy_from_udata(&req, udata, reqlen);
if (err)
return ERR_PTR(err);
+ if (req.flags || req.reserved)
+ return ERR_PTR(-EINVAL);
+
if (req.total_num_uuars > MLX5_MAX_UUARS)
return ERR_PTR(-ENOMEM);
@@ -626,6 +639,7 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
if (err)
goto out_uars;
+ uuari->ver = ver;
uuari->num_low_latency_uuars = req.num_low_latency_uuars;
uuari->uars = uars;
uuari->num_uars = num_uars;
OpenPOWER on IntegriCloud