Netdev List
 help / color / mirror / Atom feed
* [PATCH] smc: Use flexible array for SMCD connections
@ 2026-05-19  0:52 Rosen Penev
  2026-05-19  8:57 ` Alexandra Winter
  0 siblings, 1 reply; 3+ messages in thread
From: Rosen Penev @ 2026-05-19  0:52 UTC (permalink / raw)
  To: linux-rdma
  Cc: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Simon Horman, D. Wythe, Dust Li, Sidraya Jayagond, Wenjia Zhang,
	Mahanta Jambigi, Tony Lu, Wen Gu, open list:NETWORKING [GENERAL],
	open list, open list:SHARED MEMORY COMMUNICATIONS (SMC) SOCKETS

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@gmail.com>
---
 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);
 }
 
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] smc: Use flexible array for SMCD connections
  2026-05-19  0:52 [PATCH] smc: Use flexible array for SMCD connections Rosen Penev
@ 2026-05-19  8:57 ` Alexandra Winter
  2026-05-19 21:45   ` Rosen Penev
  0 siblings, 1 reply; 3+ messages in thread
From: Alexandra Winter @ 2026-05-19  8:57 UTC (permalink / raw)
  To: Rosen Penev, linux-rdma
  Cc: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Simon Horman, D. Wythe, Dust Li, Sidraya Jayagond, Wenjia Zhang,
	Mahanta Jambigi, Tony Lu, Wen Gu, open list:NETWORKING [GENERAL],
	open list, open list:SHARED MEMORY COMMUNICATIONS (SMC) SOCKETS



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@gmail.com>
> ---

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.

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);
>  }
>  


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] smc: Use flexible array for SMCD connections
  2026-05-19  8:57 ` Alexandra Winter
@ 2026-05-19 21:45   ` Rosen Penev
  0 siblings, 0 replies; 3+ messages in thread
From: Rosen Penev @ 2026-05-19 21:45 UTC (permalink / raw)
  To: Alexandra Winter
  Cc: linux-rdma, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, Simon Horman, D. Wythe, Dust Li, Sidraya Jayagond,
	Wenjia Zhang, Mahanta Jambigi, Tony Lu, Wen Gu,
	open list:NETWORKING [GENERAL], open list,
	open list:SHARED MEMORY COMMUNICATIONS (SMC) SOCKETS

On Tue, May 19, 2026 at 1:57 AM Alexandra Winter <wintera@linux.ibm.com> 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@gmail.com>
> > ---
>
> 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);
> >  }
> >
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-05-19 21:46 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-19  0:52 [PATCH] smc: Use flexible array for SMCD connections Rosen Penev
2026-05-19  8:57 ` Alexandra Winter
2026-05-19 21:45   ` Rosen Penev

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox