net/smc: get rid of tx_pend waits in socket closing
There is no need to wait for confirmation of pending tx requests for a closing connection, since pending tx slots are dismissed when finishing a connection. Signed-off-by: Ursula Braun <ubraun@linux.vnet.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
35a6b17847
commit
8429c13435
|
@ -57,9 +57,6 @@ static void smc_cdc_tx_handler(struct smc_wr_tx_pend_priv *pnd_snd,
|
||||||
cdcpend->conn);
|
cdcpend->conn);
|
||||||
}
|
}
|
||||||
smc_tx_sndbuf_nonfull(smc);
|
smc_tx_sndbuf_nonfull(smc);
|
||||||
if (smc->sk.sk_state != SMC_ACTIVE)
|
|
||||||
/* wake up smc_close_wait_tx_pends() */
|
|
||||||
smc->sk.sk_state_change(&smc->sk);
|
|
||||||
bh_unlock_sock(&smc->sk);
|
bh_unlock_sock(&smc->sk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,14 +152,6 @@ void smc_cdc_tx_dismiss_slots(struct smc_connection *conn)
|
||||||
(unsigned long)conn);
|
(unsigned long)conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool smc_cdc_tx_has_pending(struct smc_connection *conn)
|
|
||||||
{
|
|
||||||
struct smc_link *link = &conn->lgr->lnk[SMC_SINGLE_LINK];
|
|
||||||
|
|
||||||
return smc_wr_tx_has_pending(link, SMC_CDC_MSG_TYPE,
|
|
||||||
smc_cdc_tx_filter, (unsigned long)conn);
|
|
||||||
}
|
|
||||||
|
|
||||||
/********************************* receive ***********************************/
|
/********************************* receive ***********************************/
|
||||||
|
|
||||||
static inline bool smc_cdc_before(u16 seq1, u16 seq2)
|
static inline bool smc_cdc_before(u16 seq1, u16 seq2)
|
||||||
|
|
|
@ -214,7 +214,6 @@ void smc_cdc_tx_dismiss_slots(struct smc_connection *conn);
|
||||||
int smc_cdc_msg_send(struct smc_connection *conn, struct smc_wr_buf *wr_buf,
|
int smc_cdc_msg_send(struct smc_connection *conn, struct smc_wr_buf *wr_buf,
|
||||||
struct smc_cdc_tx_pend *pend);
|
struct smc_cdc_tx_pend *pend);
|
||||||
int smc_cdc_get_slot_and_msg_send(struct smc_connection *conn);
|
int smc_cdc_get_slot_and_msg_send(struct smc_connection *conn);
|
||||||
bool smc_cdc_tx_has_pending(struct smc_connection *conn);
|
|
||||||
int smc_cdc_init(void) __init;
|
int smc_cdc_init(void) __init;
|
||||||
|
|
||||||
#endif /* SMC_CDC_H */
|
#endif /* SMC_CDC_H */
|
||||||
|
|
|
@ -19,8 +19,6 @@
|
||||||
#include "smc_cdc.h"
|
#include "smc_cdc.h"
|
||||||
#include "smc_close.h"
|
#include "smc_close.h"
|
||||||
|
|
||||||
#define SMC_CLOSE_WAIT_TX_PENDS_TIME (5 * HZ)
|
|
||||||
|
|
||||||
static void smc_close_cleanup_listen(struct sock *parent)
|
static void smc_close_cleanup_listen(struct sock *parent)
|
||||||
{
|
{
|
||||||
struct sock *sk;
|
struct sock *sk;
|
||||||
|
@ -30,26 +28,6 @@ static void smc_close_cleanup_listen(struct sock *parent)
|
||||||
smc_close_non_accepted(sk);
|
smc_close_non_accepted(sk);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void smc_close_wait_tx_pends(struct smc_sock *smc)
|
|
||||||
{
|
|
||||||
DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
|
||||||
struct sock *sk = &smc->sk;
|
|
||||||
signed long timeout;
|
|
||||||
|
|
||||||
timeout = SMC_CLOSE_WAIT_TX_PENDS_TIME;
|
|
||||||
add_wait_queue(sk_sleep(sk), &wait);
|
|
||||||
while (!signal_pending(current) && timeout) {
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
rc = sk_wait_event(sk, &timeout,
|
|
||||||
!smc_cdc_tx_has_pending(&smc->conn),
|
|
||||||
&wait);
|
|
||||||
if (rc)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
remove_wait_queue(sk_sleep(sk), &wait);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* wait for sndbuf data being transmitted */
|
/* wait for sndbuf data being transmitted */
|
||||||
static void smc_close_stream_wait(struct smc_sock *smc, long timeout)
|
static void smc_close_stream_wait(struct smc_sock *smc, long timeout)
|
||||||
{
|
{
|
||||||
|
@ -230,7 +208,6 @@ int smc_close_active(struct smc_sock *smc)
|
||||||
rc = smc_close_final(conn);
|
rc = smc_close_final(conn);
|
||||||
}
|
}
|
||||||
sk->sk_state = SMC_CLOSED;
|
sk->sk_state = SMC_CLOSED;
|
||||||
smc_close_wait_tx_pends(smc);
|
|
||||||
break;
|
break;
|
||||||
case SMC_APPCLOSEWAIT1:
|
case SMC_APPCLOSEWAIT1:
|
||||||
case SMC_APPCLOSEWAIT2:
|
case SMC_APPCLOSEWAIT2:
|
||||||
|
@ -251,7 +228,6 @@ int smc_close_active(struct smc_sock *smc)
|
||||||
else
|
else
|
||||||
/* peer has just issued a shutdown write */
|
/* peer has just issued a shutdown write */
|
||||||
sk->sk_state = SMC_PEERFINCLOSEWAIT;
|
sk->sk_state = SMC_PEERFINCLOSEWAIT;
|
||||||
smc_close_wait_tx_pends(smc);
|
|
||||||
break;
|
break;
|
||||||
case SMC_PEERCLOSEWAIT1:
|
case SMC_PEERCLOSEWAIT1:
|
||||||
case SMC_PEERCLOSEWAIT2:
|
case SMC_PEERCLOSEWAIT2:
|
||||||
|
@ -271,7 +247,6 @@ int smc_close_active(struct smc_sock *smc)
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
smc_close_abort(conn);
|
smc_close_abort(conn);
|
||||||
sk->sk_state = SMC_CLOSED;
|
sk->sk_state = SMC_CLOSED;
|
||||||
smc_close_wait_tx_pends(smc);
|
|
||||||
break;
|
break;
|
||||||
case SMC_PEERABORTWAIT:
|
case SMC_PEERABORTWAIT:
|
||||||
case SMC_CLOSED:
|
case SMC_CLOSED:
|
||||||
|
|
|
@ -319,24 +319,6 @@ void smc_wr_tx_dismiss_slots(struct smc_link *link, u8 wr_rx_hdr_type,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool smc_wr_tx_has_pending(struct smc_link *link, u8 wr_rx_hdr_type,
|
|
||||||
smc_wr_tx_filter filter, unsigned long data)
|
|
||||||
{
|
|
||||||
struct smc_wr_tx_pend_priv *tx_pend;
|
|
||||||
struct smc_wr_rx_hdr *wr_rx;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for_each_set_bit(i, link->wr_tx_mask, link->wr_tx_cnt) {
|
|
||||||
wr_rx = (struct smc_wr_rx_hdr *)&link->wr_rx_bufs[i];
|
|
||||||
if (wr_rx->type != wr_rx_hdr_type)
|
|
||||||
continue;
|
|
||||||
tx_pend = &link->wr_tx_pends[i].priv;
|
|
||||||
if (filter(tx_pend, data))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************** receive queue ********************************/
|
/****************************** receive queue ********************************/
|
||||||
|
|
||||||
int smc_wr_rx_register_handler(struct smc_wr_rx_handler *handler)
|
int smc_wr_rx_register_handler(struct smc_wr_rx_handler *handler)
|
||||||
|
|
|
@ -93,8 +93,6 @@ int smc_wr_tx_put_slot(struct smc_link *link,
|
||||||
int smc_wr_tx_send(struct smc_link *link,
|
int smc_wr_tx_send(struct smc_link *link,
|
||||||
struct smc_wr_tx_pend_priv *wr_pend_priv);
|
struct smc_wr_tx_pend_priv *wr_pend_priv);
|
||||||
void smc_wr_tx_cq_handler(struct ib_cq *ib_cq, void *cq_context);
|
void smc_wr_tx_cq_handler(struct ib_cq *ib_cq, void *cq_context);
|
||||||
bool smc_wr_tx_has_pending(struct smc_link *link, u8 wr_rx_hdr_type,
|
|
||||||
smc_wr_tx_filter filter, unsigned long data);
|
|
||||||
void smc_wr_tx_dismiss_slots(struct smc_link *lnk, u8 wr_rx_hdr_type,
|
void smc_wr_tx_dismiss_slots(struct smc_link *lnk, u8 wr_rx_hdr_type,
|
||||||
smc_wr_tx_filter filter,
|
smc_wr_tx_filter filter,
|
||||||
smc_wr_tx_dismisser dismisser,
|
smc_wr_tx_dismisser dismisser,
|
||||||
|
|
Loading…
Reference in New Issue