From: Maxim Uvarov Date: Fri, 12 Oct 2012 11:26:22 +0000 (-0700) Subject: rds fix cong locking X-Git-Tag: v2.6.39-400.9.0~229 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=763f1cb179ec5fb8fb5393d38bb9ef4180bb6e5f;p=users%2Fjedix%2Flinux-maple.git rds fix cong locking --- diff --git a/net/rds/cong.c b/net/rds/cong.c index 6daaa49d133f..5eade097b755 100644 --- a/net/rds/cong.c +++ b/net/rds/cong.c @@ -210,12 +210,9 @@ int rds_cong_get_maps(struct rds_connection *conn) return 0; } -void rds_cong_queue_updates(struct rds_cong_map *map) +void __rds_cong_queue_updates(struct rds_cong_map *map) { struct rds_connection *conn; - unsigned long flags; - - spin_lock_irqsave(&rds_cong_lock, flags); list_for_each_entry(conn, &map->m_conn_list, c_map_item) { if (!test_and_set_bit(0, &conn->c_map_queued)) { @@ -223,10 +220,17 @@ void rds_cong_queue_updates(struct rds_cong_map *map) rds_send_xmit(conn); } } +} +void rds_cong_queue_updates(struct rds_cong_map *map) +{ + unsigned long flags; + spin_lock_irqsave(&rds_cong_lock, flags); + __rds_cong_queue_updates(map); spin_unlock_irqrestore(&rds_cong_lock, flags); } + void rds_cong_map_updated(struct rds_cong_map *map, uint64_t portmask) { rdsdebug("waking map %p for %pI4\n", @@ -334,12 +338,12 @@ void rds_cong_remove_socket(struct rds_sock *rs) /* update congestion map for now-closed port */ spin_lock_irqsave(&rds_cong_lock, flags); map = rds_cong_tree_walk(rs->rs_bound_addr, NULL); - spin_unlock_irqrestore(&rds_cong_lock, flags); if (map && rds_cong_test_bit(map, rs->rs_bound_port)) { rds_cong_clear_bit(map, rs->rs_bound_port); - rds_cong_queue_updates(map); + __rds_cong_queue_updates(map); } + spin_unlock_irqrestore(&rds_cong_lock, flags); } int rds_cong_wait(struct rds_cong_map *map, __be16 port, int nonblock,