diff options
Diffstat (limited to 'net/smc/smc_cdc.c')
| -rw-r--r-- | net/smc/smc_cdc.c | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/net/smc/smc_cdc.c b/net/smc/smc_cdc.c index db83332ac1c8..fb07ad8d69a6 100644 --- a/net/smc/smc_cdc.c +++ b/net/smc/smc_cdc.c | |||
| @@ -21,13 +21,6 @@ | |||
| 21 | 21 | ||
| 22 | /********************************** send *************************************/ | 22 | /********************************** send *************************************/ |
| 23 | 23 | ||
| 24 | struct smc_cdc_tx_pend { | ||
| 25 | struct smc_connection *conn; /* socket connection */ | ||
| 26 | union smc_host_cursor cursor; /* tx sndbuf cursor sent */ | ||
| 27 | union smc_host_cursor p_cursor; /* rx RMBE cursor produced */ | ||
| 28 | u16 ctrl_seq; /* conn. tx sequence # */ | ||
| 29 | }; | ||
| 30 | |||
| 31 | /* handler for send/transmission completion of a CDC msg */ | 24 | /* handler for send/transmission completion of a CDC msg */ |
| 32 | static void smc_cdc_tx_handler(struct smc_wr_tx_pend_priv *pnd_snd, | 25 | static void smc_cdc_tx_handler(struct smc_wr_tx_pend_priv *pnd_snd, |
| 33 | struct smc_link *link, | 26 | struct smc_link *link, |
| @@ -61,12 +54,14 @@ static void smc_cdc_tx_handler(struct smc_wr_tx_pend_priv *pnd_snd, | |||
| 61 | 54 | ||
| 62 | int smc_cdc_get_free_slot(struct smc_connection *conn, | 55 | int smc_cdc_get_free_slot(struct smc_connection *conn, |
| 63 | struct smc_wr_buf **wr_buf, | 56 | struct smc_wr_buf **wr_buf, |
| 57 | struct smc_rdma_wr **wr_rdma_buf, | ||
| 64 | struct smc_cdc_tx_pend **pend) | 58 | struct smc_cdc_tx_pend **pend) |
| 65 | { | 59 | { |
| 66 | struct smc_link *link = &conn->lgr->lnk[SMC_SINGLE_LINK]; | 60 | struct smc_link *link = &conn->lgr->lnk[SMC_SINGLE_LINK]; |
| 67 | int rc; | 61 | int rc; |
| 68 | 62 | ||
| 69 | rc = smc_wr_tx_get_free_slot(link, smc_cdc_tx_handler, wr_buf, | 63 | rc = smc_wr_tx_get_free_slot(link, smc_cdc_tx_handler, wr_buf, |
| 64 | wr_rdma_buf, | ||
| 70 | (struct smc_wr_tx_pend_priv **)pend); | 65 | (struct smc_wr_tx_pend_priv **)pend); |
| 71 | if (!conn->alert_token_local) | 66 | if (!conn->alert_token_local) |
| 72 | /* abnormal termination */ | 67 | /* abnormal termination */ |
| @@ -96,6 +91,7 @@ int smc_cdc_msg_send(struct smc_connection *conn, | |||
| 96 | struct smc_wr_buf *wr_buf, | 91 | struct smc_wr_buf *wr_buf, |
| 97 | struct smc_cdc_tx_pend *pend) | 92 | struct smc_cdc_tx_pend *pend) |
| 98 | { | 93 | { |
| 94 | union smc_host_cursor cfed; | ||
| 99 | struct smc_link *link; | 95 | struct smc_link *link; |
| 100 | int rc; | 96 | int rc; |
| 101 | 97 | ||
| @@ -105,12 +101,10 @@ int smc_cdc_msg_send(struct smc_connection *conn, | |||
| 105 | 101 | ||
| 106 | conn->tx_cdc_seq++; | 102 | conn->tx_cdc_seq++; |
| 107 | conn->local_tx_ctrl.seqno = conn->tx_cdc_seq; | 103 | conn->local_tx_ctrl.seqno = conn->tx_cdc_seq; |
| 108 | smc_host_msg_to_cdc((struct smc_cdc_msg *)wr_buf, | 104 | smc_host_msg_to_cdc((struct smc_cdc_msg *)wr_buf, conn, &cfed); |
| 109 | &conn->local_tx_ctrl, conn); | ||
| 110 | rc = smc_wr_tx_send(link, (struct smc_wr_tx_pend_priv *)pend); | 105 | rc = smc_wr_tx_send(link, (struct smc_wr_tx_pend_priv *)pend); |
| 111 | if (!rc) | 106 | if (!rc) |
| 112 | smc_curs_copy(&conn->rx_curs_confirmed, | 107 | smc_curs_copy(&conn->rx_curs_confirmed, &cfed, conn); |
| 113 | &conn->local_tx_ctrl.cons, conn); | ||
| 114 | 108 | ||
| 115 | return rc; | 109 | return rc; |
| 116 | } | 110 | } |
| @@ -121,11 +115,14 @@ static int smcr_cdc_get_slot_and_msg_send(struct smc_connection *conn) | |||
| 121 | struct smc_wr_buf *wr_buf; | 115 | struct smc_wr_buf *wr_buf; |
| 122 | int rc; | 116 | int rc; |
| 123 | 117 | ||
| 124 | rc = smc_cdc_get_free_slot(conn, &wr_buf, &pend); | 118 | rc = smc_cdc_get_free_slot(conn, &wr_buf, NULL, &pend); |
| 125 | if (rc) | 119 | if (rc) |
| 126 | return rc; | 120 | return rc; |
| 127 | 121 | ||
| 128 | return smc_cdc_msg_send(conn, wr_buf, pend); | 122 | spin_lock_bh(&conn->send_lock); |
| 123 | rc = smc_cdc_msg_send(conn, wr_buf, pend); | ||
| 124 | spin_unlock_bh(&conn->send_lock); | ||
| 125 | return rc; | ||
| 129 | } | 126 | } |
| 130 | 127 | ||
| 131 | int smc_cdc_get_slot_and_msg_send(struct smc_connection *conn) | 128 | int smc_cdc_get_slot_and_msg_send(struct smc_connection *conn) |
