| From 11002c7012ed32cefe0edcbda3fc6bd77b04d218 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 28 May 2021 13:30:10 +0200 |
| Subject: RDMA/rtrs-clt: Check state of the rtrs_clt_sess before reading its |
| stats |
| |
| 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 7db550ba25d7..7d7dcc0a0458 100644 |
| --- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c |
| +++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c |
| @@ -811,6 +811,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 |
| |