diff options
author | Sowmini Varadhan <sowmini.varadhan@oracle.com> | 2015-04-08 16:33:47 (GMT) |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-04-08 19:17:32 (GMT) |
commit | 443be0e5affe3acb6dd81e7402951677e0a0eb35 (patch) | |
tree | 74cfc543b82a49fd7b920aade205cdca1ecb586b /net/rds/rds.h | |
parent | 1789b2c077f6d6c82b04cfe49a0fec020dc42488 (diff) | |
download | linux-443be0e5affe3acb6dd81e7402951677e0a0eb35.tar.xz |
RDS: make sure not to loop forever inside rds_send_xmit
If a determined set of concurrent senders keep the send queue full,
we can loop forever inside rds_send_xmit. This fix has two parts.
First we are dropping out of the while(1) loop after we've processed a
large batch of messages.
Second we add a generation number that gets bumped each time the
xmit bit lock is acquired. If someone else has jumped in and
made progress in the queue, we skip our goto restart.
Original patch by Chris Mason.
Signed-off-by: Sowmini Varadhan <sowmini.varadhan@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rds/rds.h')
-rw-r--r-- | net/rds/rds.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/net/rds/rds.h b/net/rds/rds.h index c2a5eef..02d8fd5 100644 --- a/net/rds/rds.h +++ b/net/rds/rds.h @@ -110,6 +110,7 @@ struct rds_connection { void *c_transport_data; atomic_t c_state; + unsigned long c_send_gen; unsigned long c_flags; unsigned long c_reconnect_jiffies; struct delayed_work c_send_w; |