Skip to content

Commit 9fda351

Browse files
Hans Wippeldavem330
authored andcommitted
net/smc: move link group list to smc_core
This patch moves the global link group list to smc_core where the link group functions are. To make this work, it moves code in af_smc and smc_ib that operates on the link group list to smc_core as well. While at it, the link group counter is integrated into the list structure and initialized to zero. Signed-off-by: Hans Wippel <[email protected]> Signed-off-by: Ursula Braun <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 69cb7dc commit 9fda351

File tree

4 files changed

+42
-35
lines changed

4 files changed

+42
-35
lines changed

net/smc/af_smc.c

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,6 @@ static DEFINE_MUTEX(smc_create_lgr_pending); /* serialize link group
4646
* creation
4747
*/
4848

49-
struct smc_lgr_list smc_lgr_list = { /* established link groups */
50-
.lock = __SPIN_LOCK_UNLOCKED(smc_lgr_list.lock),
51-
.list = LIST_HEAD_INIT(smc_lgr_list.list),
52-
};
53-
5449
static void smc_tcp_listen_work(struct work_struct *);
5550

5651
static void smc_set_keepalive(struct sock *sk, int val)
@@ -1637,19 +1632,7 @@ static int __init smc_init(void)
16371632

16381633
static void __exit smc_exit(void)
16391634
{
1640-
struct smc_link_group *lgr, *lg;
1641-
LIST_HEAD(lgr_freeing_list);
1642-
1643-
spin_lock_bh(&smc_lgr_list.lock);
1644-
if (!list_empty(&smc_lgr_list.list))
1645-
list_splice_init(&smc_lgr_list.list, &lgr_freeing_list);
1646-
spin_unlock_bh(&smc_lgr_list.lock);
1647-
list_for_each_entry_safe(lgr, lg, &lgr_freeing_list, list) {
1648-
list_del_init(&lgr->list);
1649-
smc_llc_link_inactive(&lgr->lnk[SMC_SINGLE_LINK]);
1650-
cancel_delayed_work_sync(&lgr->free_work);
1651-
smc_lgr_free(lgr); /* free link group */
1652-
}
1635+
smc_core_exit();
16531636
static_branch_disable(&tcp_have_smc);
16541637
smc_ib_unregister_client();
16551638
sock_unregister(PF_SMC);

net/smc/smc_core.c

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@
3030
#define SMC_LGR_FREE_DELAY_SERV (600 * HZ)
3131
#define SMC_LGR_FREE_DELAY_CLNT (SMC_LGR_FREE_DELAY_SERV + 10)
3232

33-
static u32 smc_lgr_num; /* unique link group number */
33+
static struct smc_lgr_list smc_lgr_list = { /* established link groups */
34+
.lock = __SPIN_LOCK_UNLOCKED(smc_lgr_list.lock),
35+
.list = LIST_HEAD_INIT(smc_lgr_list.list),
36+
.num = 0,
37+
};
3438

3539
static void smc_buf_free(struct smc_buf_desc *buf_desc, struct smc_link *lnk,
3640
bool is_rmb);
@@ -181,8 +185,8 @@ static int smc_lgr_create(struct smc_sock *smc,
181185
INIT_LIST_HEAD(&lgr->sndbufs[i]);
182186
INIT_LIST_HEAD(&lgr->rmbs[i]);
183187
}
184-
smc_lgr_num += SMC_LGR_NUM_INCR;
185-
memcpy(&lgr->id, (u8 *)&smc_lgr_num, SMC_LGR_ID_SIZE);
188+
smc_lgr_list.num += SMC_LGR_NUM_INCR;
189+
memcpy(&lgr->id, (u8 *)&smc_lgr_list.num, SMC_LGR_ID_SIZE);
186190
INIT_DELAYED_WORK(&lgr->free_work, smc_lgr_free_work);
187191
lgr->conns_all = RB_ROOT;
188192

@@ -374,6 +378,18 @@ void smc_lgr_terminate(struct smc_link_group *lgr)
374378
smc_lgr_schedule_free_work(lgr);
375379
}
376380

