Skip to content

Commit

Permalink
rds: block ints when acquiring c_lock in rds_conn_message_info()
Browse files Browse the repository at this point in the history
conn->c_lock is acquired in interrupt context.  rds_conn_message_info() is
called from user context and was acquiring c_lock without blocking interrupts,
leading to possible deadlocks.

Signed-off-by: Zach Brown <zach.brown@oracle.com>
  • Loading branch information
Zach Brown authored and Andy Grover committed Sep 9, 2010
1 parent 671202f commit 501dccc
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions net/rds/connection.c
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,7 @@ static void rds_conn_message_info(struct socket *sock, unsigned int len,
struct rds_connection *conn;
struct rds_message *rm;
unsigned int total = 0;
unsigned long flags;
size_t i;

len /= sizeof(struct rds_info_message);
Expand All @@ -389,7 +390,7 @@ static void rds_conn_message_info(struct socket *sock, unsigned int len,
else
list = &conn->c_retrans;

spin_lock(&conn->c_lock);
spin_lock_irqsave(&conn->c_lock, flags);

/* XXX too lazy to maintain counts.. */
list_for_each_entry(rm, list, m_conn_item) {
Expand All @@ -400,7 +401,7 @@ static void rds_conn_message_info(struct socket *sock, unsigned int len,
conn->c_faddr, 0);
}

spin_unlock(&conn->c_lock);
spin_unlock_irqrestore(&conn->c_lock, flags);
}
}
rcu_read_unlock();
Expand Down

0 comments on commit 501dccc

Please sign in to comment.