]> git.openfabrics.org - ~aditr/compat-rdma.git/commitdiff
ib_core: Added CONFIGFS backport for RHEL7.2
authorVladimir Sokolovsky <vlad@mellanox.com>
Wed, 16 Nov 2016 11:44:13 +0000 (13:44 +0200)
committerVladimir Sokolovsky <vlad@mellanox.com>
Wed, 16 Nov 2016 11:49:06 +0000 (13:49 +0200)
Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
patches/0001-BACKPORT-ib_core.patch

index a99a4b8b3f64dfcd3d44bec4316cea8fede89fdc..445add6d47a38aae63fe84b339be0cfc01316874 100644 (file)
@@ -3,19 +3,20 @@ Subject: [PATCH] BACKPORT: ib_core
 
 Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
 ---
- drivers/infiniband/core/cma.c           | 23 +++++++++++++++++
- drivers/infiniband/core/core_priv.h     | 17 ++++++++++++
- drivers/infiniband/core/cq.c            |  6 +++++
- drivers/infiniband/core/mad.c           |  3 +++
- drivers/infiniband/core/netlink.c       |  3 +++
- drivers/infiniband/core/roce_gid_mgmt.c | 46 +++++++++++++++++++++++++++++++++
- drivers/infiniband/core/sa_query.c      | 19 ++++++++++++++
- drivers/infiniband/core/umem.c          | 17 +++++++++++-
- drivers/infiniband/core/user_mad.c      |  3 +++
- drivers/infiniband/core/verbs.c         |  4 +++
- include/rdma/ib_addr.h                  | 23 +++++++++++++++++
- include/rdma/ib_verbs.h                 | 18 +++++++++++++
- 12 files changed, 181 insertions(+), 1 deletion(-)
+ drivers/infiniband/core/cma.c           |  23 ++++++++
+ drivers/infiniband/core/cma_configfs.c  | 101 ++++++++++++++++++++++++++++++++
+ drivers/infiniband/core/core_priv.h     |  28 +++++----
+ drivers/infiniband/core/cq.c            |   6 ++
+ drivers/infiniband/core/mad.c           |   3 +
+ drivers/infiniband/core/netlink.c       |   3 +
+ drivers/infiniband/core/roce_gid_mgmt.c |  46 +++++++++++++++
+ drivers/infiniband/core/sa_query.c      |  19 ++++++
+ drivers/infiniband/core/umem.c          |  17 +++++-
+ drivers/infiniband/core/user_mad.c      |   3 +
+ drivers/infiniband/core/verbs.c         |   4 ++
+ include/rdma/ib_addr.h                  |  23 ++++++++
+ include/rdma/ib_verbs.h                 |  18 ++++++
+ 13 files changed, 282 insertions(+), 12 deletions(-)
 
 diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
 index xxxxxxx..xxxxxxx xxxxxx
@@ -90,19 +91,213 @@ index xxxxxxx..xxxxxxx xxxxxx
  }
  
  static void iboe_mcast_work_handler(struct work_struct *work)
