From: Igor Ivanov <igor.iva...@itseez.com>

Add Infra-structure to support extended uverbs capabilities in a 
forward/backward
manner. Uverbs command opcodes which are based on the verbs extensions approach 
should
be greater or equal to IB_USER_VERBS_CMD_THRESHOLD. They have new header format
and processed a bit differently.

Signed-off-by: Igor Ivanov <igor.iva...@itseez.com>
Signed-off-by: Hadar Hen Zion <had...@mellanox.com>
Signed-off-by: Or Gerlitz <ogerl...@mellanox.com>
---
 drivers/infiniband/core/uverbs_main.c |   29 ++++++++++++++++++++++++-----
 include/uapi/rdma/ib_user_verbs.h     |   10 ++++++++++
 2 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/drivers/infiniband/core/uverbs_main.c 
b/drivers/infiniband/core/uverbs_main.c
index 2c6f0f2..e4e7b24 100644
--- a/drivers/infiniband/core/uverbs_main.c
+++ b/drivers/infiniband/core/uverbs_main.c
@@ -583,9 +583,6 @@ static ssize_t ib_uverbs_write(struct file *filp, const 
char __user *buf,
        if (copy_from_user(&hdr, buf, sizeof hdr))
                return -EFAULT;
 
-       if (hdr.in_words * 4 != count)
-               return -EINVAL;
-
        if (hdr.command >= ARRAY_SIZE(uverbs_cmd_table) ||
            !uverbs_cmd_table[hdr.command])
                return -EINVAL;
@@ -597,8 +594,30 @@ static ssize_t ib_uverbs_write(struct file *filp, const 
char __user *buf,
        if (!(file->device->ib_dev->uverbs_cmd_mask & (1ull << hdr.command)))
                return -ENOSYS;
 
-       return uverbs_cmd_table[hdr.command](file, buf + sizeof hdr,
-                                            hdr.in_words * 4, hdr.out_words * 
4);
+       if (hdr.command >= IB_USER_VERBS_CMD_THRESHOLD) {
+               struct ib_uverbs_cmd_hdr_ex hdr_ex;
+
+               if (copy_from_user(&hdr_ex, buf, sizeof(hdr_ex)))
+                       return -EFAULT;
+
+               if (((hdr_ex.in_words + hdr_ex.provider_in_words) * 4) != count)
+                       return -EINVAL;
+
+               return uverbs_cmd_table[hdr.command](file,
+                                                    buf + sizeof(hdr_ex),
+                                                    (hdr_ex.in_words +
+                                                     hdr_ex.provider_in_words) 
* 4,
+                                                    (hdr_ex.out_words +
+                                                     
hdr_ex.provider_out_words) * 4);
+       } else {
+               if (hdr.in_words * 4 != count)
+                       return -EINVAL;
+
+               return uverbs_cmd_table[hdr.command](file,
+                                                    buf + sizeof(hdr),
+                                                    hdr.in_words * 4,
+                                                    hdr.out_words * 4);
+       }
 }
 
 static int ib_uverbs_mmap(struct file *filp, struct vm_area_struct *vma)
diff --git a/include/uapi/rdma/ib_user_verbs.h 
b/include/uapi/rdma/ib_user_verbs.h
index 805711e..61535aa 100644
--- a/include/uapi/rdma/ib_user_verbs.h
+++ b/include/uapi/rdma/ib_user_verbs.h
@@ -43,6 +43,7 @@
  * compatibility are made.
  */
 #define IB_USER_VERBS_ABI_VERSION      6
+#define IB_USER_VERBS_CMD_THRESHOLD    50
 
 enum {
        IB_USER_VERBS_CMD_GET_CONTEXT,
@@ -123,6 +124,15 @@ struct ib_uverbs_cmd_hdr {
        __u16 out_words;
 };
 
+struct ib_uverbs_cmd_hdr_ex {
+       __u32 command;
+       __u16 in_words;
+       __u16 out_words;
+       __u16 provider_in_words;
+       __u16 provider_out_words;
+       __u32 cmd_hdr_reserved;
+};
+
 struct ib_uverbs_get_context {
        __u64 response;
        __u64 driver_data[0];
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to