Commit 3427e854 authored by Andy Grover's avatar Andy Grover

RDS: Assume recv->r_frag is always NULL in refill_one()

refill_one() should never be called on a recv struct that
doesn't need a new r_frag allocated. Add a WARN and remove
conditional around r_frag alloc code.

Also, add a comment to explain why r_ibinc may or may not
need refilling.
Signed-off-by: default avatarAndy Grover <andy.grover@oracle.com>
parent 0b088e00
...@@ -126,6 +126,10 @@ static int rds_ib_recv_refill_one(struct rds_connection *conn, ...@@ -126,6 +126,10 @@ static int rds_ib_recv_refill_one(struct rds_connection *conn,
struct ib_sge *sge; struct ib_sge *sge;
int ret = -ENOMEM; int ret = -ENOMEM;
/*
* ibinc was taken from recv if recv contained the start of a message.
* recvs that were continuations will still have this allocated.
*/
if (!recv->r_ibinc) { if (!recv->r_ibinc) {
if (!atomic_add_unless(&rds_ib_allocation, 1, rds_ib_sysctl_max_recv_allocation)) { if (!atomic_add_unless(&rds_ib_allocation, 1, rds_ib_sysctl_max_recv_allocation)) {
rds_ib_stats_inc(s_ib_rx_alloc_limit); rds_ib_stats_inc(s_ib_rx_alloc_limit);
...@@ -140,19 +144,18 @@ static int rds_ib_recv_refill_one(struct rds_connection *conn, ...@@ -140,19 +144,18 @@ static int rds_ib_recv_refill_one(struct rds_connection *conn,
rds_inc_init(&recv->r_ibinc->ii_inc, conn, conn->c_faddr); rds_inc_init(&recv->r_ibinc->ii_inc, conn, conn->c_faddr);
} }
if (!recv->r_frag) { WARN_ON(recv->r_frag); /* leak! */
recv->r_frag = kmem_cache_alloc(rds_ib_frag_slab, GFP_NOWAIT); recv->r_frag = kmem_cache_alloc(rds_ib_frag_slab, GFP_NOWAIT);
if (!recv->r_frag) if (!recv->r_frag)
goto out; goto out;
INIT_LIST_HEAD(&recv->r_frag->f_item); INIT_LIST_HEAD(&recv->r_frag->f_item);
sg_init_table(&recv->r_frag->f_sg, 1); sg_init_table(&recv->r_frag->f_sg, 1);
ret = rds_page_remainder_alloc(&recv->r_frag->f_sg, ret = rds_page_remainder_alloc(&recv->r_frag->f_sg,
RDS_FRAG_SIZE, GFP_NOWAIT); RDS_FRAG_SIZE, GFP_NOWAIT);
if (ret) { if (ret) {
kmem_cache_free(rds_ib_frag_slab, recv->r_frag); kmem_cache_free(rds_ib_frag_slab, recv->r_frag);
recv->r_frag = NULL; recv->r_frag = NULL;
goto out; goto out;
}
} }
ret = ib_dma_map_sg(ic->i_cm_id->device, &recv->r_frag->f_sg, ret = ib_dma_map_sg(ic->i_cm_id->device, &recv->r_frag->f_sg,
......
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