aboutsummaryrefslogtreecommitdiffstats
path: root/net/rds/ib_send.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2010-05-11 18:14:16 -0400
committerAndy Grover <andy.grover@oracle.com>2010-09-08 21:15:10 -0400
commitc9e65383a20d9a656db70efbf67e57f8115ad776 (patch)
tree3055f38ada5a60e858fe66e12353cad37e8ebdd5 /net/rds/ib_send.c
parent7e3f2952eeb1a0fe2aa9882fd1705a88f9d89b35 (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.c11
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 }