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
}
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)
{
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;