diff options
author | Chris Mason <chris.mason@oracle.com> | 2010-05-11 18:14:16 -0400 |
---|---|---|
committer | Andy Grover <andy.grover@oracle.com> | 2010-09-08 21:15:10 -0400 |
commit | c9e65383a20d9a656db70efbf67e57f8115ad776 (patch) | |
tree | 3055f38ada5a60e858fe66e12353cad37e8ebdd5 /net/rds/ib_send.c | |
parent | 7e3f2952eeb1a0fe2aa9882fd1705a88f9d89b35 (diff) |
rds: Fix RDMA message reference counting
The RDS send_xmit code was trying to get fancy with message
counting and was dropping the final reference on the RDMA messages
too early. This resulted in memory corruption and oopsen.
The fix here is to always add a ref as the parts of the message passes
through rds_send_xmit, and always drop a ref as the parts of the message
go through completion handling.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'net/rds/ib_send.c')
-rw-r--r-- | net/rds/ib_send.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/net/rds/ib_send.c b/net/rds/ib_send.c index 657037d96cbf..82459e52c771 100644 --- a/net/rds/ib_send.c +++ b/net/rds/ib_send.c | |||
@@ -268,11 +268,12 @@ void rds_ib_send_cq_comp_handler(struct ib_cq *cq, void *context) | |||
268 | if (send->s_queued + HZ/2 < jiffies) | 268 | if (send->s_queued + HZ/2 < jiffies) |
269 | rds_ib_stats_inc(s_ib_tx_stalled); | 269 | rds_ib_stats_inc(s_ib_tx_stalled); |
270 | 270 | ||
271 | if (&send->s_op == &rm->m_final_op) { | 271 | if (send->s_op) { |
272 | /* If anyone waited for this message to get flushed out, wake | 272 | if (send->s_op == rm->m_final_op) { |
273 | * them up now */ | 273 | /* If anyone waited for this message to get flushed out, wake |
274 | rds_message_unmapped(rm); | 274 | * them up now */ |
275 | 275 | rds_message_unmapped(rm); | |
276 | } | ||
276 | rds_message_put(rm); | 277 | rds_message_put(rm); |
277 | send->s_op = NULL; | 278 | send->s_op = NULL; |
278 | } | 279 | } |