RDMA/core: Add iterator over ib_devices
authorLeon Romanovsky <leonro@mellanox.com>
Mon, 19 Jun 2017 11:04:56 +0000 (14:04 +0300)
committerLeon Romanovsky <leon@kernel.org>
Thu, 10 Aug 2017 10:21:54 +0000 (13:21 +0300)
The coming nldev needs to iterate over all IB devices in the system
and in order to not expose the ib_devices list outside the devices.c,
it is necessary to provide function iterator.

Current version is written explicitly for nldev callback to avoid
over-engineering at this stage, but it can be easily extended for
other types.

Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
drivers/infiniband/core/core_priv.h
drivers/infiniband/core/device.c

index e759c27113cdc16ff3fae0ef2d895dcc6e6c502d..0c175590cf925b96ba1c21fd50900307371340c3 100644 (file)
@@ -102,6 +102,14 @@ void ib_enum_all_roce_netdevs(roce_netdev_filter filter,
                              roce_netdev_callback cb,
                              void *cookie);
 
+typedef int (*nldev_callback)(struct ib_device *device,
+                             struct sk_buff *skb,
+                             struct netlink_callback *cb,
+                             unsigned int idx);
+
+int ib_enum_all_devs(nldev_callback nldev_cb, struct sk_buff *skb,
+                    struct netlink_callback *cb);
+
 enum ib_cache_gid_default_mode {
        IB_CACHE_GID_DEFAULT_MODE_SET,
        IB_CACHE_GID_DEFAULT_MODE_DELETE
index 33a39518848cdca9c03a4fdc316a6f2d5fb47117..8828f26250a83519e6d179383ceaa6dea6a0d287 100644 (file)
@@ -892,6 +892,31 @@ void ib_enum_all_roce_netdevs(roce_netdev_filter filter,
        up_read(&lists_rwsem);
 }
 
+/**
+ * ib_enum_all_devs - enumerate all ib_devices
+ * @cb: Callback to call for each found ib_device
+ *
+ * Enumerates all ib_devices and calls callback() on each device.
+ */
+int ib_enum_all_devs(nldev_callback nldev_cb, struct sk_buff *skb,
+                    struct netlink_callback *cb)
+{
+       struct ib_device *dev;
+       unsigned int idx = 0;
+       int ret = 0;
+
+       down_read(&lists_rwsem);
+       list_for_each_entry(dev, &device_list, core_list) {
+               ret = nldev_cb(dev, skb, cb, idx);
+               if (ret)
+                       break;
+               idx++;
+       }
+
+       up_read(&lists_rwsem);
+       return ret;
+}
+
 /**
  * ib_query_pkey - Get P_Key table entry
  * @device:Device to query