From: Majd Dibbiny Date: Mon, 16 Jun 2014 07:18:41 +0000 (+0300) Subject: IB/core: add debugging prints to explain -EINVAL in ib_uverbs_reg_mr X-Git-Tag: v4.1.12-92~293^2~1^2~33 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=31e37faea53e965c0697d521bbdd92b8534180fb;p=users%2Fjedix%2Flinux-maple.git IB/core: add debugging prints to explain -EINVAL in ib_uverbs_reg_mr Understanding why -EINVAL is returned from uverbs is difficult as there are multiple code paths that can cause the value to be returned. This patch adds some explainations as pr_debug prints. Signed-off-by: Haggai Eran Signed-off-by: Majd Dibbiny (Ported from Mellanox OFED 2.4) Signed-off-by: Mukesh Kacker --- diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index 9d73aa5ec8fbe..2994735337968 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -944,8 +944,10 @@ ssize_t ib_uverbs_reg_mr(struct ib_uverbs_file *file, struct ib_mr *mr; int ret; - if (out_len < sizeof resp) + if (out_len < sizeof(resp)) { + pr_debug("ib_uverbs_reg_mr: command output length too short\n"); return -ENOSPC; + } if (copy_from_user(&cmd, buf, sizeof cmd)) return -EFAULT; @@ -954,8 +956,10 @@ ssize_t ib_uverbs_reg_mr(struct ib_uverbs_file *file, (unsigned long) cmd.response + sizeof resp, in_len - sizeof cmd, out_len - sizeof resp); - if ((cmd.start & ~PAGE_MASK) != (cmd.hca_va & ~PAGE_MASK)) + if ((cmd.start & ~PAGE_MASK) != (cmd.hca_va & ~PAGE_MASK)) { + pr_debug("ib_uverbs_reg_mr: HCA virtual address doesn't match host address\n"); return -EINVAL; + } ret = ib_check_mr_access(cmd.access_flags); if (ret) @@ -970,6 +974,7 @@ ssize_t ib_uverbs_reg_mr(struct ib_uverbs_file *file, pd = idr_read_pd(cmd.pd_handle, file->ucontext); if (!pd) { + pr_debug("ib_uverbs_reg_mr: invalid PD\n"); ret = -EINVAL; goto err_free; } diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 65994a19e8405..907f3cde870fc 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -39,6 +39,11 @@ #if !defined(IB_VERBS_H) #define IB_VERBS_H +#ifdef pr_fmt +#undef pr_fmt +#endif +#define pr_fmt(fmt) fmt + #include #include #include @@ -2647,8 +2652,11 @@ static inline int ib_check_mr_access(int flags) * remote atomic permission is also requested. */ if (flags & (IB_ACCESS_REMOTE_ATOMIC | IB_ACCESS_REMOTE_WRITE) && - !(flags & IB_ACCESS_LOCAL_WRITE)) + !(flags & IB_ACCESS_LOCAL_WRITE)) { + pr_debug("ib_check_mr_access: MR must have local write permission if remote write is allowed. flags=0x%x\n" + , flags); return -EINVAL; + } return 0; }