Re: [PATCH] smc: Use flexible array for SMCD connections

From: Sidraya Jayagond

Date: Wed May 20 2026 - 13:02:55 EST




On 19/05/26 6:22 am, Rosen Penev wrote:
> Store the per-DMB connection pointers in the SMCD device allocation
> instead of allocating a separate connection array.
>
> This keeps the connection table tied to the SMCD device lifetime and
> simplifies the allocation and cleanup paths.
>
> Assisted-by: Codex:GPT-5.5
> Signed-off-by: Rosen Penev <rosenp@xxxxxxxxx>
> ---
> include/net/smc.h | 2 +-
> net/smc/smc_ism.c | 10 ++--------
> 2 files changed, 3 insertions(+), 9 deletions(-)
>
> diff --git a/include/net/smc.h b/include/net/smc.h
> index bfdc4c41f019..a2bc3ab88075 100644
> --- a/include/net/smc.h
> +++ b/include/net/smc.h
> @@ -40,7 +40,6 @@ struct smcd_dev {
> struct dibs_dev *dibs;
> struct list_head list;
> spinlock_t lock;
> - struct smc_connection **conn;
> struct list_head vlan;
> struct workqueue_struct *event_wq;
> u8 pnetid[SMC_MAX_PNETID_LEN];
> @@ -50,6 +49,7 @@ struct smcd_dev {
> atomic_t lgr_cnt;
> wait_queue_head_t lgrs_deleted;
> u8 going_away : 1;
> + struct smc_connection *conn[];
> };
>
> #define SMC_HS_CTRL_NAME_MAX 16
> diff --git a/net/smc/smc_ism.c b/net/smc/smc_ism.c
> index e0dba2c7b6e3..bde938c5eb39 100644
> --- a/net/smc/smc_ism.c
> +++ b/net/smc/smc_ism.c
> @@ -467,17 +467,14 @@ static struct smcd_dev *smcd_alloc_dev(const char *name, int max_dmbs)
> {
> struct smcd_dev *smcd;
>
> - smcd = kzalloc_obj(*smcd);
> + smcd = kzalloc_flex(*smcd, conn, max_dmbs);
> if (!smcd)
> return NULL;
> - smcd->conn = kzalloc_objs(struct smc_connection *, max_dmbs);
> - if (!smcd->conn)
> - goto free_smcd;
>
> smcd->event_wq = alloc_ordered_workqueue("ism_evt_wq-%s)",
> WQ_MEM_RECLAIM, name);
> if (!smcd->event_wq)
> - goto free_conn;
> + goto free_smcd;
>
> spin_lock_init(&smcd->lock);
> spin_lock_init(&smcd->lgr_lock);
> @@ -486,8 +483,6 @@ static struct smcd_dev *smcd_alloc_dev(const char *name, int max_dmbs)
> init_waitqueue_head(&smcd->lgrs_deleted);
> return smcd;
>
> -free_conn:
> - kfree(smcd->conn);
> free_smcd:
> kfree(smcd);
> return NULL;
> @@ -557,7 +552,6 @@ static void smcd_unregister_dev(struct dibs_dev *dibs)
> list_del_init(&smcd->list);
> mutex_unlock(&smcd_dev_list.mutex);
> destroy_workqueue(smcd->event_wq);
> - kfree(smcd->conn);
> kfree(smcd);
> }
>

Code changes looks good to me.
Reviewed-by: Sidraya Jayagond <sidraya@xxxxxxxxxxxxx>