rds: don't let RDS shutdown a connection while senders are present

This is the first in a long line of patches that tries to fix races
between RDS connection shutdown and RDS traffic.

Here we are maintaining a count of active senders to make sure
the connection doesn't go away while they are using it.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
Chris Mason
2010-05-11 15:11:11 -07:00
committed by Andy Grover
parent 38a4e5e613
commit 7e3f2952ee
5 changed files with 26 additions and 16 deletions

View File

@@ -148,6 +148,7 @@ static struct rds_connection *__rds_conn_create(__be32 laddr, __be32 faddr,
spin_lock_init(&conn->c_send_lock);
atomic_set(&conn->c_send_generation, 1);
atomic_set(&conn->c_senders, 0);
INIT_LIST_HEAD(&conn->c_send_queue);
INIT_LIST_HEAD(&conn->c_retrans);
@@ -276,6 +277,12 @@ void rds_conn_shutdown(struct rds_connection *conn)
spin_lock_irq(&conn->c_send_lock);
spin_unlock_irq(&conn->c_send_lock);
while(atomic_read(&conn->c_senders)) {
schedule_timeout(1);
spin_lock_irq(&conn->c_send_lock);
spin_unlock_irq(&conn->c_send_lock);
}
conn->c_trans->conn_shutdown(conn);
rds_conn_reset(conn);