Re: [PATCH v5 for-next 3/3] IB/core: Obtain subnet_prefix from cache in IB devices

From: Leon Romanovsky
Date: Thu Jun 17 2021 - 02:41:58 EST


On Wed, Jun 16, 2021 at 09:15:09PM +0530, Anand Khoje wrote:
> ib_query_port() calls device->ops.query_port() to get the port
> attributes. The method of querying is device driver specific.
> The same function calls device->ops.query_gid() to get the GID and
> extract the subnet_prefix (gid_prefix).
>
> The GID and subnet_prefix are stored in a cache. But they do not get
> read from the cache if the device is an Infiniband device. The
> following change takes advantage of the cached subnet_prefix.
> Testing with RDBMS has shown a significant improvement in performance
> with this change.
>
> The function ib_cache_is_initialised() is introduced because
> ib_query_port() gets called early in the stage when the cache is not
> built while reading port immutable property.
>
> In that case, the default GID still gets read from HCA for IB link-
> layer devices.
>
> In the situation of an event causing cache update, the subnet_prefix
> will get retrieved from newly updated GID cache in ib_cache_update(),
> so that we do not end up reading a stale value from cache via
> ib_query_port().
>
> Fixes: fad61ad ("IB/core: Add subnet prefix to port info")
> Suggested-by: Leon Romanovsky <leonro@xxxxxxxxxx>
> Suggested-by: Aru Kolappan <aru.kolappan@xxxxxxxxxx>
> Signed-off-by: Anand Khoje <anand.a.khoje@xxxxxxxxxx>
> Signed-off-by: Haakon Bugge <haakon.bugge@xxxxxxxxxx>
> ---
>
> v1 -> v2:
> - Split the v1 patch in 3 patches as per Leon's suggestion.
>
> v2 -> v3:
> - Added changes as per Mark Zhang's suggestion of clearing
> flags in git_table_cleanup_one().
> v3 -> v4:
> - Removed the enum ib_port_data_flags and 8 byte flags from
> struct ib_port_data, and the set_bit()/clear_bit() API
> used to update this flag as that was not necessary.
> Done to keep the code simple.
> - Added code to read subnet_prefix from updated GID cache in the
> event of cache update. Prior to this change, ib_cache_update
> was reading the value for subnet_prefix via ib_query_port(),
> due to this patch, we ended up reading a stale cached value of
> subnet_prefix.
> v4 -> v5:
> - Removed the code to reset cache_is_initialised bit from cleanup
> as per Leon's suggestion.
> - Removed ib_cache_is_initialised() function.
>
> ---
> drivers/infiniband/core/cache.c | 14 ++++++++++++--
> drivers/infiniband/core/device.c | 9 +++++++++
> include/rdma/ib_verbs.h | 1 +
> 3 files changed, 22 insertions(+), 2 deletions(-)
>

Thanks,
Reviewed-by: Leon Romanovsky <leonro@xxxxxxxxxx>