Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+15 −12
Original line number Diff line number Diff line
@@ -414,18 +414,22 @@ void rds_rdma_unuse(struct rds_sock *rs, u32 r_key, int force)

	spin_lock_irqsave(&rs->rs_rdma_lock, flags);
	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_CLEAR_NODE(&mr->r_rb_node);
		zot_me = 1;
	} else if (mr)
		atomic_inc(&mr->r_refcount);
	}
	spin_unlock_irqrestore(&rs->rs_rdma_lock, flags);

	/* May have to issue a dma_sync on this memory region.
	 * Note we could avoid this if the operation was a RDMA READ,
	 * but at this point we can't tell. */
	if (mr) {
	if (mr->r_trans->sync_mr)
		mr->r_trans->sync_mr(mr->r_trans_private, DMA_FROM_DEVICE);

@@ -435,7 +439,6 @@ void rds_rdma_unuse(struct rds_sock *rs, u32 r_key, int force)
		rds_destroy_mr(mr);
	rds_mr_put(mr);
}
}

void rds_rdma_free_op(struct rds_rdma_op *ro)
{