lkml.org 
[lkml]   [2018]   [Mar]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.14 39/67] iser-target: avoid reinitializing rdma contexts for isert commands
    Date
    From: Bharat Potnuri <bharat@chelsio.com>

    [ Upstream commit 66f53e6f5400578bae58db0c06d85a8820831f40 ]

    isert commands that failed during isert_rdma_rw_ctx_post() are queued to
    Queue-Full(QF) queue and are scheduled to be reposted during queue-full
    queue processing. During this reposting, the rdma contexts are initialised
    again in isert_rdma_rw_ctx_post(), which is leaking significant memory.

    unreferenced object 0xffff8830201d9640 (size 64):
    comm "kworker/0:2", pid 195, jiffies 4295374851 (age 4528.436s)
    hex dump (first 32 bytes):
    00 60 8b cb 2e 00 00 00 00 10 00 00 00 00 00 00 .`..............
    00 90 e3 cb 2e 00 00 00 00 10 00 00 00 00 00 00 ................
    backtrace:
    [<ffffffff8170711e>] kmemleak_alloc+0x4e/0xb0
    [<ffffffff811f8ba5>] __kmalloc+0x125/0x2b0
    [<ffffffffa046b24f>] rdma_rw_ctx_init+0x15f/0x6f0 [ib_core]
    [<ffffffffa07ab644>] isert_rdma_rw_ctx_post+0xc4/0x3c0 [ib_isert]
    [<ffffffffa07ad972>] isert_put_datain+0x112/0x1c0 [ib_isert]
    [<ffffffffa07dddce>] lio_queue_data_in+0x2e/0x30 [iscsi_target_mod]
    [<ffffffffa076c322>] target_qf_do_work+0x2b2/0x4b0 [target_core_mod]
    [<ffffffff81080c3b>] process_one_work+0x1db/0x5d0
    [<ffffffff8108107d>] worker_thread+0x4d/0x3e0
    [<ffffffff81088667>] kthread+0x117/0x150
    [<ffffffff81713fa7>] ret_from_fork+0x27/0x40
    [<ffffffffffffffff>] 0xffffffffffffffff

    Here is patch to use the older rdma contexts while reposting
    the isert commands intead of reinitialising them.

    Signed-off-by: Potnuri Bharat Teja <bharat@chelsio.com>
    Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
    Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    drivers/infiniband/ulp/isert/ib_isert.c | 7 +++++++
    drivers/infiniband/ulp/isert/ib_isert.h | 1 +
    2 files changed, 8 insertions(+)

    diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c
    index 9d4785ba24cb..e770c17cbca9 100644
    --- a/drivers/infiniband/ulp/isert/ib_isert.c
    +++ b/drivers/infiniband/ulp/isert/ib_isert.c
    @@ -2124,6 +2124,9 @@ isert_rdma_rw_ctx_post(struct isert_cmd *cmd, struct isert_conn *conn,
    u32 rkey, offset;
    int ret;

    + if (cmd->ctx_init_done)
    + goto rdma_ctx_post;
    +
    if (dir == DMA_FROM_DEVICE) {
    addr = cmd->write_va;
    rkey = cmd->write_stag;
    @@ -2151,11 +2154,15 @@ isert_rdma_rw_ctx_post(struct isert_cmd *cmd, struct isert_conn *conn,
    se_cmd->t_data_sg, se_cmd->t_data_nents,
    offset, addr, rkey, dir);
    }
    +
    if (ret < 0) {
    isert_err("Cmd: %p failed to prepare RDMA res\n", cmd);
    return ret;
    }

    + cmd->ctx_init_done = true;
    +
    +rdma_ctx_post:
    ret = rdma_rw_ctx_post(&cmd->rw, conn->qp, port_num, cqe, chain_wr);
    if (ret < 0)
    isert_err("Cmd: %p failed to post RDMA res\n", cmd);
    diff --git a/drivers/infiniband/ulp/isert/ib_isert.h b/drivers/infiniband/ulp/isert/ib_isert.h
    index d6fd248320ae..3b296bac4f60 100644
    --- a/drivers/infiniband/ulp/isert/ib_isert.h
    +++ b/drivers/infiniband/ulp/isert/ib_isert.h
    @@ -126,6 +126,7 @@ struct isert_cmd {
    struct rdma_rw_ctx rw;
    struct work_struct comp_work;
    struct scatterlist sg;
    + bool ctx_init_done;
    };

    static inline struct isert_cmd *tx_desc_to_cmd(struct iser_tx_desc *desc)
    --
    2.14.1
    \
     
     \ /
      Last update: 2018-03-08 07:43    [W:3.720 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site