net/smc: restructure CDC message reception

This patch moves a CDC sanity check from smc_cdc_msg_recv_action() to
the other sanity checks in smc_cdc_rx_handler(). While doing this, it
simplifies smc_cdc_msg_recv() and removes unneeded function parameters.

Signed-off-by: Hans Wippel <hwippel@linux.ibm.com>
Signed-off-by: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Hans Wippel 2018-05-18 09:34:15 +02:00 committed by David S. Miller
parent 2f6becaf79
commit d7b0e37c1a
1 changed files with 22 additions and 25 deletions

View File

@ -165,19 +165,12 @@ static inline bool smc_cdc_before(u16 seq1, u16 seq2)
} }
static void smc_cdc_msg_recv_action(struct smc_sock *smc, static void smc_cdc_msg_recv_action(struct smc_sock *smc,
struct smc_link *link,
struct smc_cdc_msg *cdc) struct smc_cdc_msg *cdc)
{ {
union smc_host_cursor cons_old, prod_old; union smc_host_cursor cons_old, prod_old;
struct smc_connection *conn = &smc->conn; struct smc_connection *conn = &smc->conn;
int diff_cons, diff_prod; int diff_cons, diff_prod;
if (!cdc->prod_flags.failover_validation) {
if (smc_cdc_before(ntohs(cdc->seqno),
conn->local_rx_ctrl.seqno))
/* received seqno is old */
return;
}
smc_curs_write(&prod_old, smc_curs_write(&prod_old,
smc_curs_read(&conn->local_rx_ctrl.prod, conn), smc_curs_read(&conn->local_rx_ctrl.prod, conn),
conn); conn);
@ -236,26 +229,11 @@ static void smc_cdc_msg_recv_action(struct smc_sock *smc,
} }
/* called under tasklet context */ /* called under tasklet context */
static inline void smc_cdc_msg_recv(struct smc_cdc_msg *cdc, static void smc_cdc_msg_recv(struct smc_sock *smc, struct smc_cdc_msg *cdc)
struct smc_link *link, u64 wr_id)
{ {
struct smc_link_group *lgr = container_of(link, struct smc_link_group,
lnk[SMC_SINGLE_LINK]);
struct smc_connection *connection;
struct smc_sock *smc;
/* lookup connection */
read_lock_bh(&lgr->conns_lock);
connection = smc_lgr_find_conn(ntohl(cdc->token), lgr);
if (!connection) {
read_unlock_bh(&lgr->conns_lock);
return;
}
smc = container_of(connection, struct smc_sock, conn);
sock_hold(&smc->sk); sock_hold(&smc->sk);
read_unlock_bh(&lgr->conns_lock);
bh_lock_sock(&smc->sk); bh_lock_sock(&smc->sk);
smc_cdc_msg_recv_action(smc, link, cdc); smc_cdc_msg_recv_action(smc, cdc);
bh_unlock_sock(&smc->sk); bh_unlock_sock(&smc->sk);
sock_put(&smc->sk); /* no free sk in softirq-context */ sock_put(&smc->sk); /* no free sk in softirq-context */
} }
@ -266,12 +244,31 @@ static void smc_cdc_rx_handler(struct ib_wc *wc, void *buf)
{ {
struct smc_link *link = (struct smc_link *)wc->qp->qp_context; struct smc_link *link = (struct smc_link *)wc->qp->qp_context;
struct smc_cdc_msg *cdc = buf; struct smc_cdc_msg *cdc = buf;
struct smc_connection *conn;
struct smc_link_group *lgr;
struct smc_sock *smc;
if (wc->byte_len < offsetof(struct smc_cdc_msg, reserved)) if (wc->byte_len < offsetof(struct smc_cdc_msg, reserved))
return; /* short message */ return; /* short message */
if (cdc->len != SMC_WR_TX_SIZE) if (cdc->len != SMC_WR_TX_SIZE)
return; /* invalid message */ return; /* invalid message */
smc_cdc_msg_recv(cdc, link, wc->wr_id);
/* lookup connection */
lgr = container_of(link, struct smc_link_group, lnk[SMC_SINGLE_LINK]);
read_lock_bh(&lgr->conns_lock);
conn = smc_lgr_find_conn(ntohl(cdc->token), lgr);
read_unlock_bh(&lgr->conns_lock);
if (!conn)
return;
smc = container_of(conn, struct smc_sock, conn);
if (!cdc->prod_flags.failover_validation) {
if (smc_cdc_before(ntohs(cdc->seqno),
conn->local_rx_ctrl.seqno))
/* received seqno is old */
return;
}
smc_cdc_msg_recv(smc, cdc);
} }
static struct smc_wr_rx_handler smc_cdc_rx_handlers[] = { static struct smc_wr_rx_handler smc_cdc_rx_handlers[] = {