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... > 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 <ja...@dev.mellanox.co.il> > Signed-off-by: Or Gerlitz <ogerl...@mellanox.com> > --- > 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 <dledf...@redhat.com> GPG KeyID: 0E572FDD http://people.redhat.com/dledford Infiniband specific RPMs available at http://people.redhat.com/dledford/Infiniband
signature.asc
Description: OpenPGP digital signature