| From 9b654fba17b6377b1960e2ea4fb602e501a6acde Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 31 Dec 2025 14:07:45 +0100 |
| Subject: IB/cache: update gid cache on client reregister event |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Etienne AUJAMES <eaujames@ddn.com> |
| |
| [ Upstream commit ddd6c8c873e912cb1ead79def54de5e24ff71c80 ] |
| |
| Some HCAs (e.g: ConnectX4) do not trigger a IB_EVENT_GID_CHANGE on |
| subnet prefix update from SM (PortInfo). |
| |
| Since the commit d58c23c92548 ("IB/core: Only update PKEY and GID caches |
| on respective events"), the GID cache is updated exclusively on |
| IB_EVENT_GID_CHANGE. If this event is not emitted, the subnet prefix in the |
| IPoIB interface’s hardware address remains set to its default value |
| (0xfe80000000000000). |
| |
| Then rdma_bind_addr() failed because it relies on hardware address to |
| find the port GID (subnet_prefix + port GUID). |
| |
| This patch fixes this issue by updating the GID cache on |
| IB_EVENT_CLIENT_REREGISTER event (emitted on PortInfo::ClientReregister=1). |
| |
| Fixes: d58c23c92548 ("IB/core: Only update PKEY and GID caches on respective events") |
| Signed-off-by: Etienne AUJAMES <eaujames@ddn.com> |
| Link: https://patch.msgid.link/aVUfsO58QIDn5bGX@eaujamesFR0130 |
| Reviewed-by: Parav Pandit <parav@nvidia.com> |
| Signed-off-by: Leon Romanovsky <leon@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/infiniband/core/cache.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c |
| index 77c0b89259911..7ed9915f7893e 100644 |
| --- a/drivers/infiniband/core/cache.c |
| +++ b/drivers/infiniband/core/cache.c |
| @@ -1566,7 +1566,8 @@ static void ib_cache_event_task(struct work_struct *_work) |
| * the cache. |
| */ |
| ret = ib_cache_update(work->event.device, work->event.element.port_num, |
| - work->event.event == IB_EVENT_GID_CHANGE, |
| + work->event.event == IB_EVENT_GID_CHANGE || |
| + work->event.event == IB_EVENT_CLIENT_REREGISTER, |
| work->event.event == IB_EVENT_PKEY_CHANGE, |
| work->enforce_security); |
| |
| -- |
| 2.51.0 |
| |