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

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to