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: Andy Grover <andy.grover@oracle.com>
This commit is contained in:
parent
0b088e003c
commit
3427e854e1
|
@ -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,
|
||||||
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,
|
||||||
|
|
Loading…
Reference in New Issue