| From 9251a9ca0a8317a1abf8c06f385507a685ef4b7c Mon Sep 17 00:00:00 2001 |
| From: "jeff.liu" <jeff.liu@oracle.com> |
| Date: Mon, 8 Oct 2012 18:57:27 +0000 |
| Subject: RDS: fix rds-ping spinlock recursion |
| |
| |
| From: "jeff.liu" <jeff.liu@oracle.com> |
| |
| [ Upstream commit 5175a5e76bbdf20a614fb47ce7a38f0f39e70226 ] |
| |
| This is the revised patch for fixing rds-ping spinlock recursion |
| according to Venkat's suggestions. |
| |
| RDS ping/pong over TCP feature has been broken for years(2.6.39 to |
| 3.6.0) since we have to set TCP cork and call kernel_sendmsg() between |
| ping/pong which both need to lock "struct sock *sk". However, this |
| lock has already been hold before rds_tcp_data_ready() callback is |
| triggerred. As a result, we always facing spinlock resursion which |
| would resulting in system panic. |
| |
| Given that RDS ping is only used to test the connectivity and not for |
| serious performance measurements, we can queue the pong transmit to |
| rds_wq as a delayed response. |
| |
| Reported-by: Dan Carpenter <dan.carpenter@oracle.com> |
| CC: Venkat Venkatsubra <venkat.x.venkatsubra@oracle.com> |
| CC: David S. Miller <davem@davemloft.net> |
| CC: James Morris <james.l.morris@oracle.com> |
| Signed-off-by: Jie Liu <jeff.liu@oracle.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/rds/send.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/net/rds/send.c |
| +++ b/net/rds/send.c |
| @@ -1121,7 +1121,7 @@ rds_send_pong(struct rds_connection *con |
| rds_stats_inc(s_send_pong); |
| |
| if (!test_bit(RDS_LL_SEND_FULL, &conn->c_flags)) |
| - rds_send_xmit(conn); |
| + queue_delayed_work(rds_wq, &conn->c_send_w, 0); |
| |
| rds_message_put(rm); |
| return 0; |