+diff --git a/drivers/infiniband/core/cma_configfs.c b/drivers/infiniband/core/cma_configfs.c
+index xxxxxxx..xxxxxxx xxxxxx
+--- a/drivers/infiniband/core/cma_configfs.c
++++ b/drivers/infiniband/core/cma_configfs.c
+@@ -35,6 +35,10 @@
+ #include <rdma/ib_verbs.h>
+ #include "core_priv.h"
++#ifndef CONFIGFS_ATTR
++#define HAVE_OLD_CONFIGFS_API
++#endif
++
+ struct cma_device;
+ struct cma_dev_group;
+@@ -52,6 +56,23 @@ struct cma_dev_group {
+       struct cma_dev_port_group       *ports;
+ };
++#ifdef HAVE_OLD_CONFIGFS_API
++struct cma_configfs_attr {
++      struct configfs_attribute       attr;
++      ssize_t                         (*show)(struct config_item *item,
++                                              char *buf);
++      ssize_t                         (*store)(struct config_item *item,
++                                               const char *buf, size_t count);
++};
++#define CONFIGFS_ATTR(dummy, _name)                           \
++static struct cma_configfs_attr attr_##_name =        \
++      __CONFIGFS_ATTR(_name, S_IRUGO | S_IWUSR, _name##_show, _name##_store)
++
++#define CONFIGFS_ATTR_ADD(name) &name.attr
++#else
++#define CONFIGFS_ATTR_ADD(name) &name
++#endif /* HAVE_OLD_CONFIGFS_API */
++
+ static struct cma_dev_port_group *to_dev_port_group(struct config_item *item)
+ {
+       struct config_group *group;
+@@ -68,6 +89,34 @@ static bool filter_by_name(struct ib_device *ib_dev, void *cookie)
+       return !strcmp(ib_dev->name, cookie);
+ }
++#ifdef HAVE_OLD_CONFIGFS_API
++static ssize_t cma_configfs_attr_show(struct config_item *item,
++                                    struct configfs_attribute *attr,
++                                    char *buf)
++{
++      struct cma_configfs_attr *ca =
++              container_of(attr, struct cma_configfs_attr, attr);
++
++      if (ca->show)
++              return ca->show(item, buf);
++
++      return -EINVAL;
++}
++
++static ssize_t cma_configfs_attr_store(struct config_item *item,
++                                     struct configfs_attribute *attr,
++                                     const char *buf, size_t count)
++{
++      struct cma_configfs_attr *ca =
++              container_of(attr, struct cma_configfs_attr, attr);
++
++      if (ca->store)
++              return ca->store(item, buf, count);
++
++      return -EINVAL;
++}
++#endif /* HAVE_OLD_CONFIGFS_API */
++
+ static int cma_configfs_params_get(struct config_item *item,
+                                  struct cma_device **pcma_dev,
+                                  struct cma_dev_port_group **pgroup)
+@@ -140,11 +189,28 @@ static ssize_t default_roce_mode_store(struct config_item *item,
+ CONFIGFS_ATTR(, default_roce_mode);
+ static struct configfs_attribute *cma_configfs_attributes[] = {
++#ifdef HAVE_OLD_CONFIGFS_API
++      CONFIGFS_ATTR_ADD(attr_default_roce_mode),
++#else
+       &attr_default_roce_mode,
++#endif
+       NULL,
+ };
++#ifdef HAVE_OLD_CONFIGFS_API
++static struct configfs_item_operations cma_item_ops = {
++      .show_attribute         = cma_configfs_attr_show,
++      .store_attribute        = cma_configfs_attr_store,
++};
++#else /* HAVE_OLD_CONFIGFS_API */
++static struct configfs_item_operations cma_item_ops = {
++};
++#endif
++
+ static struct config_item_type cma_port_group_type = {
++#ifdef HAVE_OLD_CONFIGFS_API
++      .ct_item_ops    = &cma_item_ops,
++#endif
+       .ct_attrs       = cma_configfs_attributes,
+       .ct_owner       = THIS_MODULE
+ };
+@@ -172,6 +238,13 @@ static int make_cma_ports(struct cma_dev_group *cma_dev_group,
+               goto free;
+       }
++#ifndef HAVE_CONFIGFS_DEFAULT_GROUPS_LIST
++      cma_dev_group->ports_group.default_groups = kcalloc((ports_num + 1),
++                                                          sizeof(struct config_group *),
++                                                          GFP_KERNEL);
++      if (!cma_dev_group->ports_group.default_groups)
++              goto free;
++#endif
+       for (i = 0; i < ports_num; i++) {
+               char port_str[10];
+@@ -181,10 +254,17 @@ static int make_cma_ports(struct cma_dev_group *cma_dev_group,
+               config_group_init_type_name(&ports[i].group,
+                                           port_str,
+                                           &cma_port_group_type);
++#ifdef HAVE_CONFIGFS_DEFAULT_GROUPS_LIST
+               configfs_add_default_group(&ports[i].group,
+                               &cma_dev_group->ports_group);
++#else
++              cma_dev_group->ports_group.default_groups[i] = &ports[i].group;
++#endif
+       }
++#ifndef HAVE_CONFIGFS_DEFAULT_GROUPS_LIST
++      cma_dev_group->ports_group.default_groups[i] = NULL;
++#endif
+       cma_dev_group->ports = ports;
+       return 0;
+@@ -252,6 +332,14 @@ static struct config_group *make_cma_dev(struct config_group *group,
+               err = -ENOMEM;
+               goto fail;
+       }
++#ifndef HAVE_CONFIGFS_DEFAULT_GROUPS_LIST
++      cma_dev_group->device_group.default_groups = kzalloc(sizeof(struct config_group *) * 2,
++                                                           GFP_KERNEL);
++      if (!cma_dev_group->device_group.default_groups) {
++              err = -ENOMEM;
++              goto fail;
++      }
++#endif
+       strncpy(cma_dev_group->name, name, sizeof(cma_dev_group->name));
+@@ -260,16 +348,29 @@ static struct config_group *make_cma_dev(struct config_group *group,
+       err = make_cma_ports(cma_dev_group, cma_dev);
+       if (err)
++#ifdef HAVE_CONFIGFS_DEFAULT_GROUPS_LIST
+               goto fail;
++#else
++              goto fail_free;
++#endif
+       config_group_init_type_name(&cma_dev_group->device_group, name,
+                                   &cma_device_group_type);
++#ifdef HAVE_CONFIGFS_DEFAULT_GROUPS_LIST
+       configfs_add_default_group(&cma_dev_group->ports_group,
+                       &cma_dev_group->device_group);
++#else
++      cma_dev_group->device_group.default_groups[0] = &cma_dev_group->ports_group;
++      cma_dev_group->device_group.default_groups[1] = NULL;
++#endif
+       cma_deref_dev(cma_dev);
+       return &cma_dev_group->device_group;
++#ifndef HAVE_CONFIGFS_DEFAULT_GROUPS_LIST
++fail_free:
++      kfree(cma_dev_group->device_group.default_groups);
++#endif
+ fail:
+       if (cma_dev)
+               cma_deref_dev(cma_dev);
 diff --git a/drivers/infiniband/core/core_priv.h b/drivers/infiniband/core/core_priv.h
 index xxxxxxx..xxxxxxx xxxxxx
 --- a/drivers/infiniband/core/core_priv.h
 +++ b/drivers/infiniband/core/core_priv.h
-@@ -37,6 +37,7 @@
+@@ -37,20 +37,10 @@
  #include <linux/spinlock.h>
  
  #include <rdma/ib_verbs.h>
 +#include <rdma/ib_addr.h>
  
- #if IS_ENABLED(CONFIG_INFINIBAND_ADDR_TRANS_CONFIGFS)
+-#if IS_ENABLED(CONFIG_INFINIBAND_ADDR_TRANS_CONFIGFS)
  int cma_configfs_init(void);
-@@ -127,6 +128,7 @@ void ib_cache_release_one(struct ib_device *device);
+ void cma_configfs_exit(void);
+-#else
+-static inline int cma_configfs_init(void)
+-{
+-      return 0;
+-}
+-
+-static inline void cma_configfs_exit(void)
+-{
+-}
+-#endif
+ struct cma_device;
+ void cma_ref_dev(struct cma_device *cma_dev);
+ void cma_deref_dev(struct cma_device *cma_dev);
+@@ -127,6 +117,7 @@ void ib_cache_release_one(struct ib_device *device);
  static inline bool rdma_is_upper_dev_rcu(struct net_device *dev,
                                         struct net_device *upper)
  {
@@ -110,7 +305,7 @@ index xxxxxxx..xxxxxxx xxxxxx
        struct net_device *_upper = NULL;
        struct list_head *iter;
  
-@@ -135,6 +137,21 @@ static inline bool rdma_is_upper_dev_rcu(struct net_device *dev,
+@@ -135,6 +126,21 @@ static inline bool rdma_is_upper_dev_rcu(struct net_device *dev,
                        break;
  
        return _upper == upper;