net/smc: pre-fetch send buffer outside of send_lock
Pre-fetch send buffer for the CDC validation message before entering the send_lock. Without that the send call might fail with -EBUSY because there are no free buffers and waiting for buffers is not possible under send_lock. Signed-off-by: Karsten Graul <kgraul@linux.ibm.com> Reviewed-by: Ursula Braun <ubraun@linux.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
b86a372201
commit
b8ded9de8d
@@ -116,19 +116,15 @@ int smc_cdc_msg_send(struct smc_connection *conn,
|
||||
}
|
||||
|
||||
/* send a validation msg indicating the move of a conn to an other QP link */
|
||||
int smcr_cdc_msg_send_validation(struct smc_connection *conn)
|
||||
int smcr_cdc_msg_send_validation(struct smc_connection *conn,
|
||||
struct smc_cdc_tx_pend *pend,
|
||||
struct smc_wr_buf *wr_buf)
|
||||
{
|
||||
struct smc_host_cdc_msg *local = &conn->local_tx_ctrl;
|
||||
struct smc_link *link = conn->lnk;
|
||||
struct smc_cdc_tx_pend *pend;
|
||||
struct smc_wr_buf *wr_buf;
|
||||
struct smc_cdc_msg *peer;
|
||||
int rc;
|
||||
|
||||
rc = smc_cdc_get_free_slot(conn, link, &wr_buf, NULL, &pend);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
peer = (struct smc_cdc_msg *)wr_buf;
|
||||
peer->common.type = local->common.type;
|
||||
peer->len = local->len;
|
||||
|
Reference in New Issue
Block a user