* [PATCH v2 for-next 01/11] RDMA/rtrs: For HB error add additional clt/srv specific logging
2024-08-21 11:22 [PATCH v2 for-next 00/11] Misc patches for RTRS Md Haris Iqbal
@ 2024-08-21 11:22 ` Md Haris Iqbal
2024-08-21 11:22 ` [PATCH v2 for-next 02/11] RDMA/rtrs-clt: Fix need_inv setting in error case Md Haris Iqbal
` (11 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Md Haris Iqbal @ 2024-08-21 11:22 UTC (permalink / raw)
To: linux-rdma; +Cc: leon, jgg, haris.iqbal, jinpu.wang, Grzegorz Prajsner
In case of HB error, we need to know the specific path on which it
happened, for better debugging. Since the clt/srv path structures are not
available in rtrs.c, it needs to be done in the individual HB error
handler.
This commit add those loging. A sample kernel log output after this commit:
rtrs_core L357: <blya>: HB missed max reached.
rtrs_server L717: <blya>: HB err handler for path=ip:x.x.x.x@ip:x.x.x.x
.
.
rtrs_core L357: <blya>: HB missed max reached.
rtrs_client L1519: <blya>: HB err handler for path=ip:x.x.x.x@ip:x.x.x.x
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Reviewed-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
---
drivers/infiniband/ulp/rtrs/rtrs-clt.c | 2 ++
drivers/infiniband/ulp/rtrs/rtrs-srv.c | 4 ++++
2 files changed, 6 insertions(+)
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
index 88106cf5ce55..66ac4dba990f 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
@@ -1494,7 +1494,9 @@ static bool rtrs_clt_change_state_get_old(struct rtrs_clt_path *clt_path,
static void rtrs_clt_hb_err_handler(struct rtrs_con *c)
{
struct rtrs_clt_con *con = container_of(c, typeof(*con), c);
+ struct rtrs_clt_path *clt_path = to_clt_path(con->c.path);
+ rtrs_err(con->c.path, "HB err handler for path=%s\n", kobject_name(&clt_path->kobj));
rtrs_rdma_error_recovery(con);
}
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
index 1d33efb8fb03..f76d483c3784 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
@@ -672,6 +672,10 @@ static int map_cont_bufs(struct rtrs_srv_path *srv_path)
static void rtrs_srv_hb_err_handler(struct rtrs_con *c)
{
+ struct rtrs_srv_con *con = container_of(c, typeof(*con), c);
+ struct rtrs_srv_path *srv_path = to_srv_path(con->c.path);
+
+ rtrs_err(con->c.path, "HB err handler for path=%s\n", kobject_name(&srv_path->kobj));
close_path(to_srv_path(c->path));
}
--
2.25.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v2 for-next 02/11] RDMA/rtrs-clt: Fix need_inv setting in error case
2024-08-21 11:22 [PATCH v2 for-next 00/11] Misc patches for RTRS Md Haris Iqbal
2024-08-21 11:22 ` [PATCH v2 for-next 01/11] RDMA/rtrs: For HB error add additional clt/srv specific logging Md Haris Iqbal
@ 2024-08-21 11:22 ` Md Haris Iqbal
2024-08-21 11:22 ` [PATCH v2 for-next 03/11] RDMA/rtrs-clt: Rate limit errors in IO path Md Haris Iqbal
` (10 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Md Haris Iqbal @ 2024-08-21 11:22 UTC (permalink / raw)
To: linux-rdma; +Cc: leon, jgg, haris.iqbal, jinpu.wang, Grzegorz Prajsner
From: Jack Wang <jinpu.wang@ionos.com>
In some cases need_inv can be missed for write requests, additionally
driver has to handle missing invalidates for write requests. While at
it, remove the else case from write invalidate path as it is possible
to reach there.
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
---
drivers/infiniband/ulp/rtrs/rtrs-clt.c | 20 +++++++++-----------
1 file changed, 9 insertions(+), 11 deletions(-)
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
index 66ac4dba990f..d09018c11ece 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
@@ -391,11 +391,12 @@ static void complete_rdma_req(struct rtrs_clt_io_req *req, int errno,
clt_path = to_clt_path(con->c.path);
if (req->sg_cnt) {
- if (req->dir == DMA_FROM_DEVICE && req->need_inv) {
+ if (req->need_inv) {
/*
- * We are here to invalidate read requests
+ * We are here to invalidate read/write requests
* ourselves. In normal scenario server should
- * send INV for all read requests, but
+ * send INV for all read requests, we do chained local
+ * invalidate for write requests, but
* we are here, thus two things could happen:
*
* 1. this is failover, when errno != 0
@@ -422,14 +423,6 @@ static void complete_rdma_req(struct rtrs_clt_io_req *req, int errno,
req->mr->rkey, err);
} else if (can_wait) {
wait_for_completion(&req->inv_comp);
- } else {
- /*
- * Something went wrong, so request will be
- * completed from INV callback.
- */
- WARN_ON_ONCE(1);
-
- return;
}
if (!refcount_dec_and_test(&req->ref))
return;
@@ -1146,6 +1139,7 @@ static int rtrs_clt_write_req(struct rtrs_clt_io_req *req)
};
wr = &rwr.wr;
fr_en = true;
+ req->need_inv = true;
refcount_inc(&req->ref);
}
/*
@@ -1164,6 +1158,10 @@ static int rtrs_clt_write_req(struct rtrs_clt_io_req *req)
clt_path->hca_port);
if (req->mp_policy == MP_POLICY_MIN_INFLIGHT)
atomic_dec(&clt_path->stats->inflight);
+ if (req->need_inv) {
+ req->need_inv = false;
+ refcount_dec(&req->ref);
+ }
if (req->sg_cnt)
ib_dma_unmap_sg(clt_path->s.dev->ib_dev, req->sglist,
req->sg_cnt, req->dir);
--
2.25.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v2 for-next 03/11] RDMA/rtrs-clt: Rate limit errors in IO path
2024-08-21 11:22 [PATCH v2 for-next 00/11] Misc patches for RTRS Md Haris Iqbal
2024-08-21 11:22 ` [PATCH v2 for-next 01/11] RDMA/rtrs: For HB error add additional clt/srv specific logging Md Haris Iqbal
2024-08-21 11:22 ` [PATCH v2 for-next 02/11] RDMA/rtrs-clt: Fix need_inv setting in error case Md Haris Iqbal
@ 2024-08-21 11:22 ` Md Haris Iqbal
2024-08-21 11:22 ` [PATCH v2 for-next 04/11] RDMA/rtrs: Reset hb_missed_cnt after receiving other traffic from peer Md Haris Iqbal
` (9 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Md Haris Iqbal @ 2024-08-21 11:22 UTC (permalink / raw)
To: linux-rdma; +Cc: leon, jgg, haris.iqbal, jinpu.wang, Grzegorz Prajsner
From: Jack Wang <jinpu.wang@ionos.com>
On network errors, a large number of these logs are printed due to all the
inflight IOs, rate limit them so they do not clutter kernel log.
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
---
drivers/infiniband/ulp/rtrs/rtrs-clt.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
index d09018c11ece..b34eb4908185 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
@@ -331,7 +331,7 @@ static void rtrs_clt_fast_reg_done(struct ib_cq *cq, struct ib_wc *wc)
struct rtrs_clt_con *con = to_clt_con(wc->qp->qp_context);
if (wc->status != IB_WC_SUCCESS) {
- rtrs_err(con->c.path, "Failed IB_WR_REG_MR: %s\n",
+ rtrs_err_rl(con->c.path, "Failed IB_WR_REG_MR: %s\n",
ib_wc_status_msg(wc->status));
rtrs_rdma_error_recovery(con);
}
@@ -351,7 +351,7 @@ static void rtrs_clt_inv_rkey_done(struct ib_cq *cq, struct ib_wc *wc)
struct rtrs_clt_con *con = to_clt_con(wc->qp->qp_context);
if (wc->status != IB_WC_SUCCESS) {
- rtrs_err(con->c.path, "Failed IB_WR_LOCAL_INV: %s\n",
+ rtrs_err_rl(con->c.path, "Failed IB_WR_LOCAL_INV: %s\n",
ib_wc_status_msg(wc->status));
rtrs_rdma_error_recovery(con);
}
@@ -419,7 +419,7 @@ static void complete_rdma_req(struct rtrs_clt_io_req *req, int errno,
refcount_inc(&req->ref);
err = rtrs_inv_rkey(req);
if (err) {
- rtrs_err(con->c.path, "Send INV WR key=%#x: %d\n",
+ rtrs_err_rl(con->c.path, "Send INV WR key=%#x: %d\n",
req->mr->rkey, err);
} else if (can_wait) {
wait_for_completion(&req->inv_comp);
--
2.25.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v2 for-next 04/11] RDMA/rtrs: Reset hb_missed_cnt after receiving other traffic from peer
2024-08-21 11:22 [PATCH v2 for-next 00/11] Misc patches for RTRS Md Haris Iqbal
` (2 preceding siblings ...)
2024-08-21 11:22 ` [PATCH v2 for-next 03/11] RDMA/rtrs-clt: Rate limit errors in IO path Md Haris Iqbal
@ 2024-08-21 11:22 ` Md Haris Iqbal
2024-08-21 11:22 ` [PATCH v2 for-next 05/11] RDMA/rtrs-clt: Reuse need_inval from mr Md Haris Iqbal
` (8 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Md Haris Iqbal @ 2024-08-21 11:22 UTC (permalink / raw)
To: linux-rdma; +Cc: leon, jgg, haris.iqbal, jinpu.wang, Grzegorz Prajsner
From: Jack Wang <jinpu.wang@ionos.com>
Reset hb_missed_cnt after receiving traffic from other peer, so
hb is more robust again high load on host or network.
Fixes: 6a98d71daea1 ("RDMA/rtrs: client: main functionality")
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
---
drivers/infiniband/ulp/rtrs/rtrs-clt.c | 3 ++-
drivers/infiniband/ulp/rtrs/rtrs-srv.c | 1 +
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
index b34eb4908185..c1bca8972015 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
@@ -619,6 +619,7 @@ static void rtrs_clt_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
*/
if (WARN_ON(wc->wr_cqe->done != rtrs_clt_rdma_done))
return;
+ clt_path->s.hb_missed_cnt = 0;
rtrs_from_imm(be32_to_cpu(wc->ex.imm_data),
&imm_type, &imm_payload);
if (imm_type == RTRS_IO_RSP_IMM ||
@@ -636,7 +637,6 @@ static void rtrs_clt_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
return rtrs_clt_recv_done(con, wc);
} else if (imm_type == RTRS_HB_ACK_IMM) {
WARN_ON(con->c.cid);
- clt_path->s.hb_missed_cnt = 0;
clt_path->s.hb_cur_latency =
ktime_sub(ktime_get(), clt_path->s.hb_last_sent);
if (clt_path->flags & RTRS_MSG_NEW_RKEY_F)
@@ -663,6 +663,7 @@ static void rtrs_clt_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
/*
* Key invalidations from server side
*/
+ clt_path->s.hb_missed_cnt = 0;
WARN_ON(!(wc->wc_flags & IB_WC_WITH_INVALIDATE ||
wc->wc_flags & IB_WC_WITH_IMM));
WARN_ON(wc->wr_cqe->done != rtrs_clt_rdma_done);
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
index f76d483c3784..ffd3e80596d0 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
@@ -1233,6 +1233,7 @@ static void rtrs_srv_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
*/
if (WARN_ON(wc->wr_cqe != &io_comp_cqe))
return;
+ srv_path->s.hb_missed_cnt = 0;
err = rtrs_post_recv_empty(&con->c, &io_comp_cqe);
if (err) {
rtrs_err(s, "rtrs_post_recv(), err: %d\n", err);
--
2.25.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v2 for-next 05/11] RDMA/rtrs-clt: Reuse need_inval from mr
2024-08-21 11:22 [PATCH v2 for-next 00/11] Misc patches for RTRS Md Haris Iqbal
` (3 preceding siblings ...)
2024-08-21 11:22 ` [PATCH v2 for-next 04/11] RDMA/rtrs: Reset hb_missed_cnt after receiving other traffic from peer Md Haris Iqbal
@ 2024-08-21 11:22 ` Md Haris Iqbal
2024-08-21 11:22 ` [PATCH v2 for-next 06/11] RDMA/rtrs-clt: Reset cid to con_num - 1 to stay in bounds Md Haris Iqbal
` (7 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Md Haris Iqbal @ 2024-08-21 11:22 UTC (permalink / raw)
To: linux-rdma; +Cc: leon, jgg, haris.iqbal, jinpu.wang, Grzegorz Prajsner
From: Jack Wang <jinpu.wang@ionos.com>
mr has a member need_inval, which can be used to indicate if
local invalidate is needed, switch to it and remove need_inv
from rtrs_clt_io_req.
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
---
drivers/infiniband/ulp/rtrs/rtrs-clt.c | 18 +++++++++---------
drivers/infiniband/ulp/rtrs/rtrs-clt.h | 1 -
2 files changed, 9 insertions(+), 10 deletions(-)
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
index c1bca8972015..e1557b0cda05 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
@@ -355,7 +355,7 @@ static void rtrs_clt_inv_rkey_done(struct ib_cq *cq, struct ib_wc *wc)
ib_wc_status_msg(wc->status));
rtrs_rdma_error_recovery(con);
}
- req->need_inv = false;
+ req->mr->need_inval = false;
if (req->need_inv_comp)
complete(&req->inv_comp);
else
@@ -391,7 +391,7 @@ static void complete_rdma_req(struct rtrs_clt_io_req *req, int errno,
clt_path = to_clt_path(con->c.path);
if (req->sg_cnt) {
- if (req->need_inv) {
+ if (req->mr->need_inval) {
/*
* We are here to invalidate read/write requests
* ourselves. In normal scenario server should
@@ -494,7 +494,7 @@ static void process_io_rsp(struct rtrs_clt_path *clt_path, u32 msg_id,
req = &clt_path->reqs[msg_id];
/* Drop need_inv if server responded with send with invalidation */
- req->need_inv &= !w_inval;
+ req->mr->need_inval &= !w_inval;
complete_rdma_req(req, errno, true, false);
}
@@ -961,7 +961,7 @@ static void rtrs_clt_init_req(struct rtrs_clt_io_req *req,
req->dir = dir;
req->con = rtrs_permit_to_clt_con(clt_path, permit);
req->conf = conf;
- req->need_inv = false;
+ req->mr->need_inval = false;
req->need_inv_comp = false;
req->inv_errno = 0;
refcount_set(&req->ref, 1);
@@ -1140,8 +1140,8 @@ static int rtrs_clt_write_req(struct rtrs_clt_io_req *req)
};
wr = &rwr.wr;
fr_en = true;
- req->need_inv = true;
refcount_inc(&req->ref);
+ req->mr->need_inval = true;
}
/*
* Update stats now, after request is successfully sent it is not
@@ -1159,8 +1159,8 @@ static int rtrs_clt_write_req(struct rtrs_clt_io_req *req)
clt_path->hca_port);
if (req->mp_policy == MP_POLICY_MIN_INFLIGHT)
atomic_dec(&clt_path->stats->inflight);
- if (req->need_inv) {
- req->need_inv = false;
+ if (req->mr->need_inval) {
+ req->mr->need_inval = false;
refcount_dec(&req->ref);
}
if (req->sg_cnt)
@@ -1236,7 +1236,7 @@ static int rtrs_clt_read_req(struct rtrs_clt_io_req *req)
msg->desc[0].len = cpu_to_le32(req->mr->length);
/* Further invalidation is required */
- req->need_inv = !!RTRS_MSG_NEED_INVAL_F;
+ req->mr->need_inval = !!RTRS_MSG_NEED_INVAL_F;
} else {
msg->sg_cnt = 0;
@@ -1269,7 +1269,7 @@ static int rtrs_clt_read_req(struct rtrs_clt_io_req *req)
clt_path->hca_port);
if (req->mp_policy == MP_POLICY_MIN_INFLIGHT)
atomic_dec(&clt_path->stats->inflight);
- req->need_inv = false;
+ req->mr->need_inval = false;
if (req->sg_cnt)
ib_dma_unmap_sg(dev->ib_dev, req->sglist,
req->sg_cnt, req->dir);
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.h b/drivers/infiniband/ulp/rtrs/rtrs-clt.h
index f848c0392d98..45dac15825f4 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.h
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.h
@@ -115,7 +115,6 @@ struct rtrs_clt_io_req {
struct completion inv_comp;
int inv_errno;
bool need_inv_comp;
- bool need_inv;
refcount_t ref;
};
--
2.25.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v2 for-next 06/11] RDMA/rtrs-clt: Reset cid to con_num - 1 to stay in bounds
2024-08-21 11:22 [PATCH v2 for-next 00/11] Misc patches for RTRS Md Haris Iqbal
` (4 preceding siblings ...)
2024-08-21 11:22 ` [PATCH v2 for-next 05/11] RDMA/rtrs-clt: Reuse need_inval from mr Md Haris Iqbal
@ 2024-08-21 11:22 ` Md Haris Iqbal
2024-08-21 11:22 ` [PATCH v2 for-next 07/11] RDMA/rtrs-clt: Print request type for errors Md Haris Iqbal
` (6 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Md Haris Iqbal @ 2024-08-21 11:22 UTC (permalink / raw)
To: linux-rdma; +Cc: leon, jgg, haris.iqbal, jinpu.wang, Grzegorz Prajsner
In the function init_conns(), after the create_con() and create_cm() for
loop if something fails. In the cleanup for loop after the destroy tag, we
access out of bound memory because cid is set to clt_path->s.con_num.
This commits resets the cid to clt_path->s.con_num - 1, to stay in bounds
in the cleanup loop later.
Fixes: 6a98d71daea1 ("RDMA/rtrs: client: main functionality")
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
---
drivers/infiniband/ulp/rtrs/rtrs-clt.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
index e1557b0cda05..777f8e52ed7c 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
@@ -2347,6 +2347,12 @@ static int init_conns(struct rtrs_clt_path *clt_path)
if (err)
goto destroy;
}
+
+ /*
+ * Set the cid to con_num - 1, since if we fail later, we want to stay in bounds.
+ */
+ cid = clt_path->s.con_num - 1;
+
err = alloc_path_reqs(clt_path);
if (err)
goto destroy;
--
2.25.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v2 for-next 07/11] RDMA/rtrs-clt: Print request type for errors
2024-08-21 11:22 [PATCH v2 for-next 00/11] Misc patches for RTRS Md Haris Iqbal
` (5 preceding siblings ...)
2024-08-21 11:22 ` [PATCH v2 for-next 06/11] RDMA/rtrs-clt: Reset cid to con_num - 1 to stay in bounds Md Haris Iqbal
@ 2024-08-21 11:22 ` Md Haris Iqbal
2024-08-21 11:22 ` [PATCH v2 for-next 08/11] RDMA/rtrs-srv: Avoid null pointer deref during path establishment Md Haris Iqbal
` (5 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Md Haris Iqbal @ 2024-08-21 11:22 UTC (permalink / raw)
To: linux-rdma; +Cc: leon, jgg, haris.iqbal, jinpu.wang, Grzegorz Prajsner
From: Jack Wang <jinpu.wang@ionos.com>
Extend the output to print also the request type.
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
---
drivers/infiniband/ulp/rtrs/rtrs-clt.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
index 777f8e52ed7c..7c6d40380638 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
@@ -439,8 +439,10 @@ static void complete_rdma_req(struct rtrs_clt_io_req *req, int errno,
req->con = NULL;
if (errno) {
- rtrs_err_rl(con->c.path, "IO request failed: error=%d path=%s [%s:%u] notify=%d\n",
- errno, kobject_name(&clt_path->kobj), clt_path->hca_name,
+ rtrs_err_rl(con->c.path,
+ "IO %s request failed: error=%d path=%s [%s:%u] notify=%d\n",
+ req->dir == DMA_TO_DEVICE ? "write" : "read", errno,
+ kobject_name(&clt_path->kobj), clt_path->hca_name,
clt_path->hca_port, notify);
}
--
2.25.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v2 for-next 08/11] RDMA/rtrs-srv: Avoid null pointer deref during path establishment
2024-08-21 11:22 [PATCH v2 for-next 00/11] Misc patches for RTRS Md Haris Iqbal
` (6 preceding siblings ...)
2024-08-21 11:22 ` [PATCH v2 for-next 07/11] RDMA/rtrs-clt: Print request type for errors Md Haris Iqbal
@ 2024-08-21 11:22 ` Md Haris Iqbal
2024-08-21 11:22 ` [PATCH v2 for-next 09/11] RDMA/rtrs: register ib event handler Md Haris Iqbal
` (4 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Md Haris Iqbal @ 2024-08-21 11:22 UTC (permalink / raw)
To: linux-rdma; +Cc: leon, jgg, haris.iqbal, jinpu.wang, Grzegorz Prajsner
For RTRS path establishment, RTRS client initiates and completes con_num
of connections. After establishing all its connections, the information
is exchanged between the client and server through the info_req message.
During this exchange, it is essential that all connections have been
established, and the state of the RTRS srv path is CONNECTED.
So add these sanity checks, to make sure we detect and abort process in
error scenarios to avoid null pointer deref.
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
---
drivers/infiniband/ulp/rtrs/rtrs-srv.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
index ffd3e80596d0..05d15ff074bb 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
@@ -935,12 +935,11 @@ static void rtrs_srv_info_req_done(struct ib_cq *cq, struct ib_wc *wc)
if (err)
goto close;
-out:
rtrs_iu_free(iu, srv_path->s.dev->ib_dev, 1);
return;
close:
+ rtrs_iu_free(iu, srv_path->s.dev->ib_dev, 1);
close_path(srv_path);
- goto out;
}
static int post_recv_info_req(struct rtrs_srv_con *con)
@@ -991,6 +990,16 @@ static int post_recv_path(struct rtrs_srv_path *srv_path)
q_size = SERVICE_CON_QUEUE_DEPTH;
else
q_size = srv->queue_depth;
+ if (srv_path->state != RTRS_SRV_CONNECTING) {
+ rtrs_err(s, "Path state invalid. state %s\n",
+ rtrs_srv_state_str(srv_path->state));
+ return -EIO;
+ }
+
+ if (!srv_path->s.con[cid]) {
+ rtrs_err(s, "Conn not set for %d\n", cid);
+ return -EIO;
+ }
err = post_recv_io(to_srv_con(srv_path->s.con[cid]), q_size);
if (err) {
--
2.25.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v2 for-next 09/11] RDMA/rtrs: register ib event handler
2024-08-21 11:22 [PATCH v2 for-next 00/11] Misc patches for RTRS Md Haris Iqbal
` (7 preceding siblings ...)
2024-08-21 11:22 ` [PATCH v2 for-next 08/11] RDMA/rtrs-srv: Avoid null pointer deref during path establishment Md Haris Iqbal
@ 2024-08-21 11:22 ` Md Haris Iqbal
2024-08-21 11:22 ` [PATCH v2 for-next 10/11] RDMA/rtrs-clt: Do local invalidate after write io completion Md Haris Iqbal
` (3 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Md Haris Iqbal @ 2024-08-21 11:22 UTC (permalink / raw)
To: linux-rdma; +Cc: leon, jgg, haris.iqbal, jinpu.wang, Grzegorz Prajsner
From: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
Use ib_register_event_handler() to register event handlers for both
client and server side. For now, all those handlers do, is to print
type of incoming event.
Signed-off-by: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
---
drivers/infiniband/ulp/rtrs/rtrs-clt.c | 21 +++++++++++++++-
drivers/infiniband/ulp/rtrs/rtrs-clt.h | 2 ++
drivers/infiniband/ulp/rtrs/rtrs-pri.h | 2 ++
drivers/infiniband/ulp/rtrs/rtrs-srv.c | 33 +++++++++++++++++++++++++-
drivers/infiniband/ulp/rtrs/rtrs-srv.h | 2 ++
5 files changed, 58 insertions(+), 2 deletions(-)
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
index 7c6d40380638..230e5f6c8c90 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
@@ -3149,8 +3149,20 @@ int rtrs_clt_create_path_from_sysfs(struct rtrs_clt_sess *clt,
return err;
}
+void rtrs_clt_ib_event_handler(struct ib_event_handler *handler,
+ struct ib_event *ibevent)
+{
+ pr_info("Handling event: %s (%d).\n", ib_event_msg(ibevent->event),
+ ibevent->event);
+}
+
+
static int rtrs_clt_ib_dev_init(struct rtrs_ib_dev *dev)
{
+ INIT_IB_EVENT_HANDLER(&dev->event_handler, dev->ib_dev,
+ rtrs_clt_ib_event_handler);
+ ib_register_event_handler(&dev->event_handler);
+
if (!(dev->ib_dev->attrs.device_cap_flags &
IB_DEVICE_MEM_MGT_EXTENSIONS)) {
pr_err("Memory registrations not supported.\n");
@@ -3160,8 +3172,15 @@ static int rtrs_clt_ib_dev_init(struct rtrs_ib_dev *dev)
return 0;
}
+static void rtrs_clt_ib_dev_deinit(struct rtrs_ib_dev *dev)
+{
+ ib_unregister_event_handler(&dev->event_handler);
+}
+
+
static const struct rtrs_rdma_dev_pd_ops dev_pd_ops = {
- .init = rtrs_clt_ib_dev_init
+ .init = rtrs_clt_ib_dev_init,
+ .deinit = rtrs_clt_ib_dev_deinit
};
static int __init rtrs_client_init(void)
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.h b/drivers/infiniband/ulp/rtrs/rtrs-clt.h
index 45dac15825f4..0f57759b3080 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.h
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.h
@@ -212,6 +212,8 @@ int rtrs_clt_remove_path_from_sysfs(struct rtrs_clt_path *path,
void rtrs_clt_set_max_reconnect_attempts(struct rtrs_clt_sess *clt, int value);
int rtrs_clt_get_max_reconnect_attempts(const struct rtrs_clt_sess *clt);
void free_path(struct rtrs_clt_path *clt_path);
+void rtrs_clt_ib_event_handler(struct ib_event_handler *handler,
+ struct ib_event *ibevent);
/* rtrs-clt-stats.c */
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-pri.h b/drivers/infiniband/ulp/rtrs/rtrs-pri.h
index ab25619261d2..ef29bd483b5a 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-pri.h
+++ b/drivers/infiniband/ulp/rtrs/rtrs-pri.h
@@ -69,6 +69,7 @@ struct rtrs_ib_dev;
struct rtrs_rdma_dev_pd_ops {
int (*init)(struct rtrs_ib_dev *dev);
+ void (*deinit)(struct rtrs_ib_dev *dev);
};
struct rtrs_rdma_dev_pd {
@@ -84,6 +85,7 @@ struct rtrs_ib_dev {
struct kref ref;
struct list_head entry;
struct rtrs_rdma_dev_pd *pool;
+ struct ib_event_handler event_handler;
};
struct rtrs_con {
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
index 05d15ff074bb..e83d95647852 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
@@ -26,7 +26,10 @@ MODULE_LICENSE("GPL");
#define DEFAULT_SESS_QUEUE_DEPTH 512
#define MAX_HDR_SIZE PAGE_SIZE
-static struct rtrs_rdma_dev_pd dev_pd;
+static const struct rtrs_rdma_dev_pd_ops dev_pd_ops;
+static struct rtrs_rdma_dev_pd dev_pd = {
+ .ops = &dev_pd_ops
+};
const struct class rtrs_dev_class = {
.name = "rtrs-server",
};
@@ -2269,6 +2272,34 @@ static int check_module_params(void)
return 0;
}
+void rtrs_srv_ib_event_handler(struct ib_event_handler *handler,
+ struct ib_event *ibevent)
+{
+ pr_info("Handling event: %s (%d).\n", ib_event_msg(ibevent->event),
+ ibevent->event);
+}
+
+static int rtrs_srv_ib_dev_init(struct rtrs_ib_dev *dev)
+{
+ INIT_IB_EVENT_HANDLER(&dev->event_handler, dev->ib_dev,
+ rtrs_srv_ib_event_handler);
+ ib_register_event_handler(&dev->event_handler);
+
+ return 0;
+}
+
+static void rtrs_srv_ib_dev_deinit(struct rtrs_ib_dev *dev)
+{
+ ib_unregister_event_handler(&dev->event_handler);
+}
+
+
+static const struct rtrs_rdma_dev_pd_ops dev_pd_ops = {
+ .init = rtrs_srv_ib_dev_init,
+ .deinit = rtrs_srv_ib_dev_deinit
+};
+
+
static int __init rtrs_server_init(void)
{
int err;
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.h b/drivers/infiniband/ulp/rtrs/rtrs-srv.h
index 5e325b82ff33..014f85681f37 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.h
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.h
@@ -132,6 +132,8 @@ struct rtrs_srv_ib_ctx {
extern const struct class rtrs_dev_class;
void close_path(struct rtrs_srv_path *srv_path);
+void rtrs_srv_ib_event_handler(struct ib_event_handler *handler,
+ struct ib_event *ibevent);
static inline void rtrs_srv_update_rdma_stats(struct rtrs_srv_stats *s,
size_t size, int d)
--
2.25.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v2 for-next 10/11] RDMA/rtrs-clt: Do local invalidate after write io completion
2024-08-21 11:22 [PATCH v2 for-next 00/11] Misc patches for RTRS Md Haris Iqbal
` (8 preceding siblings ...)
2024-08-21 11:22 ` [PATCH v2 for-next 09/11] RDMA/rtrs: register ib event handler Md Haris Iqbal
@ 2024-08-21 11:22 ` Md Haris Iqbal
2024-08-21 11:22 ` [PATCH v2 for-next 11/11] RDMA/rtrs-clt: Remove an extra space Md Haris Iqbal
` (2 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Md Haris Iqbal @ 2024-08-21 11:22 UTC (permalink / raw)
To: linux-rdma; +Cc: leon, jgg, haris.iqbal, jinpu.wang, Grzegorz Prajsner
From: Jack Wang <jinpu.wang@ionos.com>
Switch local invalidate after write io completion avoid the
chain usage of WR, this fixed the local protection error on
LOCAL INVALIDATE WR.
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
---
drivers/infiniband/ulp/rtrs/rtrs-clt.c | 20 +++++++-------------
1 file changed, 7 insertions(+), 13 deletions(-)
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
index 230e5f6c8c90..fb548d6a0aae 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
@@ -395,9 +395,9 @@ static void complete_rdma_req(struct rtrs_clt_io_req *req, int errno,
/*
* We are here to invalidate read/write requests
* ourselves. In normal scenario server should
- * send INV for all read requests, we do chained local
- * invalidate for write requests, but
- * we are here, thus two things could happen:
+ * send INV for all read requests, we do local
+ * invalidate for write requests ourselves, but
+ * we are here, thus three things could happen:
*
* 1. this is failover, when errno != 0
* and can_wait == 1,
@@ -405,6 +405,9 @@ static void complete_rdma_req(struct rtrs_clt_io_req *req, int errno,
* 2. something totally bad happened and
* server forgot to send INV, so we
* should do that ourselves.
+ *
+ * 3. write request finishes, we need to do local
+ * invalidate
*/
if (can_wait) {
@@ -1085,7 +1088,6 @@ static int rtrs_clt_write_req(struct rtrs_clt_io_req *req)
int ret, count = 0;
u32 imm, buf_id;
struct ib_reg_wr rwr;
- struct ib_send_wr inv_wr;
struct ib_send_wr *wr = NULL;
bool fr_en = false;
@@ -1126,13 +1128,6 @@ static int rtrs_clt_write_req(struct rtrs_clt_io_req *req)
req->sg_cnt, req->dir);
return ret;
}
- inv_wr = (struct ib_send_wr) {
- .opcode = IB_WR_LOCAL_INV,
- .wr_cqe = &req->inv_cqe,
- .send_flags = IB_SEND_SIGNALED,
- .ex.invalidate_rkey = req->mr->rkey,
- };
- req->inv_cqe.done = rtrs_clt_inv_rkey_done;
rwr = (struct ib_reg_wr) {
.wr.opcode = IB_WR_REG_MR,
.wr.wr_cqe = &fast_reg_cqe,
@@ -1142,7 +1137,6 @@ static int rtrs_clt_write_req(struct rtrs_clt_io_req *req)
};
wr = &rwr.wr;
fr_en = true;
- refcount_inc(&req->ref);
req->mr->need_inval = true;
}
/*
@@ -1153,7 +1147,7 @@ static int rtrs_clt_write_req(struct rtrs_clt_io_req *req)
ret = rtrs_post_rdma_write_sg(req->con, req, rbuf, fr_en, count,
req->usr_len + sizeof(*msg),
- imm, wr, &inv_wr);
+ imm, wr, NULL);
if (ret) {
rtrs_err_rl(s,
"Write request failed: error=%d path=%s [%s:%u]\n",
--
2.25.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v2 for-next 11/11] RDMA/rtrs-clt: Remove an extra space
2024-08-21 11:22 [PATCH v2 for-next 00/11] Misc patches for RTRS Md Haris Iqbal
` (9 preceding siblings ...)
2024-08-21 11:22 ` [PATCH v2 for-next 10/11] RDMA/rtrs-clt: Do local invalidate after write io completion Md Haris Iqbal
@ 2024-08-21 11:22 ` Md Haris Iqbal
2024-08-28 11:00 ` [PATCH v2 for-next 00/11] Misc patches for RTRS Haris Iqbal
2024-08-28 11:05 ` Leon Romanovsky
12 siblings, 0 replies; 14+ messages in thread
From: Md Haris Iqbal @ 2024-08-21 11:22 UTC (permalink / raw)
To: linux-rdma
Cc: leon, jgg, haris.iqbal, jinpu.wang, Alexei Pastuchov,
Grzegorz Prajsner
From: Jack Wang <jinpu.wang@ionos.com>
No functional changes.
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Alexei Pastuchov <alexei.pastuchov@ionos.com>
Signed-off-by: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
---
drivers/infiniband/ulp/rtrs/rtrs-clt.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
index fb548d6a0aae..71387811b281 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
@@ -1208,7 +1208,7 @@ static int rtrs_clt_read_req(struct rtrs_clt_io_req *req)
ret = rtrs_map_sg_fr(req, count);
if (ret < 0) {
rtrs_err_rl(s,
- "Read request failed, failed to map fast reg. data, err: %d\n",
+ "Read request failed, failed to map fast reg. data, err: %d\n",
ret);
ib_dma_unmap_sg(dev->ib_dev, req->sglist, req->sg_cnt,
req->dir);
--
2.25.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* Re: [PATCH v2 for-next 00/11] Misc patches for RTRS
2024-08-21 11:22 [PATCH v2 for-next 00/11] Misc patches for RTRS Md Haris Iqbal
` (10 preceding siblings ...)
2024-08-21 11:22 ` [PATCH v2 for-next 11/11] RDMA/rtrs-clt: Remove an extra space Md Haris Iqbal
@ 2024-08-28 11:00 ` Haris Iqbal
2024-08-28 11:05 ` Leon Romanovsky
12 siblings, 0 replies; 14+ messages in thread
From: Haris Iqbal @ 2024-08-28 11:00 UTC (permalink / raw)
To: linux-rdma; +Cc: leon, jgg, jinpu.wang
On Wed, Aug 21, 2024 at 1:23 PM Md Haris Iqbal <haris.iqbal@ionos.com> wrote:
>
> Hi Jason, hi Leon,
>
> Please consider to include following changes to the next merge window.
Gentle ping.
>
> Changes in v2:
> Dropped 2 patches as discussed.
>
> Grzegorz Prajsner (1):
> RDMA/rtrs: register ib event handler
>
> Jack Wang (7):
> RDMA/rtrs-clt: Fix need_inv setting in error case
> RDMA/rtrs-clt: Rate limit errors in IO path
> RDMA/rtrs: Reset hb_missed_cnt after receiving other traffic from peer
> RDMA/rtrs-clt: Reuse need_inval from mr
> RDMA/rtrs-clt: Print request type for errors
> RDMA/rtrs-clt: Do local invalidate after write io completion
> RDMA/rtrs-clt: Remove an extra space
>
> Md Haris Iqbal (3):
> RDMA/rtrs: For HB error add additional clt/srv specific logging
> RDMA/rtrs-clt: Reset cid to con_num - 1 to stay in bounds
> RDMA/rtrs-srv: Avoid null pointer deref during path establishment
>
> drivers/infiniband/ulp/rtrs/rtrs-clt.c | 92 ++++++++++++++++----------
> drivers/infiniband/ulp/rtrs/rtrs-clt.h | 3 +-
> drivers/infiniband/ulp/rtrs/rtrs-pri.h | 2 +
> drivers/infiniband/ulp/rtrs/rtrs-srv.c | 51 +++++++++++++-
> drivers/infiniband/ulp/rtrs/rtrs-srv.h | 2 +
> 5 files changed, 111 insertions(+), 39 deletions(-)
>
> --
> 2.25.1
>
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v2 for-next 00/11] Misc patches for RTRS
2024-08-21 11:22 [PATCH v2 for-next 00/11] Misc patches for RTRS Md Haris Iqbal
` (11 preceding siblings ...)
2024-08-28 11:00 ` [PATCH v2 for-next 00/11] Misc patches for RTRS Haris Iqbal
@ 2024-08-28 11:05 ` Leon Romanovsky
12 siblings, 0 replies; 14+ messages in thread
From: Leon Romanovsky @ 2024-08-28 11:05 UTC (permalink / raw)
To: linux-rdma, Md Haris Iqbal; +Cc: jgg, jinpu.wang
On Wed, 21 Aug 2024 13:22:06 +0200, Md Haris Iqbal wrote:
> Please consider to include following changes to the next merge window.
>
> Changes in v2:
> Dropped 2 patches as discussed.
>
> Grzegorz Prajsner (1):
> RDMA/rtrs: register ib event handler
>
> [...]
Applied, thanks!
[01/11] RDMA/rtrs: For HB error add additional clt/srv specific logging
https://git.kernel.org/rdma/rdma/c/e8e09e95e053b8
[02/11] RDMA/rtrs-clt: Fix need_inv setting in error case
https://git.kernel.org/rdma/rdma/c/69fd17b33e5f3e
[03/11] RDMA/rtrs-clt: Rate limit errors in IO path
https://git.kernel.org/rdma/rdma/c/ba03df2c07b8ab
[04/11] RDMA/rtrs: Reset hb_missed_cnt after receiving other traffic from peer
https://git.kernel.org/rdma/rdma/c/333188fb8459be
[05/11] RDMA/rtrs-clt: Reuse need_inval from mr
https://git.kernel.org/rdma/rdma/c/a4ae49a5cceed8
[06/11] RDMA/rtrs-clt: Reset cid to con_num - 1 to stay in bounds
https://git.kernel.org/rdma/rdma/c/a4f1332777729d
[07/11] RDMA/rtrs-clt: Print request type for errors
https://git.kernel.org/rdma/rdma/c/d48eeb83707b5c
[08/11] RDMA/rtrs-srv: Avoid null pointer deref during path establishment
https://git.kernel.org/rdma/rdma/c/3a92d941fee13c
[09/11] RDMA/rtrs: register ib event handler
https://git.kernel.org/rdma/rdma/c/67d225711c30a1
[10/11] RDMA/rtrs-clt: Do local invalidate after write io completion
https://git.kernel.org/rdma/rdma/c/97e9e0815fc8da
[11/11] RDMA/rtrs-clt: Remove an extra space
https://git.kernel.org/rdma/rdma/c/20ded2d6dbaaa5
Best regards,
--
Leon Romanovsky <leon@kernel.org>
^ permalink raw reply [flat|nested] 14+ messages in thread