git: d8afb9b13f41 - main - sys/ofed: don't stop removing stale RoCE GIDs at the first hole
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 03 Aug 2026 20:45:31 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=d8afb9b13f4141dc42fb1eb1c7c6a45bd2cd0bc4
commit d8afb9b13f4141dc42fb1eb1c7c6a45bd2cd0bc4
Author: Ariel Ehrenberg <aehrenberg@nvidia.com>
AuthorDate: 2026-07-23 07:32:05 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-08-03 20:38:49 +0000
sys/ofed: don't stop removing stale RoCE GIDs at the first hole
When cleaning up stale GIDs the scan stopped as soon as
rdma_get_gid_attr() failed. But that can also happen for empty entries
in the middle of the table, so a single gap left everything after it
behind and the GID entries could eventually run out.
Now the whole table is scanned and the empty slots are simply skipped.
Reviewed by: kib, jhb
Sponsored by: Nvidia networking
Fixes: 6a75471dbcf0 ("OFED: Various changes from Linux 4.19")
Differential revision: https://reviews.freebsd.org/D58510
---
sys/ofed/drivers/infiniband/core/ib_roce_gid_mgmt.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/sys/ofed/drivers/infiniband/core/ib_roce_gid_mgmt.c b/sys/ofed/drivers/infiniband/core/ib_roce_gid_mgmt.c
index e24a6645e8e4..d6d882dd59b3 100644
--- a/sys/ofed/drivers/infiniband/core/ib_roce_gid_mgmt.c
+++ b/sys/ofed/drivers/infiniband/core/ib_roce_gid_mgmt.c
@@ -213,6 +213,7 @@ roce_gid_update_addr_callback(struct ib_device *device, u8 port,
union ib_gid gid;
if_t ifp;
int default_gids;
+ int gid_tbl_len;
int i;
struct ipx_queue ipx_head;
@@ -271,13 +272,15 @@ roce_gid_update_addr_callback(struct ib_device *device, u8 port,
update_gid(GID_ADD, device, port, &gid, entry->ndev);
}
+ gid_tbl_len = device->port_immutable[port].gid_tbl_len;
+
/* remove stale GIDs, if any */
- for (i = default_gids;; i++) {
+ for (i = default_gids; i < gid_tbl_len; i++) {
union ipx_addr ipx;
sgid_attr = rdma_get_gid_attr(device, port, i);
if (IS_ERR(sgid_attr))
- break;
+ continue;
ndev = sgid_attr->ndev;
gid = sgid_attr->gid;