Commit 3ef13f3c authored by Andy Grover's avatar Andy Grover

RDS: cleanup/fix rds_rdma_unuse

First, it looks to me like the atomic_inc is wrong.
We should be decrementing refcount only once here, no? It's
already being done by the mr_put() at the end.

Second, simplify the logic a bit by bailing early (with a warning)
if !mr.
Signed-off-by: default avatarAndy Grover <andy.grover@oracle.com>
parent e779137a
...@@ -414,27 +414,30 @@ void rds_rdma_unuse(struct rds_sock *rs, u32 r_key, int force) ...@@ -414,27 +414,30 @@ void rds_rdma_unuse(struct rds_sock *rs, u32 r_key, int force)
spin_lock_irqsave(&rs->rs_rdma_lock, flags); spin_lock_irqsave(&rs->rs_rdma_lock, flags);
mr = rds_mr_tree_walk(&rs->rs_rdma_keys, r_key, NULL); mr = rds_mr_tree_walk(&rs->rs_rdma_keys, r_key, NULL);
if (mr && (mr->r_use_once || force)) { if (!mr) {
printk(KERN_ERR "rds: trying to unuse MR with unknown r_key %u!\n", r_key);
spin_unlock_irqrestore(&rs->rs_rdma_lock, flags);
return;
}
if (mr->r_use_once || force) {
rb_erase(&mr->r_rb_node, &rs->rs_rdma_keys); rb_erase(&mr->r_rb_node, &rs->rs_rdma_keys);
RB_CLEAR_NODE(&mr->r_rb_node); RB_CLEAR_NODE(&mr->r_rb_node);
zot_me = 1; zot_me = 1;
} else if (mr) }
atomic_inc(&mr->r_refcount);
spin_unlock_irqrestore(&rs->rs_rdma_lock, flags); spin_unlock_irqrestore(&rs->rs_rdma_lock, flags);
/* May have to issue a dma_sync on this memory region. /* May have to issue a dma_sync on this memory region.
* Note we could avoid this if the operation was a RDMA READ, * Note we could avoid this if the operation was a RDMA READ,
* but at this point we can't tell. */ * but at this point we can't tell. */
if (mr) { if (mr->r_trans->sync_mr)
if (mr->r_trans->sync_mr) mr->r_trans->sync_mr(mr->r_trans_private, DMA_FROM_DEVICE);
mr->r_trans->sync_mr(mr->r_trans_private, DMA_FROM_DEVICE);
/* If the MR was marked as invalidate, this will /* If the MR was marked as invalidate, this will
* trigger an async flush. */ * trigger an async flush. */
if (zot_me) if (zot_me)
rds_destroy_mr(mr); rds_destroy_mr(mr);
rds_mr_put(mr); rds_mr_put(mr);
}
} }
void rds_rdma_free_op(struct rds_rdma_op *ro) void rds_rdma_free_op(struct rds_rdma_op *ro)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment