Re: [PATCH for-next V2 03/22] IB/core: Add ib_find_exact_cached_pkey() to search for 16-bit pkey match
From: Doug Ledford <hidden>
Date: 2012-09-11 16:53:42
On 8/3/2012 4:40 AM, Jack Morgenstein wrote:
When port pkey table potentially contains both full and partial membership copies for the same pkey, we need a function to find the exact (16-bit) pkey index.
The code on this patch is fine, just see my previous email about the function naming...
quoted hunk
This is particularly necessary when the master forwards QP1 MADS sent by guests. If the guest has sent the MAD with a limited membership pkey, we wish to forward the MAD using the same limited membership pkey. Since master may have both the limited and the full member pkeys in its table, we must make sure to retrieve the limited membership pkey in this case. This requires the 16-bit pkey lookup function (which includes the membership bit). Signed-off-by: Jack Morgenstein <redacted> Signed-off-by: Or Gerlitz <ogerlitz-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> --- drivers/infiniband/core/cache.c | 32 ++++++++++++++++++++++++++++++++ include/rdma/ib_cache.h | 16 ++++++++++++++++ 2 files changed, 48 insertions(+), 0 deletions(-)diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c index 0f2f2b7..d8a8c83 100644 --- a/drivers/infiniband/core/cache.c +++ b/drivers/infiniband/core/cache.c@@ -198,6 +198,38 @@ int ib_find_cached_pkey(struct ib_device *device, } EXPORT_SYMBOL(ib_find_cached_pkey); +int ib_find_exact_cached_pkey(struct ib_device *device, + u8 port_num, + u16 pkey, + u16 *index) +{ + struct ib_pkey_cache *cache; + unsigned long flags; + int i; + int ret = -ENOENT; + + if (port_num < start_port(device) || port_num > end_port(device)) + return -EINVAL; + + read_lock_irqsave(&device->cache.lock, flags); + + cache = device->cache.pkey_cache[port_num - start_port(device)]; + + *index = -1; + + for (i = 0; i < cache->table_len; ++i) + if (cache->table[i] == pkey) { + *index = i; + ret = 0; + break; + } + + read_unlock_irqrestore(&device->cache.lock, flags); + + return ret; +} +EXPORT_SYMBOL(ib_find_exact_cached_pkey); + int ib_get_cached_lmc(struct ib_device *device, u8 port_num, u8 *lmc)diff --git a/include/rdma/ib_cache.h b/include/rdma/ib_cache.h index 00a2b8e..ad9a3c2 100644 --- a/include/rdma/ib_cache.h +++ b/include/rdma/ib_cache.h@@ -101,6 +101,22 @@ int ib_find_cached_pkey(struct ib_device *device, u16 *index); /** + * ib_find_exact_cached_pkey - Returns the PKey table index where a specified + * PKey value occurs. Comparison uses the FULL 16 bits (incl membership bit) + * @device: The device to query. + * @port_num: The port number of the device to search for the PKey. + * @pkey: The PKey value to search for. + * @index: The index into the cached PKey table where the PKey was found. + * + * ib_find_exact_cached_pkey() searches the specified PKey table in + * the local software cache. + */ +int ib_find_exact_cached_pkey(struct ib_device *device, + u8 port_num, + u16 pkey, + u16 *index); + +/** * ib_get_cached_lmc - Returns a cached lmc table entry * @device: The device to query. * @port_num: The port number of the device to query.
--
Doug Ledford [off-list ref]
GPG KeyID: 0E572FDD
http://people.redhat.com/dledford
Infiniband specific RPMs available at
http://people.redhat.com/dledford/Infiniband
Attachments
- signature.asc [application/pgp-signature] 895 bytes