RDMA/core: Use kzalloc_flex for GID table

Simplifies allocations by using a flexible array member in struct ib_gid_table.

Add __counted_by to get extra runtime analysis.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://patch.msgid.link/20260327030124.8385-1-rosenp@gmail.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
Rosen Penev 2026-03-26 20:01:24 -07:00 committed by Leon Romanovsky
parent dbeb256e8d
commit cef2842c92

View File

@ -116,9 +116,9 @@ struct ib_gid_table {
/* rwlock protects data_vec[ix]->state and entry pointer. /* rwlock protects data_vec[ix]->state and entry pointer.
*/ */
rwlock_t rwlock; rwlock_t rwlock;
struct ib_gid_table_entry **data_vec;
/* bit field, each bit indicates the index of default GID */ /* bit field, each bit indicates the index of default GID */
u32 default_gid_indices; u32 default_gid_indices;
struct ib_gid_table_entry *data_vec[] __counted_by(sz);
}; };
static void dispatch_gid_change_event(struct ib_device *ib_dev, u32 port) static void dispatch_gid_change_event(struct ib_device *ib_dev, u32 port)
@ -770,24 +770,16 @@ const struct ib_gid_attr *rdma_find_gid_by_filter(
static struct ib_gid_table *alloc_gid_table(int sz) static struct ib_gid_table *alloc_gid_table(int sz)
{ {
struct ib_gid_table *table = kzalloc_obj(*table); struct ib_gid_table *table = kzalloc_flex(*table, data_vec, sz);
if (!table) if (!table)
return NULL; return NULL;
table->data_vec = kzalloc_objs(*table->data_vec, sz); table->sz = sz;
if (!table->data_vec)
goto err_free_table;
mutex_init(&table->lock); mutex_init(&table->lock);
table->sz = sz;
rwlock_init(&table->rwlock); rwlock_init(&table->rwlock);
return table; return table;
err_free_table:
kfree(table);
return NULL;
} }
static void release_gid_table(struct ib_device *device, static void release_gid_table(struct ib_device *device,