RDMA/rtrs-clt: Fix counting inflight IO
There are mis-match at counting inflight IO after changing the multipath policy. For example, we started fio test with round-robin policy and then we changed the policy to min-inflight. IOs created under the RR policy is finished under the min-inflight policy and inflight counter only decreased. So the counter would be negative value. And also we started fio test with min-inflight policy and changed the policy to the round-robin. IOs created under the min-inflight policy increased the inflight IO counter but the inflight IO counter was not decreased because the policy was the round-robin when IO was finished. So it should count IOs only if the IO is created under the min-inflight policy. It should not care the policy when the IO is finished. This patch adds a field mp_policy in struct rtrs_clt_io_req and stores the multipath policy when an object of rtrs_clt_io_req is created. Then rtrs-clt checks the mp_policy of only struct rtrs_clt_io_req instead of the struct rtrs_clt. Link: https://lore.kernel.org/r/20210806112112.124313-6-haris.iqbal@ionos.com Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com> Signed-off-by: Jack Wang <jinpu.wang@ionos.com> Reviewed-by: Leon Romanovsky <leonro@nvidia.com> Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
4693d6b767
commit
0d8f2cfa23
@ -180,7 +180,7 @@ void rtrs_clt_update_all_stats(struct rtrs_clt_io_req *req, int dir)
|
||||
|
||||
len = req->usr_len + req->data_len;
|
||||
rtrs_clt_update_rdma_stats(stats, len, dir);
|
||||
if (sess->clt->mp_policy == MP_POLICY_MIN_INFLIGHT)
|
||||
if (req->mp_policy == MP_POLICY_MIN_INFLIGHT)
|
||||
atomic_inc(&stats->inflight);
|
||||
}
|
||||
|
||||
|
@ -438,7 +438,7 @@ static void complete_rdma_req(struct rtrs_clt_io_req *req, int errno,
|
||||
}
|
||||
if (!refcount_dec_and_test(&req->ref))
|
||||
return;
|
||||
if (sess->clt->mp_policy == MP_POLICY_MIN_INFLIGHT)
|
||||
if (req->mp_policy == MP_POLICY_MIN_INFLIGHT)
|
||||
atomic_dec(&sess->stats->inflight);
|
||||
|
||||
req->in_use = false;
|
||||
@ -964,6 +964,7 @@ static void rtrs_clt_init_req(struct rtrs_clt_io_req *req,
|
||||
req->need_inv_comp = false;
|
||||
req->inv_errno = 0;
|
||||
refcount_set(&req->ref, 1);
|
||||
req->mp_policy = sess->clt->mp_policy;
|
||||
|
||||
iov_iter_kvec(&iter, READ, vec, 1, usr_len);
|
||||
len = _copy_from_iter(req->iu->buf, usr_len, &iter);
|
||||
@ -1154,7 +1155,7 @@ static int rtrs_clt_write_req(struct rtrs_clt_io_req *req)
|
||||
"Write request failed: error=%d path=%s [%s:%u]\n",
|
||||
ret, kobject_name(&sess->kobj), sess->hca_name,
|
||||
sess->hca_port);
|
||||
if (sess->clt->mp_policy == MP_POLICY_MIN_INFLIGHT)
|
||||
if (req->mp_policy == MP_POLICY_MIN_INFLIGHT)
|
||||
atomic_dec(&sess->stats->inflight);
|
||||
if (req->sg_cnt)
|
||||
ib_dma_unmap_sg(sess->s.dev->ib_dev, req->sglist,
|
||||
@ -1260,7 +1261,7 @@ static int rtrs_clt_read_req(struct rtrs_clt_io_req *req)
|
||||
"Read request failed: error=%d path=%s [%s:%u]\n",
|
||||
ret, kobject_name(&sess->kobj), sess->hca_name,
|
||||
sess->hca_port);
|
||||
if (sess->clt->mp_policy == MP_POLICY_MIN_INFLIGHT)
|
||||
if (req->mp_policy == MP_POLICY_MIN_INFLIGHT)
|
||||
atomic_dec(&sess->stats->inflight);
|
||||
req->need_inv = false;
|
||||
if (req->sg_cnt)
|
||||
|
@ -101,6 +101,7 @@ struct rtrs_clt_io_req {
|
||||
unsigned int usr_len;
|
||||
void *priv;
|
||||
bool in_use;
|
||||
enum rtrs_mp_policy mp_policy;
|
||||
struct rtrs_clt_con *con;
|
||||
struct rtrs_sg_desc *desc;
|
||||
struct ib_sge *sge;
|
||||
|
Loading…
Reference in New Issue
Block a user