Skip to content

Commit b45e7f9

Browse files
karstengrdavem330
authored andcommitted
net/smc: llc_add_link_work to handle ADD_LINK LLC requests
Introduce a work that is scheduled when a new ADD_LINK LLC request is received. The work will call either the SMC client or SMC server ADD_LINK processing. Signed-off-by: Karsten Graul <[email protected]> Reviewed-by: Ursula Braun <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 8574cf4 commit b45e7f9

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

net/smc/smc_core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ struct smc_link_group {
253253
/* protects llc_event_q */
254254
struct mutex llc_conf_mutex;
255255
/* protects lgr reconfig. */
256+
struct work_struct llc_add_link_work;
256257
struct work_struct llc_event_work;
257258
/* llc event worker */
258259
wait_queue_head_t llc_waiter;

net/smc/smc_llc.c

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,24 @@ static int smc_llc_alloc_alt_link(struct smc_link_group *lgr,
565565
return -EMLINK;
566566
}
567567

568+
/* worker to process an add link message */
569+
static void smc_llc_add_link_work(struct work_struct *work)
570+
{
571+
struct smc_link_group *lgr = container_of(work, struct smc_link_group,
572+
llc_add_link_work);
573+
574+
if (list_empty(&lgr->list)) {
575+
/* link group is terminating */
576+
smc_llc_flow_qentry_del(&lgr->llc_flow_lcl);
577+
goto out;
578+
}
579+
580+
/* tbd: call smc_llc_process_cli_add_link(lgr); */
581+
/* tbd: call smc_llc_process_srv_add_link(lgr); */
582+
out:
583+
smc_llc_flow_stop(lgr, &lgr->llc_flow_lcl);
584+
}
585+
568586
static void smc_llc_rx_delete_link(struct smc_link *link,
569587
struct smc_llc_msg_del_link *llc)
570588
{
@@ -685,11 +703,11 @@ static void smc_llc_event_handler(struct smc_llc_qentry *qentry)
685703
wake_up_interruptible(&lgr->llc_waiter);
686704
} else if (smc_llc_flow_start(&lgr->llc_flow_lcl,
687705
qentry)) {
688-
/* tbd: schedule_work(&lgr->llc_add_link_work); */
706+
schedule_work(&lgr->llc_add_link_work);
689707
}
690708
} else if (smc_llc_flow_start(&lgr->llc_flow_lcl, qentry)) {
691709
/* as smc server, handle client suggestion */
692-
/* tbd: schedule_work(&lgr->llc_add_link_work); */
710+
schedule_work(&lgr->llc_add_link_work);
693711
}
694712
return;
695713
case SMC_LLC_CONFIRM_LINK:
@@ -868,6 +886,7 @@ void smc_llc_lgr_init(struct smc_link_group *lgr, struct smc_sock *smc)
868886
struct net *net = sock_net(smc->clcsock->sk);
869887

870888
INIT_WORK(&lgr->llc_event_work, smc_llc_event_work);
889+
INIT_WORK(&lgr->llc_add_link_work, smc_llc_add_link_work);
871890
INIT_LIST_HEAD(&lgr->llc_event_q);
872891
spin_lock_init(&lgr->llc_event_q_lock);
873892
spin_lock_init(&lgr->llc_flow_lock);
@@ -882,6 +901,7 @@ void smc_llc_lgr_clear(struct smc_link_group *lgr)
882901
smc_llc_event_flush(lgr);
883902
wake_up_interruptible_all(&lgr->llc_waiter);
884903
cancel_work_sync(&lgr->llc_event_work);
904+
cancel_work_sync(&lgr->llc_add_link_work);
885905
if (lgr->delayed_event) {
886906
kfree(lgr->delayed_event);
887907
lgr->delayed_event = NULL;

0 commit comments

Comments
 (0)