lkml.org 
[lkml]   [2021]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.13 429/800] RDMA/rtrs-clt: Check state of the rtrs_clt_sess before reading its stats
    Date
    From: Md Haris Iqbal <haris.iqbal@cloud.ionos.com>

    [ Upstream commit 41db63a7efe1c8c2dd282c1849a6ebfbbedbaf67 ]

    When get_next_path_min_inflight is called to select the next path, it
    iterates over the list of available rtrs_clt_sess (paths). It then reads
    the number of inflight IOs for that path to select one which has the least
    inflight IO.

    But it may so happen that rtrs_clt_sess (path) is no longer in the
    connected state because closing or error recovery paths can change the status
    of the rtrs_clt_Sess.

    For example, the client sent the heart-beat and did not get the
    response, it would change the session status and stop IO processing.
    The added checking of this patch can prevent accessing the broken path
    and generating duplicated error messages.

    It is ok if the status is changed after checking the status because
    the error recovery path does not free memory and only tries to
    reconnection. And also it is ok if the session is closed after checking
    the status because closing the session changes the session status and
    flush all IO beforing free memory. If the session is being accessed for
    IO processing, the closing session will wait.

    Fixes: 6a98d71daea18 ("RDMA/rtrs: client: main functionality")
    Link: https://lore.kernel.org/r/20210528113018.52290-13-jinpu.wang@ionos.com
    Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
    Reviewed-by: Gioh Kim <gi-oh.kim@ionos.com>
    Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/infiniband/ulp/rtrs/rtrs-clt.c | 3 +++
    1 file changed, 3 insertions(+)

    diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
    index 0a794d748a7a..a563c9b9d52c 100644
    --- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
    +++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
    @@ -814,6 +814,9 @@ static struct rtrs_clt_sess *get_next_path_min_inflight(struct path_it *it)
    int inflight;

    list_for_each_entry_rcu(sess, &clt->paths_list, s.entry) {
    + if (unlikely(READ_ONCE(sess->state) != RTRS_CLT_CONNECTED))
    + continue;
    +
    if (unlikely(!list_empty(raw_cpu_ptr(sess->mp_skip_entry))))
    continue;

    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-12 11:10    [W:3.374 / U:0.592 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site