diff options
author | Andy Grover <andy.grover@oracle.com> | 2010-03-23 20:39:07 -0400 |
---|---|---|
committer | Andy Grover <andy.grover@oracle.com> | 2010-09-08 21:12:12 -0400 |
commit | 049ee3f500954176a87f22e6ee3e98aecb1b8958 (patch) | |
tree | 5dfd8cf3e6d9a7a15e80f6ddee7f4ce7c4aa7a8c /net/rds/connection.c | |
parent | f17a1a55fb672d7f64be7f2e940ef5669e5efa0a (diff) |
RDS: Change send lock from a mutex to a spinlock
This change allows us to call rds_send_xmit() from a tasklet,
which is crucial to our new operating model.
* Change c_send_lock to a spinlock
* Update stats fields "sem_" to "_lock"
* Remove unneeded rds_conn_is_sending()
About locking between shutdown and send -- send checks if the
connection is up. Shutdown puts the connection into
DISCONNECTING. After this, all threads entering send will exit
immediately. However, a thread could be *in* send_xmit(), so
shutdown acquires the c_send_lock to ensure everyone is out
before proceeding with connection shutdown.
Signed-off-by: Andy Grover <andy.grover@oracle.com>
Diffstat (limited to 'net/rds/connection.c')
-rw-r--r-- | net/rds/connection.c | 22 |
1 files changed, 6 insertions, 16 deletions
diff --git a/net/rds/connection.c b/net/rds/connection.c index 88bcaf3f3e1..56aebe444ad 100644 --- a/net/rds/connection.c +++ b/net/rds/connection.c | |||
@@ -62,18 +62,6 @@ static struct hlist_head *rds_conn_bucket(__be32 laddr, __be32 faddr) | |||
62 | var |= RDS_INFO_CONNECTION_FLAG_##suffix; \ | 62 | var |= RDS_INFO_CONNECTION_FLAG_##suffix; \ |
63 | } while (0) | 63 | } while (0) |
64 | 64 | ||
65 | static inline int rds_conn_is_sending(struct rds_connection *conn) | ||
66 | { | ||
67 | int ret = 0; | ||
68 | |||
69 | if (!mutex_trylock(&conn->c_send_lock)) | ||
70 | ret = 1; | ||
71 | else | ||
72 | mutex_unlock(&conn->c_send_lock); | ||
73 | |||
74 | return ret; | ||
75 | } | ||
76 | |||
77 | static struct rds_connection *rds_conn_lookup(struct hlist_head *head, | 65 | static struct rds_connection *rds_conn_lookup(struct hlist_head *head, |
78 | __be32 laddr, __be32 faddr, | 66 | __be32 laddr, __be32 faddr, |
79 | struct rds_transport *trans) | 67 | struct rds_transport *trans) |
@@ -158,7 +146,7 @@ static struct rds_connection *__rds_conn_create(__be32 laddr, __be32 faddr, | |||
158 | spin_lock_init(&conn->c_lock); | 146 | spin_lock_init(&conn->c_lock); |
159 | conn->c_next_tx_seq = 1; | 147 | conn->c_next_tx_seq = 1; |
160 | 148 | ||
161 | mutex_init(&conn->c_send_lock); | 149 | spin_lock_init(&conn->c_send_lock); |
162 | INIT_LIST_HEAD(&conn->c_send_queue); | 150 | INIT_LIST_HEAD(&conn->c_send_queue); |
163 | INIT_LIST_HEAD(&conn->c_retrans); | 151 | INIT_LIST_HEAD(&conn->c_retrans); |
164 | 152 | ||
@@ -283,10 +271,12 @@ void rds_conn_shutdown(struct rds_connection *conn) | |||
283 | } | 271 | } |
284 | mutex_unlock(&conn->c_cm_lock); | 272 | mutex_unlock(&conn->c_cm_lock); |
285 | 273 | ||
286 | mutex_lock(&conn->c_send_lock); | 274 | /* verify everybody's out of rds_send_xmit() */ |
275 | spin_lock_irq(&conn->c_send_lock); | ||
276 | spin_unlock_irq(&conn->c_send_lock); | ||
277 | |||
287 | conn->c_trans->conn_shutdown(conn); | 278 | conn->c_trans->conn_shutdown(conn); |
288 | rds_conn_reset(conn); | 279 | rds_conn_reset(conn); |
289 | mutex_unlock(&conn->c_send_lock); | ||
290 | 280 | ||
291 | if (!rds_conn_transition(conn, RDS_CONN_DISCONNECTING, RDS_CONN_DOWN)) { | 281 | if (!rds_conn_transition(conn, RDS_CONN_DISCONNECTING, RDS_CONN_DOWN)) { |
292 | /* This can happen - eg when we're in the middle of tearing | 282 | /* This can happen - eg when we're in the middle of tearing |
@@ -476,7 +466,7 @@ static int rds_conn_info_visitor(struct rds_connection *conn, | |||
476 | cinfo->flags = 0; | 466 | cinfo->flags = 0; |
477 | 467 | ||
478 | rds_conn_info_set(cinfo->flags, | 468 | rds_conn_info_set(cinfo->flags, |
479 | rds_conn_is_sending(conn), SENDING); | 469 | spin_is_locked(&conn->c_send_lock), SENDING); |
480 | /* XXX Future: return the state rather than these funky bits */ | 470 | /* XXX Future: return the state rather than these funky bits */ |
481 | rds_conn_info_set(cinfo->flags, | 471 | rds_conn_info_set(cinfo->flags, |
482 | atomic_read(&conn->c_state) == RDS_CONN_CONNECTING, | 472 | atomic_read(&conn->c_state) == RDS_CONN_CONNECTING, |