From: Rosen Penev Date: Tue, 19 May 2026 00:52:06 +0000 (-0700) Subject: smc: Use flexible array for SMCD connections X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5026c42d7f147fb6bc4e063abfa5b52bfd52ca35;p=thirdparty%2Flinux.git smc: Use flexible array for SMCD connections 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. Signed-off-by: Rosen Penev Reviewed-by: Sidraya Jayagond Link: https://patch.msgid.link/20260519005206.628071-1-rosenp@gmail.com Signed-off-by: Jakub Kicinski --- diff --git a/include/net/smc.h b/include/net/smc.h index bfdc4c41f0198..a2bc3ab88075b 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 e0dba2c7b6e31..bde938c5eb397 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); }