public inbox for linux-rdma@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 08/30] IB/core: Support find sgid index using a filter function
@ 2015-02-19 10:20 Somnath Kotur
  0 siblings, 0 replies; 60+ messages in thread
From: Somnath Kotur @ 2015-02-19 10:20 UTC (permalink / raw)
  To: roland-DgEjT+Ai2ygdnm+yROfE0A
  Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA, Matan Barak, Somnath Kotur

From: Matan Barak <matanb-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>

Sometimes a sgid index need to be found based on variable parameters.
For example, when the CM gets a packet from network, it needs to
match a sgid_index that matches the appropriate L2 attributes
of a packet. Extending the cache's API to include Ethernet L2
attribute is problematic, since they may be vastly extended
in the future. As a result, we add a find function that
gets a user filter function and searches the GID table
until a match is found.

Signed-off-by: Matan Barak <matanb-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
Signed-off-by: Somnath Kotur <somnath.kotur-laKkSmNT4hbQT0dZR+AlfA@public.gmane.org>
---
 drivers/infiniband/core/cache.c          |   24 +++++++++++
 drivers/infiniband/core/core_priv.h      |    9 ++++
 drivers/infiniband/core/roce_gid_cache.c |   66 ++++++++++++++++++++++++++++++
 include/rdma/ib_cache.h                  |   27 ++++++++++++
 4 files changed, 126 insertions(+), 0 deletions(-)

diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
index 882d491..ae86fe8 100644
--- a/drivers/infiniband/core/cache.c
+++ b/drivers/infiniband/core/cache.c
@@ -273,6 +273,30 @@ int ib_find_cached_gid_by_port(struct ib_device *device,
 }
 EXPORT_SYMBOL(ib_find_cached_gid_by_port);
 
+int ib_find_gid_by_filter(struct ib_device *device,
+			  union ib_gid *gid,
+			  u8 port_num,
+			  bool (*filter)(const union ib_gid *gid,
+					 const struct ib_gid_attr *,
+					 void *),
+			  void *context, u16 *index)
+{
+	/* Look for a RoCE device with the specified GID. */
+	if (!ib_cache_use_roce_gid_cache(device, port_num))
+		return roce_gid_cache_find_gid_by_filter(device, gid,
+							 port_num, filter,
+							 context, index);
+
+	/* Only RoCE GID cache supports filter function */
+	if (filter)
+		return -ENOSYS;
+
+	/* If no RoCE devices with the specified GID, look for IB device. */
+	return __ib_find_cached_gid_by_port(device, port_num,
+					    gid, index);
+}
+EXPORT_SYMBOL(ib_find_gid_by_filter);
+
 int ib_get_cached_pkey(struct ib_device *device,
 		       u8                port_num,
 		       int               index,
diff --git a/drivers/infiniband/core/core_priv.h b/drivers/infiniband/core/core_priv.h
index 411672f..d6e73f8 100644
--- a/drivers/infiniband/core/core_priv.h
+++ b/drivers/infiniband/core/core_priv.h
@@ -84,6 +84,15 @@ int roce_gid_cache_find_gid_by_port(struct ib_device *ib_dev, union ib_gid *gid,
 				    enum ib_gid_type gid_type, u8 port,
 				    struct net *net, int if_index, u16 *index);
 
+int roce_gid_cache_find_gid_by_filter(struct ib_device *ib_dev,
+				      union ib_gid *gid,
+				      u8 port,
+				      bool (*filter)(const union ib_gid *gid,
+						     const struct ib_gid_attr *,
+						     void *),
+				      void *context,
+				      u16 *index);
+
 int roce_gid_cache_is_active(struct ib_device *ib_dev, u8 port);
 
 enum roce_gid_cache_default_mode {
diff --git a/drivers/infiniband/core/roce_gid_cache.c b/drivers/infiniband/core/roce_gid_cache.c
index 895b9c1..6017ba0 100644
--- a/drivers/infiniband/core/roce_gid_cache.c
+++ b/drivers/infiniband/core/roce_gid_cache.c
@@ -436,6 +436,72 @@ int roce_gid_cache_find_gid_by_port(struct ib_device *ib_dev, union ib_gid *gid,
 	return -ENOENT;
 }
 
+int roce_gid_cache_find_gid_by_filter(struct ib_device *ib_dev,
+				      union ib_gid *gid,
+				      u8 port,
+				      bool (*filter)(const union ib_gid *,
+						     const struct ib_gid_attr *,
+						     void *),
+				      void *context,
+				      u16 *index)
+{
+	struct ib_roce_gid_cache *cache;
+	unsigned int i;
+	bool found = false;
+
+	if (!ib_dev->cache.roce_gid_cache)
+		return -ENOSYS;
+
+	if (port < start_port(ib_dev) ||
+	    port > start_port(ib_dev) + ib_dev->phys_port_cnt ||
+	    rdma_port_get_link_layer(ib_dev, port) !=
+		IB_LINK_LAYER_ETHERNET)
+		return -ENOSYS;
+
+	cache = ib_dev->cache.roce_gid_cache[port - start_port(ib_dev)];
+
+	if (!cache->active)
+		return -ENOENT;
+
+	for (i = 0; i < cache->sz; i++) {
+		unsigned int orig_seq;
+		struct ib_gid_attr attr;
+
+		orig_seq = cache->data_vec[i].seq;
+		if (orig_seq == -1)
+			continue;
+		/* Make sure the sequence number we remeber was read
+		 * before the gid cache entry content is read.
+		 */
+		smp_rmb();
+
+		if (memcmp(gid, &cache->data_vec[i].gid, sizeof(*gid)))
+			continue;
+
+		memcpy(&attr, &cache->data_vec[i].attr, sizeof(attr));
+
+		rcu_read_lock();
+
+		/* Make sure we finished reading the attribute */
+		smp_rmb();
+		if (orig_seq == ACCESS_ONCE(cache->data_vec[i].seq))
+			if (!filter || filter(gid, &attr, context))
+				found = true;
+
+		rcu_read_unlock();
+
+		if (found)
+			break;
+	}
+
+	if (!found)
+		return -ENOENT;
+
+	if (index)
+		*index = i;
+	return 0;
+}
+
 static struct ib_roce_gid_cache *alloc_roce_gid_cache(int sz)
 {
 	struct ib_roce_gid_cache *cache =
diff --git a/include/rdma/ib_cache.h b/include/rdma/ib_cache.h
index 36b72bf..c6c1a51 100644
--- a/include/rdma/ib_cache.h
+++ b/include/rdma/ib_cache.h
@@ -111,6 +111,33 @@ int ib_find_cached_gid_by_port(struct ib_device *device,
 			       struct net	*net,
 			       int		if_index,
 			       u16              *index);
+
+/**
+ * ib_find_cached_gid_by_port - Returns the GID table index where a specified
+ * GID value occurs
+ * @device: The device to query.
+ * @gid: The GID value to search for.
+ * @port_num: The port number of the device where the GID value could be
+ *   searched.
+ * @filter: The filter function is executed on any matching GID in the table.
+ *   If the filter function returns true, the corresponding index is returned,
+ *   otherwise, we continue searching the GID table. It's guaranteed that
+ *   while filter is executed, ndev field is valid and the structure won't
+ *   change. filter is executed in an atomic context. filter must be NULL
+ *   when RoCE GID cache isn't supported on the respective device's port.
+ * @index: The index into the cached GID table where the GID was found.  This
+ *   parameter may be NULL.
+ *
+ * ib_find_cached_gid_by_port() searches for the specified GID value in
+ * the local software cache.
+ */
+int ib_find_gid_by_filter(struct ib_device *device,
+			  union ib_gid *gid,
+			  u8 port_num,
+			  bool (*filter)(const union ib_gid *gid,
+					 const struct ib_gid_attr *,
+					 void *),
+			  void *context, u16 *index);
 /**
  * ib_get_cached_pkey - Returns a cached PKey table entry
  * @device: The device to query.
-- 
1.7.1

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

^ permalink raw reply related	[flat|nested] 60+ messages in thread

end of thread, other threads:[~2015-02-24  8:05 UTC | newest]

Thread overview: 60+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <1424383365-19337-1-git-send-email-somnath.kotur@emulex.com>
     [not found] ` <1424383365-19337-1-git-send-email-somnath.kotur-laKkSmNT4hbQT0dZR+AlfA@public.gmane.org>
2015-02-19 22:02   ` [PATCH 01/30] IB/core: Add RoCE GID cache Somnath Kotur
2015-02-19 22:02   ` [PATCH 02/30] IB/core: Add kref to IB devices Somnath Kotur
     [not found]     ` <1b381c86-9f29-49a6-b7c5-9571d4490f5c-3RiH6ntJJkOPfaB/Gd0HpljyZtpTMMwT@public.gmane.org>
2015-02-19 10:57       ` Haggai Eran
     [not found]         ` <54E5C1AF.4010400-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-02-19 12:34           ` Matan Barak
2015-02-19 22:02   ` [PATCH 03/30] IB/core: Add RoCE GID population Somnath Kotur
2015-02-19 22:02   ` [PATCH 04/30] IB/core: Add default GID for RoCE GID Cache Somnath Kotur
2015-02-19 22:02   ` [PATCH 05/30] IB/core: Add RoCE cache bonding support Somnath Kotur
2015-02-19 22:02   ` [PATCH 06/30] IB/core: GID attribute should be returned from verbs API and cache API Somnath Kotur
2015-02-19 22:02   ` [PATCH 07/30] IB/core: Report gid_type and gid_ndev through sysfs Somnath Kotur
2015-02-19 22:02   ` [PATCH 08/30] IB/core: Support find sgid index using a filter function Somnath Kotur
     [not found]     ` <3f9746be-8d95-429c-945e-59b0b90a17e8-3RiH6ntJJkOPfaB/Gd0HpljyZtpTMMwT@public.gmane.org>
2015-02-19 12:41       ` Haggai Eran
     [not found]         ` <54E5DA0D.4020002-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-02-19 12:48           ` Matan Barak
2015-02-19 22:02   ` [PATCH 09/30] IB/core: Modify ib_verbs and cma in order to use roce_gid_cache Somnath Kotur
     [not found]     ` <f91c8ed3-f6a4-4b63-85f9-870d9687a14f-3RiH6ntJJkOPfaB/Gd0HpljyZtpTMMwT@public.gmane.org>
2015-02-19 12:52       ` Haggai Eran
     [not found]         ` <54E5DC82.1090805-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-02-19 13:22           ` Matan Barak
     [not found]             ` <54E5E381.5000105-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-02-19 14:00               ` Or Gerlitz
2015-02-19 14:37       ` Haggai Eran
     [not found]         ` <54E5F51B.8020806-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-02-19 15:24           ` Matan Barak
     [not found]             ` <54E6001F.2080304-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-02-22  7:37               ` Haggai Eran
2015-02-19 15:03       ` Haggai Eran
     [not found]         ` <54E5FB57.1090803-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-02-19 15:31           ` Matan Barak
     [not found]             ` <54E601B6.5000705-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-02-22  7:41               ` Haggai Eran
2015-02-19 15:18       ` Haggai Eran
     [not found]         ` <54E5FEDD.2080001-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-02-19 15:37           ` Matan Barak
2015-02-23  5:25       ` Devesh Sharma
     [not found]         ` <de2ee483-0c24-4951-af76-87ab3499636a-3RiH6ntJJkP8BX6JNMqfyFjyZtpTMMwT@public.gmane.org>
2015-02-23 10:17           ` Matan Barak
     [not found]             ` <54EAFE26.1070202-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-02-23 10:32               ` Somnath Kotur
     [not found]                 ` <df21f330-cbe1-4fc9-8611-5d781f8656a2-3RiH6ntJJkOPfaB/Gd0HpljyZtpTMMwT@public.gmane.org>
2015-02-23 11:03                   ` Matan Barak
2015-02-23 16:59               ` Devesh Sharma
     [not found]                 ` <61ca6b6c-4c5b-4f75-9fd1-c24d64a6223a-3RiH6ntJJkOPfaB/Gd0HpljyZtpTMMwT@public.gmane.org>
2015-02-24  8:05                   ` Matan Barak
2015-02-19 22:02   ` [PATCH 10/30] IB/core: Add gid_type to path and rdma_id_private Somnath Kotur
     [not found]     ` <0ebef7be-0586-47bf-bcc4-f3ff21ca4f3b-3RiH6ntJJkOPfaB/Gd0HpljyZtpTMMwT@public.gmane.org>
2015-02-19 15:51       ` Haggai Eran
     [not found]         ` <54E60695.3050907-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-02-19 15:53           ` Matan Barak
2015-02-19 22:02   ` [PATCH 11/30] IB/core: Add rdma_network_type to wc Somnath Kotur
2015-02-19 22:02   ` [PATCH 12/30] IB/cma: Add configfs for rdma_cm Somnath Kotur
2015-02-19 22:02   ` [PATCH 13/30] IB/Core: Changes to the IB Core infrastructure for RoCEv2 support Somnath Kotur
2015-02-19 22:02   ` [PATCH] RDMA/ocrdma: Changes in driver to incorporate the moving of GID Table mgmt to IB/Core Somnath Kotur
     [not found]     ` <192c6b78-c0e3-4ca5-aa83-4ce6e9eb46be-3RiH6ntJJkOPfaB/Gd0HpljyZtpTMMwT@public.gmane.org>
2015-02-19  9:01       ` Shachar Raindel
     [not found]         ` <AM3PR05MB093504D988CF6E2C0CF97A40DC2D0-LOZWmgKjnYgQouBfZGh8ttqRiQSDpxhJvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2015-02-19  9:05           ` Somnath Kotur
2015-02-19 22:02   ` [PATCH 15/30] RDMA/ocrdma: changes to support RoCE-v2 in UD path Somnath Kotur
     [not found]     ` <7d2d787d-b849-42af-a93f-32b13ec319ba-3RiH6ntJJkOPfaB/Gd0HpljyZtpTMMwT@public.gmane.org>
2015-02-21 13:13       ` Devesh Sharma
2015-02-19 22:02   ` [PATCH 16/30] RDMA/ocrdma: changes to support RoCE-v2 in RC path Somnath Kotur
2015-02-19 22:02   ` [PATCH 17/30] RDMA/ocrdma: changes to support user AH creation Somnath Kotur
2015-02-19 22:02   ` [PATCH 18/30] IB/mlx4: Remove gid table management for RoCE Somnath Kotur
     [not found]     ` <250dc054-e0c4-40b4-8855-7315489c0f58-3RiH6ntJJkOPfaB/Gd0HpljyZtpTMMwT@public.gmane.org>
2015-02-22 11:41       ` Or Gerlitz
2015-02-19 22:02   ` [PATCH 19/30] IB/mlx4: Replace spin_lock with rw_semaphore Somnath Kotur
2015-02-19 22:02   ` [PATCH 20/30] IB/mlx4: Lock with RCU instead of RTNL Somnath Kotur
2015-02-19 22:02   ` [PATCH 21/30] net/mlx4: Postpone the registration of net_device Somnath Kotur
2015-02-19 22:02   ` [PATCH 22/30] IB/mlx4: Advertise RoCE support in port capabilities Somnath Kotur
2015-02-19 22:02   ` [PATCH 23/30] IB/mlx4: Implement ib_device callback - get_netdev Somnath Kotur
2015-02-19 22:02   ` [PATCH 24/30] IB/mlx4: Implement ib_device callback - modify_gid Somnath Kotur
2015-02-19 22:02   ` [PATCH 25/30] IB/mlx4: Configure device to work in RoCEv2 Somnath Kotur
2015-02-19 22:02   ` [PATCH 26/30] IB/mlx4: Translate cache gid index to real index Somnath Kotur
2015-02-19 22:02   ` [PATCH 27/30] IB/core: Initialize UD header structure with IP and UDP headers Somnath Kotur
2015-02-19 22:02   ` [PATCH 28/30] IB/mlx4: Enable send of RoCE QP1 packets with IP/UDP headers Somnath Kotur
2015-02-19 22:02   ` [PATCH 29/30] IB/mlx4: Create and use another QP1 for RoCEv2 Somnath Kotur
     [not found]     ` <7d3158cd-5b84-4f60-a705-71fca630e04a-3RiH6ntJJkOPfaB/Gd0HpljyZtpTMMwT@public.gmane.org>
2015-02-19 16:11       ` Shachar Raindel
2015-02-19 22:02   ` [PATCH 30/30] IB/cma: Join and leave multicast groups with IGMP Somnath Kotur
     [not found]     ` <91da5137-4651-4991-852e-d57faeabe6a5-3RiH6ntJJkOPfaB/Gd0HpljyZtpTMMwT@public.gmane.org>
2015-02-19 13:56       ` Shachar Raindel
2015-02-19 10:20 [PATCH 08/30] IB/core: Support find sgid index using a filter function Somnath Kotur

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox