Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 501dcccd authored by Zach Brown's avatar Zach Brown Committed by Andy Grover
Browse files

rds: block ints when acquiring c_lock in rds_conn_message_info()



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: default avatarZach Brown <zach.brown@oracle.com>
parent 671202f3
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -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);
@@ -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) {
@@ -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();