Re: [PATCH] smc: Use flexible array for SMCD connections
From: Rosen Penev
Date: Tue May 19 2026 - 17:46:43 EST
On Tue, May 19, 2026 at 1:57 AM Alexandra Winter <wintera@xxxxxxxxxxxxx> wrote:
>
>
>
> On 19.05.26 02:52, 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>
> > ---
>
> I don't think GPT did a good job here.
> There are many other instances, where smcd->conn is freed,
> those would need adoption as well afaiu.
git grep kfree | grep \\\-\>conn\)
drivers/media/dvb-core/dvbdev.c: kfree(dvbdev->adapter->conn);
net/wireless/sme.c: kfree(wdev->conn);
net/wireless/sme.c: kfree(wdev->conn);
I assume you mean net/wireless/sme.c
>
> I am also not sure that there is enough improvement in the idea
> to warrant a patch, but I leave that to the SMC maintainers.
>
>
>
> > 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);
> > }
> >
>