381+
/* Called when IB port is terminated */
382+
void smc_port_terminate(struct smc_ib_device *smcibdev, u8 ibport)
383+
{
384+
struct smc_link_group *lgr, *l;
385+
386+
list_for_each_entry_safe(lgr, l, &smc_lgr_list.list, list) {
387+
if (lgr->lnk[SMC_SINGLE_LINK].smcibdev == smcibdev &&
388+
lgr->lnk[SMC_SINGLE_LINK].ibport == ibport)
389+
smc_lgr_terminate(lgr);
390+
}
391+
}
392+
377393
/* Determine vlan of internal TCP socket.
378394
* @vlan_id: address to store the determined vlan id into
379395
*/
@@ -802,3 +818,21 @@ int smc_rmb_rtoken_handling(struct smc_connection *conn,
802818
return conn->rtoken_idx;
803819
return 0;
804820
}
821+
822+
/* Called (from smc_exit) when module is removed */
823+
void smc_core_exit(void)
824+
{
825+
struct smc_link_group *lgr, *lg;
826+
LIST_HEAD(lgr_freeing_list);
827+
828+
spin_lock_bh(&smc_lgr_list.lock);
829+
if (!list_empty(&smc_lgr_list.list))
830+
list_splice_init(&smc_lgr_list.list, &lgr_freeing_list);
831+
spin_unlock_bh(&smc_lgr_list.lock);
832+
list_for_each_entry_safe(lgr, lg, &lgr_freeing_list, list) {
833+
list_del_init(&lgr->list);
834+
smc_llc_link_inactive(&lgr->lnk[SMC_SINGLE_LINK]);
835+
cancel_delayed_work_sync(&lgr->free_work);
836+
smc_lgr_free(lgr); /* free link group */
837+
}
838+
}

net/smc/smc_core.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,9 @@
2323
struct smc_lgr_list { /* list of link group definition */
2424
struct list_head list;
2525
spinlock_t lock; /* protects list of link groups */
26+
u32 num; /* unique link group number */
2627
};
2728

28-
extern struct smc_lgr_list smc_lgr_list; /* list of link groups */
29-
3029
enum smc_lgr_role { /* possible roles of a link group */
3130
SMC_CLNT, /* client */
3231
SMC_SERV /* server */
@@ -210,6 +209,7 @@ struct smc_clc_msg_accept_confirm;
210209
void smc_lgr_free(struct smc_link_group *lgr);
211210
void smc_lgr_forget(struct smc_link_group *lgr);
212211
void smc_lgr_terminate(struct smc_link_group *lgr);
212+
void smc_port_terminate(struct smc_ib_device *smcibdev, u8 ibport);
213213
int smc_buf_create(struct smc_sock *smc);
214214
int smc_rmb_rtoken_handling(struct smc_connection *conn,
215215
struct smc_clc_msg_accept_confirm *clc);
@@ -219,4 +219,5 @@ void smc_sndbuf_sync_sg_for_cpu(struct smc_connection *conn);
219219
void smc_sndbuf_sync_sg_for_device(struct smc_connection *conn);
220220
void smc_rmb_sync_sg_for_cpu(struct smc_connection *conn);
221221
void smc_rmb_sync_sg_for_device(struct smc_connection *conn);
222+
void smc_core_exit(void);
222223
#endif

net/smc/smc_ib.c

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -143,17 +143,6 @@ int smc_ib_ready_link(struct smc_link *lnk)
143143
return rc;
144144
}
145145

146-
static void smc_ib_port_terminate(struct smc_ib_device *smcibdev, u8 ibport)
147-
{
148-
struct smc_link_group *lgr, *l;
149-
150-
list_for_each_entry_safe(lgr, l, &smc_lgr_list.list, list) {
151-
if (lgr->lnk[SMC_SINGLE_LINK].smcibdev == smcibdev &&
152-
lgr->lnk[SMC_SINGLE_LINK].ibport == ibport)
153-
smc_lgr_terminate(lgr);
154-
}
155-
}
156-
157146
/* process context wrapper for might_sleep smc_ib_remember_port_attr */
158147
static void smc_ib_port_event_work(struct work_struct *work)
159148
{
@@ -165,7 +154,7 @@ static void smc_ib_port_event_work(struct work_struct *work)
165154
smc_ib_remember_port_attr(smcibdev, port_idx + 1);
166155
clear_bit(port_idx, &smcibdev->port_event_mask);
167156
if (!smc_ib_port_active(smcibdev, port_idx + 1))
168-
smc_ib_port_terminate(smcibdev, port_idx + 1);
157+
smc_port_terminate(smcibdev, port_idx + 1);
169158
}
170159
}
171160

0 commit comments

Comments
 (0)