All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH for-next 00/10] Misc update for RTRS
@ 2021-07-30 13:18 Jack Wang
  2021-07-30 13:18 ` [PATCH for-next 01/10] RDMA/rtrs-clt: During add_path change for_new_clt according to path_num Jack Wang
                   ` (9 more replies)
  0 siblings, 10 replies; 33+ messages in thread
From: Jack Wang @ 2021-07-30 13:18 UTC (permalink / raw)
  To: linux-rdma; +Cc: bvanassche, leon, dledford, jgg, haris.iqbal, jinpu.wang

Hi Jason, hi Doug,

Please consider to include following changes to the next merge window.

The patchset is orgnized as:
- patch1 bugfix for corner case.
- patch2 reject client with special sessname.
- patch3 sysfs_emit conversion.
- patch4 remove unused functions.
- patch5 Fix warning with poll mode.
- patch6 remove len parameter.
- patch7 remove likely/unlikely.
- patch8 Fix inflight io accounting when switch mp_policy.
- patch9 add interface to disable IB port on server side.
- patch10 remove void cast.

The patches are created base on rdma/for-next at commit:
07d0f314ba75 ("Merge branch 'mlx5_dcs' into rdma.git for-next")

Thanks!

Gioh Kim (4):
  RDMA/rtrs-srv: Prevent sysfs error with path name "ctl"
  RDMA/rtrs: Remove all likely and unlikely
  RDMA/rtrs-clt: Fix counting inflight IO
  RDMA/rtrs: remove (void) casting for functions

Jack Wang (2):
  RDMA/rtrs: Remove unused functions
  RDMA/rtrs: Fix warning when use poll mode

Md Haris Iqbal (4):
  RDMA/rtrs-clt: During add_path change for_new_clt according to
    path_num
  RDMA/rtrs: Use sysfs_emit instead of s*printf function for sysfs show
  RDMA/rtrs: Remove len parameter from helper print functions of sysfs
  RDMA/rtrs: Add support to disable an IB port on the storage side

 drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c |  40 ++---
 drivers/infiniband/ulp/rtrs/rtrs-clt.c       | 152 +++++++++--------
 drivers/infiniband/ulp/rtrs/rtrs-clt.h       |  16 +-
 drivers/infiniband/ulp/rtrs/rtrs-pri.h       |   2 +-
 drivers/infiniband/ulp/rtrs/rtrs-srv-stats.c |   3 +-
 drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c |   2 +-
 drivers/infiniband/ulp/rtrs/rtrs-srv.c       | 169 ++++++++++++++-----
 drivers/infiniband/ulp/rtrs/rtrs-srv.h       |   7 +-
 drivers/infiniband/ulp/rtrs/rtrs.c           |  17 +-
 9 files changed, 253 insertions(+), 155 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH for-next 01/10] RDMA/rtrs-clt: During add_path change for_new_clt according to path_num
  2021-07-30 13:18 [PATCH for-next 00/10] Misc update for RTRS Jack Wang
@ 2021-07-30 13:18 ` Jack Wang
  2021-08-02  6:40   ` Leon Romanovsky
  2021-07-30 13:18 ` [PATCH for-next 02/10] RDMA/rtrs-srv: Prevent sysfs error with path name "ctl" Jack Wang
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 33+ messages in thread
From: Jack Wang @ 2021-07-30 13:18 UTC (permalink / raw)
  To: linux-rdma; +Cc: bvanassche, leon, dledford, jgg, haris.iqbal, jinpu.wang

From: Md Haris Iqbal <haris.iqbal@ionos.com>

When all the paths are removed for a session, the addition of the first
path is like a new session for the storage server.

Hence, for_new_clt has to be set to 1.

Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
---
 drivers/infiniband/ulp/rtrs/rtrs-clt.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
index ece3205531b8..e048bfa12755 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
@@ -3083,6 +3083,15 @@ int rtrs_clt_create_path_from_sysfs(struct rtrs_clt *clt,
 	if (IS_ERR(sess))
 		return PTR_ERR(sess);
 
+	if (clt->paths_num == 0) {
+		/*
+		 * When all the paths are removed for a session,
+		 * the addition of the first path is like a new session for
+		 * the storage server
+		 */
+		sess->for_new_clt = 1;
+	}
+
 	/*
 	 * It is totally safe to add path in CONNECTING state: coming
 	 * IO will never grab it.  Also it is very important to add
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH for-next 02/10] RDMA/rtrs-srv: Prevent sysfs error with path name "ctl"
  2021-07-30 13:18 [PATCH for-next 00/10] Misc update for RTRS Jack Wang
  2021-07-30 13:18 ` [PATCH for-next 01/10] RDMA/rtrs-clt: During add_path change for_new_clt according to path_num Jack Wang
@ 2021-07-30 13:18 ` Jack Wang
  2021-08-02  6:47   ` Leon Romanovsky
  2021-07-30 13:18 ` [PATCH for-next 03/10] RDMA/rtrs: Use sysfs_emit instead of s*printf function for sysfs show Jack Wang
                   ` (7 subsequent siblings)
  9 siblings, 1 reply; 33+ messages in thread
From: Jack Wang @ 2021-07-30 13:18 UTC (permalink / raw)
  To: linux-rdma
  Cc: bvanassche, leon, dledford, jgg, haris.iqbal, jinpu.wang, Gioh Kim

From: Gioh Kim <gi-oh.kim@ionos.com>

If the client tries to create a path with name "ctl",
the server tries to creates /sys/devices/virtual/rtrs-server/ctl/.
Then server generated below error because there is already ctl directory
which manages some setup of the server.

sysfs: cannot create duplicate filename '/devices/virtual/rtrs-server/ctl'
Workqueue: ib-comp-wq ib_cq_poll_work [ib_core]
Call Trace:
dump_stack+0x50/0x63
sysfs_warn_dup.cold+0x17/0x24
sysfs_create_dir_ns+0xb6/0xd0
kobject_add_internal+0xa6/0x2a0
kobject_add+0x7e/0xb0
? _cond_resched+0x15/0x30
device_add+0x121/0x640
rtrs_srv_create_sess_files+0x18f/0x1f0 [rtrs_server]
? __alloc_pages_nodemask+0x16c/0x2b0
? kmalloc_order+0x7c/0x90
? kmalloc_order_trace+0x1d/0xa0
? rtrs_iu_alloc+0x17e/0x1bf [rtrs_core]
rtrs_srv_info_req_done+0x417/0x5b0 [rtrs_server]
? __switch_to_asm+0x40/0x70
__ib_process_cq+0x76/0xd0 [ib_core]
ib_cq_poll_work+0x26/0x80 [ib_core]
process_one_work+0x1df/0x3a0
worker_thread+0x4a/0x3c0
kthread+0xfb/0x130
? process_one_work+0x3a0/0x3a0
? kthread_park+0x90/0x90
ret_from_fork+0x1f/0x40
kobject_add_internal failed for ctl with -EEXIST, don't try to register things with the same name in the same directory.
rtrs_server L178: device_add(): -17

This patch checks the path name and disconnect on server to prevent
the kernel error.

Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
---
 drivers/infiniband/ulp/rtrs/rtrs-srv.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
index cd9a4ccf4c28..b814a6052cf1 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
@@ -758,6 +758,14 @@ static bool exist_sessname(struct rtrs_srv_ctx *ctx,
 	struct rtrs_srv_sess *sess;
 	bool found = false;
 
+	/*
+	 * Session name "ct" is not allowed because
+	 * /sys/devices/virtual/rtrs-server/ctl already exists
+	 * for setup management.
+	 */
+	if (!strcmp(sessname, "ctl"))
+		return true;
+
 	mutex_lock(&ctx->srv_mutex);
 	list_for_each_entry(srv, &ctx->srv_list, ctx_list) {
 		mutex_lock(&srv->paths_mutex);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH for-next 03/10] RDMA/rtrs: Use sysfs_emit instead of s*printf function for sysfs show
  2021-07-30 13:18 [PATCH for-next 00/10] Misc update for RTRS Jack Wang
  2021-07-30 13:18 ` [PATCH for-next 01/10] RDMA/rtrs-clt: During add_path change for_new_clt according to path_num Jack Wang
  2021-07-30 13:18 ` [PATCH for-next 02/10] RDMA/rtrs-srv: Prevent sysfs error with path name "ctl" Jack Wang
@ 2021-07-30 13:18 ` Jack Wang
  2021-08-02  6:52   ` Leon Romanovsky
  2021-07-30 13:18 ` [PATCH for-next 04/10] RDMA/rtrs: Remove unused functions Jack Wang
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 33+ messages in thread
From: Jack Wang @ 2021-07-30 13:18 UTC (permalink / raw)
  To: linux-rdma; +Cc: bvanassche, leon, dledford, jgg, haris.iqbal, jinpu.wang

From: Md Haris Iqbal <haris.iqbal@ionos.com>

sysfs_emit function was added to be aware of the PAGE_SIZE maximum of
the temporary buffer used for outputting sysfs content, so there is no
possible overruns. So replace the uses of any s*printf functions for
the sysfs show functions with sysfs_emit.

Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
---
 drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c | 24 +++++++++-----------
 drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c |  2 +-
 2 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c b/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
index 26bbe5d6dff5..c5c047aa45a4 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
@@ -45,24 +45,23 @@ int rtrs_clt_stats_migration_cnt_to_str(struct rtrs_clt_stats *stats,
 	size_t used;
 	int cpu;
 
-	used = scnprintf(buf, len, "    ");
+	used = sysfs_emit(buf, "    ");
 	for_each_possible_cpu(cpu)
-		used += scnprintf(buf + used, len - used, " CPU%u", cpu);
+		used += sysfs_emit_at(buf, used, " CPU%u", cpu);
 
-	used += scnprintf(buf + used, len - used, "\nfrom:");
+	used += sysfs_emit_at(buf, used, "\nfrom:");
 	for_each_possible_cpu(cpu) {
 		s = per_cpu_ptr(stats->pcpu_stats, cpu);
-		used += scnprintf(buf + used, len - used, " %d",
+		used += sysfs_emit_at(buf, used, " %d",
 				  atomic_read(&s->cpu_migr.from));
 	}
 
-	used += scnprintf(buf + used, len - used, "\nto  :");
+	used += sysfs_emit_at(buf, used, "\nto  :");
 	for_each_possible_cpu(cpu) {
 		s = per_cpu_ptr(stats->pcpu_stats, cpu);
-		used += scnprintf(buf + used, len - used, " %d",
-				  s->cpu_migr.to);
+		used += sysfs_emit_at(buf, used, " %d", s->cpu_migr.to);
 	}
-	used += scnprintf(buf + used, len - used, "\n");
+	used += sysfs_emit_at(buf, used, "\n");
 
 	return used;
 }
@@ -70,9 +69,8 @@ int rtrs_clt_stats_migration_cnt_to_str(struct rtrs_clt_stats *stats,
 int rtrs_clt_stats_reconnects_to_str(struct rtrs_clt_stats *stats, char *buf,
 				      size_t len)
 {
-	return scnprintf(buf, len, "%d %d\n",
-			 stats->reconnects.successful_cnt,
-			 stats->reconnects.fail_cnt);
+	return sysfs_emit(buf, "%d %d\n", stats->reconnects.successful_cnt,
+			  stats->reconnects.fail_cnt);
 }
 
 ssize_t rtrs_clt_stats_rdma_to_str(struct rtrs_clt_stats *stats,
@@ -94,7 +92,7 @@ ssize_t rtrs_clt_stats_rdma_to_str(struct rtrs_clt_stats *stats,
 		sum.failover_cnt	  += r->failover_cnt;
 	}
 
-	return scnprintf(page, len, "%llu %llu %llu %llu %u %llu\n",
+	return sysfs_emit(page, "%llu %llu %llu %llu %u %llu\n",
 			 sum.dir[READ].cnt, sum.dir[READ].size_total,
 			 sum.dir[WRITE].cnt, sum.dir[WRITE].size_total,
 			 atomic_read(&stats->inflight), sum.failover_cnt);
@@ -103,7 +101,7 @@ ssize_t rtrs_clt_stats_rdma_to_str(struct rtrs_clt_stats *stats,
 ssize_t rtrs_clt_reset_all_help(struct rtrs_clt_stats *s,
 				 char *page, size_t len)
 {
-	return scnprintf(page, len, "echo 1 to reset all statistics\n");
+	return sysfs_emit(page, "echo 1 to reset all statistics\n");
 }
 
 int rtrs_clt_reset_rdma_stats(struct rtrs_clt_stats *stats, bool enable)
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c b/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c
index 20efd44297fb..9c43ce5ba1c1 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c
@@ -102,7 +102,7 @@ static ssize_t rtrs_srv_src_addr_show(struct kobject *kobj,
 	sess = container_of(kobj, struct rtrs_srv_sess, kobj);
 	cnt = sockaddr_to_str((struct sockaddr *)&sess->s.dst_addr,
 			      page, PAGE_SIZE);
-	return cnt + scnprintf(page + cnt, PAGE_SIZE - cnt, "\n");
+	return cnt + sysfs_emit_at(page, cnt, "\n");
 }
 
 static struct kobj_attribute rtrs_srv_src_addr_attr =
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH for-next 04/10] RDMA/rtrs: Remove unused functions
  2021-07-30 13:18 [PATCH for-next 00/10] Misc update for RTRS Jack Wang
                   ` (2 preceding siblings ...)
  2021-07-30 13:18 ` [PATCH for-next 03/10] RDMA/rtrs: Use sysfs_emit instead of s*printf function for sysfs show Jack Wang
@ 2021-07-30 13:18 ` Jack Wang
  2021-08-02  6:53   ` Leon Romanovsky
  2021-07-30 13:18 ` [PATCH for-next 05/10] RDMA/rtrs: Fix warning when use poll mode Jack Wang
                   ` (5 subsequent siblings)
  9 siblings, 1 reply; 33+ messages in thread
From: Jack Wang @ 2021-07-30 13:18 UTC (permalink / raw)
  To: linux-rdma; +Cc: bvanassche, leon, dledford, jgg, haris.iqbal, jinpu.wang

The two functions are unused, so just remove them.

Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Reviewed-by: Md Haris Iqbal <haris.iqbal@ionos.com>
---
 drivers/infiniband/ulp/rtrs/rtrs-clt.h | 5 +----
 drivers/infiniband/ulp/rtrs/rtrs-srv.h | 4 ----
 2 files changed, 1 insertion(+), 8 deletions(-)

diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.h b/drivers/infiniband/ulp/rtrs/rtrs-clt.h
index 3c3ff094588c..72f9136e3c24 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.h
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.h
@@ -229,10 +229,7 @@ int rtrs_clt_stats_migration_cnt_to_str(struct rtrs_clt_stats *stats, char *buf,
 					 size_t len);
 int rtrs_clt_reset_reconnects_stat(struct rtrs_clt_stats *stats, bool enable);
 int rtrs_clt_stats_reconnects_to_str(struct rtrs_clt_stats *stats, char *buf,
-				      size_t len);
-int rtrs_clt_reset_wc_comp_stats(struct rtrs_clt_stats *stats, bool enable);
-int rtrs_clt_stats_wc_completion_to_str(struct rtrs_clt_stats *stats, char *buf,
-					 size_t len);
+				     size_t len);
 int rtrs_clt_reset_rdma_stats(struct rtrs_clt_stats *stats, bool enable);
 ssize_t rtrs_clt_stats_rdma_to_str(struct rtrs_clt_stats *stats,
 				    char *page, size_t len);
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.h b/drivers/infiniband/ulp/rtrs/rtrs-srv.h
index e81774f5acd3..9d8d2a91a235 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.h
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.h
@@ -138,10 +138,6 @@ static inline void rtrs_srv_update_rdma_stats(struct rtrs_srv_stats *s,
 int rtrs_srv_reset_rdma_stats(struct rtrs_srv_stats *stats, bool enable);
 ssize_t rtrs_srv_stats_rdma_to_str(struct rtrs_srv_stats *stats,
 				    char *page, size_t len);
-int rtrs_srv_reset_wc_completion_stats(struct rtrs_srv_stats *stats,
-					bool enable);
-int rtrs_srv_stats_wc_completion_to_str(struct rtrs_srv_stats *stats, char *buf,
-					 size_t len);
 int rtrs_srv_reset_all_stats(struct rtrs_srv_stats *stats, bool enable);
 ssize_t rtrs_srv_reset_all_help(struct rtrs_srv_stats *stats,
 				 char *page, size_t len);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH for-next 05/10] RDMA/rtrs: Fix warning when use poll mode
  2021-07-30 13:18 [PATCH for-next 00/10] Misc update for RTRS Jack Wang
                   ` (3 preceding siblings ...)
  2021-07-30 13:18 ` [PATCH for-next 04/10] RDMA/rtrs: Remove unused functions Jack Wang
@ 2021-07-30 13:18 ` Jack Wang
  2021-08-02  7:06   ` Leon Romanovsky
  2021-07-30 13:18 ` [PATCH for-next 06/10] RDMA/rtrs: Remove len parameter from helper print functions of sysfs Jack Wang
                   ` (4 subsequent siblings)
  9 siblings, 1 reply; 33+ messages in thread
From: Jack Wang @ 2021-07-30 13:18 UTC (permalink / raw)
  To: linux-rdma
  Cc: bvanassche, leon, dledford, jgg, haris.iqbal, jinpu.wang, Gioh Kim

when test with poll mode, it will fail and lead to warning below:
echo "sessname=bla path=gid:fe80::2:c903:4e:d0b3@gid:fe80::2:c903:8:ca17
device_path=/dev/nullb2 nr_poll_queues=-1" |
sudo tee /sys/devices/virtual/rnbd-client/ctl/map_device

rnbd_client L597: Mapping device /dev/nullb2 on session bla,
(access_mode: rw, nr_poll_queues: 8)
WARNING: CPU: 3 PID: 9886 at drivers/infiniband/core/cq.c:447 ib_cq_pool_get+0x26f/0x2a0 [ib_core]

The problem is in case of poll queue, we need to still call
ib_alloc_cq/ib_free_cq, we can't use cq_poll api for poll queue.

Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Reviewed-by: Gioh Kim <gi-oh.kim@ionos.com>
---
 drivers/infiniband/ulp/rtrs/rtrs-srv.c |  1 +
 drivers/infiniband/ulp/rtrs/rtrs.c     | 17 ++++++++++++++---
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
index b814a6052cf1..5969a74d45a0 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
@@ -1776,6 +1776,7 @@ static struct rtrs_srv_sess *__alloc_sess(struct rtrs_srv *srv,
 	strscpy(sess->s.sessname, str, sizeof(sess->s.sessname));
 
 	sess->s.con_num = con_num;
+	sess->s.irq_con_num = con_num;
 	sess->s.recon_cnt = recon_cnt;
 	uuid_copy(&sess->s.uuid, uuid);
 	spin_lock_init(&sess->state_lock);
diff --git a/drivers/infiniband/ulp/rtrs/rtrs.c b/drivers/infiniband/ulp/rtrs/rtrs.c
index ca542e477d38..9bc323490ce3 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs.c
@@ -228,7 +228,12 @@ static int create_cq(struct rtrs_con *con, int cq_vector, int nr_cqe,
 	struct rdma_cm_id *cm_id = con->cm_id;
 	struct ib_cq *cq;
 
-	cq = ib_cq_pool_get(cm_id->device, nr_cqe, cq_vector, poll_ctx);
+	if (con->cid >= con->sess->irq_con_num)
+		cq = ib_alloc_cq(cm_id->device, con, nr_cqe, cq_vector,
+				 poll_ctx);
+	else
+		cq = ib_cq_pool_get(cm_id->device, nr_cqe, cq_vector, poll_ctx);
+
 	if (IS_ERR(cq)) {
 		rtrs_err(con->sess, "Creating completion queue failed, errno: %ld\n",
 			  PTR_ERR(cq));
@@ -283,7 +288,10 @@ int rtrs_cq_qp_create(struct rtrs_sess *sess, struct rtrs_con *con,
 	err = create_qp(con, sess->dev->ib_pd, max_send_wr, max_recv_wr,
 			max_send_sge);
 	if (err) {
-		ib_cq_pool_put(con->cq, con->nr_cqe);
+		if (con->cid >= con->sess->irq_con_num)
+			ib_free_cq(con->cq);
+		else
+			ib_cq_pool_put(con->cq, con->nr_cqe);
 		con->cq = NULL;
 		return err;
 	}
@@ -300,7 +308,10 @@ void rtrs_cq_qp_destroy(struct rtrs_con *con)
 		con->qp = NULL;
 	}
 	if (con->cq) {
-		ib_cq_pool_put(con->cq, con->nr_cqe);
+		if (con->cid >= con->sess->irq_con_num)
+			ib_free_cq(con->cq);
+		else
+			ib_cq_pool_put(con->cq, con->nr_cqe);
 		con->cq = NULL;
 	}
 }
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH for-next 06/10] RDMA/rtrs: Remove len parameter from helper print functions of sysfs
  2021-07-30 13:18 [PATCH for-next 00/10] Misc update for RTRS Jack Wang
                   ` (4 preceding siblings ...)
  2021-07-30 13:18 ` [PATCH for-next 05/10] RDMA/rtrs: Fix warning when use poll mode Jack Wang
@ 2021-07-30 13:18 ` Jack Wang
  2021-08-02  7:08   ` Leon Romanovsky
  2021-07-30 13:18 ` [PATCH for-next 07/10] RDMA/rtrs: Remove all likely and unlikely Jack Wang
                   ` (3 subsequent siblings)
  9 siblings, 1 reply; 33+ messages in thread
From: Jack Wang @ 2021-07-30 13:18 UTC (permalink / raw)
  To: linux-rdma; +Cc: bvanassche, leon, dledford, jgg, haris.iqbal, jinpu.wang

From: Md Haris Iqbal <haris.iqbal@ionos.com>

Since we have changed all sysfs show functions to use sysfs_emit, we do
not require the len (PAGE_SIZE) in our helper print functions. So remove
it from the function parameter.

Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
---
 drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c | 12 ++++--------
 drivers/infiniband/ulp/rtrs/rtrs-clt.h       | 12 +++++-------
 drivers/infiniband/ulp/rtrs/rtrs-pri.h       |  2 +-
 drivers/infiniband/ulp/rtrs/rtrs-srv-stats.c |  3 +--
 drivers/infiniband/ulp/rtrs/rtrs-srv.h       |  3 +--
 5 files changed, 12 insertions(+), 20 deletions(-)

diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c b/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
index c5c047aa45a4..585f83cd7ed1 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
@@ -37,8 +37,7 @@ void rtrs_clt_inc_failover_cnt(struct rtrs_clt_stats *stats)
 	s->rdma.failover_cnt++;
 }
 
-int rtrs_clt_stats_migration_cnt_to_str(struct rtrs_clt_stats *stats,
-					 char *buf, size_t len)
+int rtrs_clt_stats_migration_cnt_to_str(struct rtrs_clt_stats *stats, char *buf)
 {
 	struct rtrs_clt_stats_pcpu *s;
 
@@ -66,15 +65,13 @@ int rtrs_clt_stats_migration_cnt_to_str(struct rtrs_clt_stats *stats,
 	return used;
 }
 
-int rtrs_clt_stats_reconnects_to_str(struct rtrs_clt_stats *stats, char *buf,
-				      size_t len)
+int rtrs_clt_stats_reconnects_to_str(struct rtrs_clt_stats *stats, char *buf)
 {
 	return sysfs_emit(buf, "%d %d\n", stats->reconnects.successful_cnt,
 			  stats->reconnects.fail_cnt);
 }
 
-ssize_t rtrs_clt_stats_rdma_to_str(struct rtrs_clt_stats *stats,
-				    char *page, size_t len)
+ssize_t rtrs_clt_stats_rdma_to_str(struct rtrs_clt_stats *stats, char *page)
 {
 	struct rtrs_clt_stats_rdma sum;
 	struct rtrs_clt_stats_rdma *r;
@@ -98,8 +95,7 @@ ssize_t rtrs_clt_stats_rdma_to_str(struct rtrs_clt_stats *stats,
 			 atomic_read(&stats->inflight), sum.failover_cnt);
 }
 
-ssize_t rtrs_clt_reset_all_help(struct rtrs_clt_stats *s,
-				 char *page, size_t len)
+ssize_t rtrs_clt_reset_all_help(struct rtrs_clt_stats *s, char *page)
 {
 	return sysfs_emit(page, "echo 1 to reset all statistics\n");
 }
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.h b/drivers/infiniband/ulp/rtrs/rtrs-clt.h
index 72f9136e3c24..c31f920e6d10 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.h
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.h
@@ -223,19 +223,17 @@ void rtrs_clt_update_all_stats(struct rtrs_clt_io_req *req, int dir);
 int rtrs_clt_reset_rdma_lat_distr_stats(struct rtrs_clt_stats *stats,
 					 bool enable);
 ssize_t rtrs_clt_stats_rdma_lat_distr_to_str(struct rtrs_clt_stats *stats,
-					      char *page, size_t len);
+					      char *page);
 int rtrs_clt_reset_cpu_migr_stats(struct rtrs_clt_stats *stats, bool enable);
-int rtrs_clt_stats_migration_cnt_to_str(struct rtrs_clt_stats *stats, char *buf,
-					 size_t len);
+int rtrs_clt_stats_migration_cnt_to_str(struct rtrs_clt_stats *stats, char *buf);
 int rtrs_clt_reset_reconnects_stat(struct rtrs_clt_stats *stats, bool enable);
-int rtrs_clt_stats_reconnects_to_str(struct rtrs_clt_stats *stats, char *buf,
-				     size_t len);
+int rtrs_clt_stats_reconnects_to_str(struct rtrs_clt_stats *stats, char *buf);
 int rtrs_clt_reset_rdma_stats(struct rtrs_clt_stats *stats, bool enable);
 ssize_t rtrs_clt_stats_rdma_to_str(struct rtrs_clt_stats *stats,
-				    char *page, size_t len);
+				    char *page);
 int rtrs_clt_reset_all_stats(struct rtrs_clt_stats *stats, bool enable);
 ssize_t rtrs_clt_reset_all_help(struct rtrs_clt_stats *stats,
-				 char *page, size_t len);
+				 char *page);
 
 /* rtrs-clt-sysfs.c */
 
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-pri.h b/drivers/infiniband/ulp/rtrs/rtrs-pri.h
index d12ddfa50747..78eac9a4f703 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-pri.h
+++ b/drivers/infiniband/ulp/rtrs/rtrs-pri.h
@@ -398,7 +398,7 @@ static ssize_t get_value##_show(struct kobject *kobj,			\
 {									\
 	type *stats = container_of(kobj, type, kobj_stats);		\
 									\
-	return print(stats, page, PAGE_SIZE);			\
+	return print(stats, page);			\
 }
 
 #define STAT_ATTR(type, stat, print, reset)				\
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv-stats.c b/drivers/infiniband/ulp/rtrs/rtrs-srv-stats.c
index 12c374b5eb6e..44b1c1652131 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv-stats.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv-stats.c
@@ -23,8 +23,7 @@ int rtrs_srv_reset_rdma_stats(struct rtrs_srv_stats *stats, bool enable)
 	return -EINVAL;
 }
 
-ssize_t rtrs_srv_stats_rdma_to_str(struct rtrs_srv_stats *stats,
-				    char *page, size_t len)
+ssize_t rtrs_srv_stats_rdma_to_str(struct rtrs_srv_stats *stats, char *page)
 {
 	struct rtrs_srv_stats_rdma_stats *r = &stats->rdma_stats;
 
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.h b/drivers/infiniband/ulp/rtrs/rtrs-srv.h
index 9d8d2a91a235..7d403c12faf3 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.h
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.h
@@ -136,8 +136,7 @@ static inline void rtrs_srv_update_rdma_stats(struct rtrs_srv_stats *s,
 
 /* functions which are implemented in rtrs-srv-stats.c */
 int rtrs_srv_reset_rdma_stats(struct rtrs_srv_stats *stats, bool enable);
-ssize_t rtrs_srv_stats_rdma_to_str(struct rtrs_srv_stats *stats,
-				    char *page, size_t len);
+ssize_t rtrs_srv_stats_rdma_to_str(struct rtrs_srv_stats *stats, char *page);
 int rtrs_srv_reset_all_stats(struct rtrs_srv_stats *stats, bool enable);
 ssize_t rtrs_srv_reset_all_help(struct rtrs_srv_stats *stats,
 				 char *page, size_t len);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH for-next 07/10] RDMA/rtrs: Remove all likely and unlikely
  2021-07-30 13:18 [PATCH for-next 00/10] Misc update for RTRS Jack Wang
                   ` (5 preceding siblings ...)
  2021-07-30 13:18 ` [PATCH for-next 06/10] RDMA/rtrs: Remove len parameter from helper print functions of sysfs Jack Wang
@ 2021-07-30 13:18 ` Jack Wang
  2021-08-02  7:10   ` Leon Romanovsky
  2021-07-30 13:18 ` [PATCH for-next 08/10] RDMA/rtrs-clt: Fix counting inflight IO Jack Wang
                   ` (2 subsequent siblings)
  9 siblings, 1 reply; 33+ messages in thread
From: Jack Wang @ 2021-07-30 13:18 UTC (permalink / raw)
  To: linux-rdma
  Cc: bvanassche, leon, dledford, jgg, haris.iqbal, jinpu.wang, Gioh Kim

From: Gioh Kim <gi-oh.kim@ionos.com>

The IO performance test with fio after swapping the likely
and unlikely macros in all if-statement shows no difference.
They do not help for the performance of rtrs.

Thanks to Haakon Bugge for the test scenario.

The fio test did random read on 32 rnbd devices and 64 processes.
Test environment:
- Intel(R) Xeon(R) Gold 6130 CPU @ 2.10GHz
- 376G memory
- kernel version: 5.4.86
- gcc version: gcc (Debian 8.3.0-6) 8.3.0
- Infiniband controller: Mellanox Technologies MT27800 Family
[ConnectX-5]

Test result:
- before swapping:       IOPS=829k, BW=3239MiB/s
- after swapping:        IOPS=829k, BW=3238MiB/s
- remove all (un)likely: IOPS=829k, BW=3238MiB/s

Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
---
 drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c |   2 +-
 drivers/infiniband/ulp/rtrs/rtrs-clt.c       | 126 +++++++++----------
 drivers/infiniband/ulp/rtrs/rtrs-srv.c       |  74 ++++++-----
 3 files changed, 99 insertions(+), 103 deletions(-)

diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c b/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
index 585f83cd7ed1..4f1980a3608a 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
@@ -20,7 +20,7 @@ void rtrs_clt_update_wc_stats(struct rtrs_clt_con *con)
 
 	cpu = raw_smp_processor_id();
 	s = this_cpu_ptr(stats->pcpu_stats);
-	if (unlikely(con->cpu != cpu)) {
+	if (con->cpu != cpu) {
 		s->cpu_migr.to++;
 
 		/* Careful here, override s pointer */
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
index e048bfa12755..3cf7118a1c00 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
@@ -75,9 +75,9 @@ __rtrs_get_permit(struct rtrs_clt *clt, enum rtrs_clt_con_type con_type)
 	 */
 	do {
 		bit = find_first_zero_bit(clt->permits_map, max_depth);
-		if (unlikely(bit >= max_depth))
+		if (bit >= max_depth)
 			return NULL;
-	} while (unlikely(test_and_set_bit_lock(bit, clt->permits_map)));
+	} while (test_and_set_bit_lock(bit, clt->permits_map));
 
 	permit = get_permit(clt, bit);
 	WARN_ON(permit->mem_id != bit);
@@ -115,14 +115,14 @@ struct rtrs_permit *rtrs_clt_get_permit(struct rtrs_clt *clt,
 	DEFINE_WAIT(wait);
 
 	permit = __rtrs_get_permit(clt, con_type);
-	if (likely(permit) || !can_wait)
+	if (permit || !can_wait)
 		return permit;
 
 	do {
 		prepare_to_wait(&clt->permits_wait, &wait,
 				TASK_UNINTERRUPTIBLE);
 		permit = __rtrs_get_permit(clt, con_type);
-		if (likely(permit))
+		if (permit)
 			break;
 
 		io_schedule();
@@ -175,7 +175,7 @@ struct rtrs_clt_con *rtrs_permit_to_clt_con(struct rtrs_clt_sess *sess,
 {
 	int id = 0;
 
-	if (likely(permit->con_type == RTRS_IO_CON))
+	if (permit->con_type == RTRS_IO_CON)
 		id = (permit->cpu_id % (sess->s.irq_con_num - 1)) + 1;
 
 	return to_clt_con(sess->s.con[id]);
@@ -329,7 +329,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 (unlikely(wc->status != IB_WC_SUCCESS)) {
+	if (wc->status != IB_WC_SUCCESS) {
 		rtrs_err(con->c.sess, "Failed IB_WR_REG_MR: %s\n",
 			  ib_wc_status_msg(wc->status));
 		rtrs_rdma_error_recovery(con);
@@ -349,13 +349,13 @@ static void rtrs_clt_inv_rkey_done(struct ib_cq *cq, struct ib_wc *wc)
 		container_of(wc->wr_cqe, typeof(*req), inv_cqe);
 	struct rtrs_clt_con *con = to_clt_con(wc->qp->qp_context);
 
-	if (unlikely(wc->status != IB_WC_SUCCESS)) {
+	if (wc->status != IB_WC_SUCCESS) {
 		rtrs_err(con->c.sess, "Failed IB_WR_LOCAL_INV: %s\n",
 			  ib_wc_status_msg(wc->status));
 		rtrs_rdma_error_recovery(con);
 	}
 	req->need_inv = false;
-	if (likely(req->need_inv_comp))
+	if (req->need_inv_comp)
 		complete(&req->inv_comp);
 	else
 		/* Complete request from INV callback */
@@ -390,7 +390,7 @@ static void complete_rdma_req(struct rtrs_clt_io_req *req, int errno,
 	sess = to_clt_sess(con->c.sess);
 
 	if (req->sg_cnt) {
-		if (unlikely(req->dir == DMA_FROM_DEVICE && req->need_inv)) {
+		if (req->dir == DMA_FROM_DEVICE && req->need_inv) {
 			/*
 			 * We are here to invalidate read requests
 			 * ourselves.  In normal scenario server should
@@ -405,7 +405,7 @@ static void complete_rdma_req(struct rtrs_clt_io_req *req, int errno,
 			 *        should do that ourselves.
 			 */
 
-			if (likely(can_wait)) {
+			if (can_wait) {
 				req->need_inv_comp = true;
 			} else {
 				/* This should be IO path, so always notify */
@@ -416,10 +416,10 @@ static void complete_rdma_req(struct rtrs_clt_io_req *req, int errno,
 
 			refcount_inc(&req->ref);
 			err = rtrs_inv_rkey(req);
-			if (unlikely(err)) {
+			if (err) {
 				rtrs_err(con->c.sess, "Send INV WR key=%#x: %d\n",
 					  req->mr->rkey, err);
-			} else if (likely(can_wait)) {
+			} else if (can_wait) {
 				wait_for_completion(&req->inv_comp);
 			} else {
 				/*
@@ -463,7 +463,7 @@ static int rtrs_post_send_rdma(struct rtrs_clt_con *con,
 	enum ib_send_flags flags;
 	struct ib_sge sge;
 
-	if (unlikely(!req->sg_size)) {
+	if (!req->sg_size) {
 		rtrs_wrn(con->c.sess,
 			 "Doing RDMA Write failed, no data supplied\n");
 		return -EINVAL;
@@ -513,7 +513,7 @@ static void rtrs_clt_recv_done(struct rtrs_clt_con *con, struct ib_wc *wc)
 	iu = container_of(wc->wr_cqe, struct rtrs_iu,
 			  cqe);
 	err = rtrs_iu_post_recv(&con->c, iu);
-	if (unlikely(err)) {
+	if (err) {
 		rtrs_err(con->c.sess, "post iu failed %d\n", err);
 		rtrs_rdma_error_recovery(con);
 	}
@@ -533,7 +533,7 @@ static void rtrs_clt_rkey_rsp_done(struct rtrs_clt_con *con, struct ib_wc *wc)
 
 	iu = container_of(wc->wr_cqe, struct rtrs_iu, cqe);
 
-	if (unlikely(wc->byte_len < sizeof(*msg))) {
+	if (wc->byte_len < sizeof(*msg)) {
 		rtrs_err(con->c.sess, "rkey response is malformed: size %d\n",
 			  wc->byte_len);
 		goto out;
@@ -541,7 +541,7 @@ static void rtrs_clt_rkey_rsp_done(struct rtrs_clt_con *con, struct ib_wc *wc)
 	ib_dma_sync_single_for_cpu(sess->s.dev->ib_dev, iu->dma_addr,
 				   iu->size, DMA_FROM_DEVICE);
 	msg = iu->buf;
-	if (unlikely(le16_to_cpu(msg->type) != RTRS_MSG_RKEY_RSP)) {
+	if (le16_to_cpu(msg->type) != RTRS_MSG_RKEY_RSP) {
 		rtrs_err(sess->clt, "rkey response is malformed: type %d\n",
 			  le16_to_cpu(msg->type));
 		goto out;
@@ -551,8 +551,8 @@ static void rtrs_clt_rkey_rsp_done(struct rtrs_clt_con *con, struct ib_wc *wc)
 		goto out;
 
 	rtrs_from_imm(be32_to_cpu(wc->ex.imm_data), &imm_type, &imm_payload);
-	if (likely(imm_type == RTRS_IO_RSP_IMM ||
-		   imm_type == RTRS_IO_RSP_W_INV_IMM)) {
+	if (imm_type == RTRS_IO_RSP_IMM ||
+	    imm_type == RTRS_IO_RSP_W_INV_IMM) {
 		u32 msg_id;
 
 		w_inval = (imm_type == RTRS_IO_RSP_W_INV_IMM);
@@ -605,7 +605,7 @@ static void rtrs_clt_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
 	bool w_inval = false;
 	int err;
 
-	if (unlikely(wc->status != IB_WC_SUCCESS)) {
+	if (wc->status != IB_WC_SUCCESS) {
 		if (wc->status != IB_WC_WR_FLUSH_ERR) {
 			rtrs_err(sess->clt, "RDMA failed: %s\n",
 				  ib_wc_status_msg(wc->status));
@@ -625,8 +625,8 @@ static void rtrs_clt_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
 			return;
 		rtrs_from_imm(be32_to_cpu(wc->ex.imm_data),
 			       &imm_type, &imm_payload);
-		if (likely(imm_type == RTRS_IO_RSP_IMM ||
-			   imm_type == RTRS_IO_RSP_W_INV_IMM)) {
+		if (imm_type == RTRS_IO_RSP_IMM ||
+		    imm_type == RTRS_IO_RSP_W_INV_IMM) {
 			u32 msg_id;
 
 			w_inval = (imm_type == RTRS_IO_RSP_W_INV_IMM);
@@ -657,7 +657,7 @@ static void rtrs_clt_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
 			err = rtrs_post_recv_empty_x2(&con->c, &io_comp_cqe);
 		else
 			err = rtrs_post_recv_empty(&con->c, &io_comp_cqe);
-		if (unlikely(err)) {
+		if (err) {
 			rtrs_err(con->c.sess, "rtrs_post_recv_empty(): %d\n",
 				  err);
 			rtrs_rdma_error_recovery(con);
@@ -703,7 +703,7 @@ static int post_recv_io(struct rtrs_clt_con *con, size_t q_size)
 		} else {
 			err = rtrs_post_recv_empty(&con->c, &io_comp_cqe);
 		}
-		if (unlikely(err))
+		if (err)
 			return err;
 	}
 
@@ -728,7 +728,7 @@ static int post_recv_sess(struct rtrs_clt_sess *sess)
 		q_size *= 2;
 
 		err = post_recv_io(to_clt_con(sess->s.con[cid]), q_size);
-		if (unlikely(err)) {
+		if (err) {
 			rtrs_err(sess->clt, "post_recv_io(), err: %d\n", err);
 			return err;
 		}
@@ -789,7 +789,7 @@ static struct rtrs_clt_sess *get_next_path_rr(struct path_it *it)
 
 	ppcpu_path = this_cpu_ptr(clt->pcpu_path);
 	path = rcu_dereference(*ppcpu_path);
-	if (unlikely(!path))
+	if (!path)
 		path = list_first_or_null_rcu(&clt->paths_list,
 					      typeof(*path), s.entry);
 	else
@@ -820,10 +820,10 @@ 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))
+		if (READ_ONCE(sess->state) != RTRS_CLT_CONNECTED)
 			continue;
 
-		if (unlikely(!list_empty(raw_cpu_ptr(sess->mp_skip_entry))))
+		if (!list_empty(raw_cpu_ptr(sess->mp_skip_entry)))
 			continue;
 
 		inflight = atomic_read(&sess->stats->inflight);
@@ -871,10 +871,10 @@ static struct rtrs_clt_sess *get_next_path_min_latency(struct path_it *it)
 	ktime_t latency;
 
 	list_for_each_entry_rcu(sess, &clt->paths_list, s.entry) {
-		if (unlikely(READ_ONCE(sess->state) != RTRS_CLT_CONNECTED))
+		if (READ_ONCE(sess->state) != RTRS_CLT_CONNECTED)
 			continue;
 
-		if (unlikely(!list_empty(raw_cpu_ptr(sess->mp_skip_entry))))
+		if (!list_empty(raw_cpu_ptr(sess->mp_skip_entry)))
 			continue;
 
 		latency = sess->s.hb_cur_latency;
@@ -1063,7 +1063,7 @@ static int rtrs_map_sg_fr(struct rtrs_clt_io_req *req, size_t count)
 	nr = ib_map_mr_sg(req->mr, req->sglist, count, NULL, SZ_4K);
 	if (nr < 0)
 		return nr;
-	if (unlikely(nr < req->sg_cnt))
+	if (nr < req->sg_cnt)
 		return -EINVAL;
 	ib_update_fast_reg_key(req->mr, ib_inc_rkey(req->mr->rkey));
 
@@ -1087,7 +1087,7 @@ static int rtrs_clt_write_req(struct rtrs_clt_io_req *req)
 
 	const size_t tsize = sizeof(*msg) + req->data_len + req->usr_len;
 
-	if (unlikely(tsize > sess->chunk_size)) {
+	if (tsize > sess->chunk_size) {
 		rtrs_wrn(s, "Write request failed, size too big %zu > %d\n",
 			  tsize, sess->chunk_size);
 		return -EMSGSIZE;
@@ -1095,7 +1095,7 @@ static int rtrs_clt_write_req(struct rtrs_clt_io_req *req)
 	if (req->sg_cnt) {
 		count = ib_dma_map_sg(sess->s.dev->ib_dev, req->sglist,
 				      req->sg_cnt, req->dir);
-		if (unlikely(!count)) {
+		if (!count) {
 			rtrs_wrn(s, "Write request failed, map failed\n");
 			return -EINVAL;
 		}
@@ -1149,7 +1149,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,
 				      req->usr_len + sizeof(*msg),
 				      imm, wr, &inv_wr);
-	if (unlikely(ret)) {
+	if (ret) {
 		rtrs_err_rl(s,
 			    "Write request failed: error=%d path=%s [%s:%u]\n",
 			    ret, kobject_name(&sess->kobj), sess->hca_name,
@@ -1180,7 +1180,7 @@ static int rtrs_clt_read_req(struct rtrs_clt_io_req *req)
 
 	const size_t tsize = sizeof(*msg) + req->data_len + req->usr_len;
 
-	if (unlikely(tsize > sess->chunk_size)) {
+	if (tsize > sess->chunk_size) {
 		rtrs_wrn(s,
 			  "Read request failed, message size is %zu, bigger than CHUNK_SIZE %d\n",
 			  tsize, sess->chunk_size);
@@ -1190,7 +1190,7 @@ static int rtrs_clt_read_req(struct rtrs_clt_io_req *req)
 	if (req->sg_cnt) {
 		count = ib_dma_map_sg(dev->ib_dev, req->sglist, req->sg_cnt,
 				      req->dir);
-		if (unlikely(!count)) {
+		if (!count) {
 			rtrs_wrn(s,
 				  "Read request failed, dma map failed\n");
 			return -EINVAL;
@@ -1255,7 +1255,7 @@ static int rtrs_clt_read_req(struct rtrs_clt_io_req *req)
 
 	ret = rtrs_post_send_rdma(req->con, req, &sess->rbufs[buf_id],
 				   req->data_len, imm, wr);
-	if (unlikely(ret)) {
+	if (ret) {
 		rtrs_err_rl(s,
 			    "Read request failed: error=%d path=%s [%s:%u]\n",
 			    ret, kobject_name(&sess->kobj), sess->hca_name,
@@ -1288,15 +1288,14 @@ static int rtrs_clt_failover_req(struct rtrs_clt *clt,
 	for (path_it_init(&it, clt);
 	     (alive_sess = it.next_path(&it)) && it.i < it.clt->paths_num;
 	     it.i++) {
-		if (unlikely(READ_ONCE(alive_sess->state) !=
-			     RTRS_CLT_CONNECTED))
+		if (READ_ONCE(alive_sess->state) != RTRS_CLT_CONNECTED)
 			continue;
 		req = rtrs_clt_get_copy_req(alive_sess, fail_req);
 		if (req->dir == DMA_TO_DEVICE)
 			err = rtrs_clt_write_req(req);
 		else
 			err = rtrs_clt_read_req(req);
-		if (unlikely(err)) {
+		if (err) {
 			req->in_use = false;
 			continue;
 		}
@@ -1331,7 +1330,7 @@ static void fail_all_outstanding_reqs(struct rtrs_clt_sess *sess)
 		complete_rdma_req(req, -ECONNABORTED, false, true);
 
 		err = rtrs_clt_failover_req(clt, req);
-		if (unlikely(err))
+		if (err)
 			/* Failover failed, notify anyway */
 			req->conf(req->priv, err);
 	}
@@ -1963,7 +1962,7 @@ static int rtrs_clt_rdma_cm_handler(struct rdma_cm_id *cm_id,
 		break;
 	case RDMA_CM_EVENT_ESTABLISHED:
 		cm_err = rtrs_rdma_conn_established(con, ev);
-		if (likely(!cm_err)) {
+		if (!cm_err) {
 			/*
 			 * Report success and wake up. Here we abuse state_wq,
 			 * i.e. wake up without state change, but we set cm_err.
@@ -2382,7 +2381,7 @@ static void rtrs_clt_info_req_done(struct ib_cq *cq, struct ib_wc *wc)
 	iu = container_of(wc->wr_cqe, struct rtrs_iu, cqe);
 	rtrs_iu_free(iu, sess->s.dev->ib_dev, 1);
 
-	if (unlikely(wc->status != IB_WC_SUCCESS)) {
+	if (wc->status != IB_WC_SUCCESS) {
 		rtrs_err(sess->clt, "Sess info request send failed: %s\n",
 			  ib_wc_status_msg(wc->status));
 		rtrs_clt_change_state_get_old(sess, RTRS_CLT_CONNECTING_ERR, NULL);
@@ -2399,7 +2398,7 @@ static int process_info_rsp(struct rtrs_clt_sess *sess,
 	int i, sgi;
 
 	sg_cnt = le16_to_cpu(msg->sg_cnt);
-	if (unlikely(!sg_cnt || (sess->queue_depth % sg_cnt))) {
+	if (!sg_cnt || (sess->queue_depth % sg_cnt)) {
 		rtrs_err(sess->clt, "Incorrect sg_cnt %d, is not multiple\n",
 			  sg_cnt);
 		return -EINVAL;
@@ -2409,9 +2408,8 @@ static int process_info_rsp(struct rtrs_clt_sess *sess,
 	 * Check if IB immediate data size is enough to hold the mem_id and
 	 * the offset inside the memory chunk.
 	 */
-	if (unlikely((ilog2(sg_cnt - 1) + 1) +
-		     (ilog2(sess->chunk_size - 1) + 1) >
-		     MAX_IMM_PAYL_BITS)) {
+	if ((ilog2(sg_cnt - 1) + 1) + (ilog2(sess->chunk_size - 1) + 1) >
+	    MAX_IMM_PAYL_BITS) {
 		rtrs_err(sess->clt,
 			  "RDMA immediate size (%db) not enough to encode %d buffers of size %dB\n",
 			  MAX_IMM_PAYL_BITS, sg_cnt, sess->chunk_size);
@@ -2429,7 +2427,7 @@ static int process_info_rsp(struct rtrs_clt_sess *sess,
 
 		total_len += len;
 
-		if (unlikely(!len || (len % sess->chunk_size))) {
+		if (!len || (len % sess->chunk_size)) {
 			rtrs_err(sess->clt, "Incorrect [%d].len %d\n", sgi,
 				  len);
 			return -EINVAL;
@@ -2443,11 +2441,11 @@ static int process_info_rsp(struct rtrs_clt_sess *sess,
 		}
 	}
 	/* Sanity check */
-	if (unlikely(sgi != sg_cnt || i != sess->queue_depth)) {
+	if (sgi != sg_cnt || i != sess->queue_depth) {
 		rtrs_err(sess->clt, "Incorrect sg vector, not fully mapped\n");
 		return -EINVAL;
 	}
-	if (unlikely(total_len != sess->chunk_size * sess->queue_depth)) {
+	if (total_len != sess->chunk_size * sess->queue_depth) {
 		rtrs_err(sess->clt, "Incorrect total_len %d\n", total_len);
 		return -EINVAL;
 	}
@@ -2469,14 +2467,14 @@ static void rtrs_clt_info_rsp_done(struct ib_cq *cq, struct ib_wc *wc)
 
 	WARN_ON(con->c.cid);
 	iu = container_of(wc->wr_cqe, struct rtrs_iu, cqe);
-	if (unlikely(wc->status != IB_WC_SUCCESS)) {
+	if (wc->status != IB_WC_SUCCESS) {
 		rtrs_err(sess->clt, "Sess info response recv failed: %s\n",
 			  ib_wc_status_msg(wc->status));
 		goto out;
 	}
 	WARN_ON(wc->opcode != IB_WC_RECV);
 
-	if (unlikely(wc->byte_len < sizeof(*msg))) {
+	if (wc->byte_len < sizeof(*msg)) {
 		rtrs_err(sess->clt, "Sess info response is malformed: size %d\n",
 			  wc->byte_len);
 		goto out;
@@ -2484,24 +2482,24 @@ static void rtrs_clt_info_rsp_done(struct ib_cq *cq, struct ib_wc *wc)
 	ib_dma_sync_single_for_cpu(sess->s.dev->ib_dev, iu->dma_addr,
 				   iu->size, DMA_FROM_DEVICE);
 	msg = iu->buf;
-	if (unlikely(le16_to_cpu(msg->type) != RTRS_MSG_INFO_RSP)) {
+	if (le16_to_cpu(msg->type) != RTRS_MSG_INFO_RSP) {
 		rtrs_err(sess->clt, "Sess info response is malformed: type %d\n",
 			  le16_to_cpu(msg->type));
 		goto out;
 	}
 	rx_sz  = sizeof(*msg);
 	rx_sz += sizeof(msg->desc[0]) * le16_to_cpu(msg->sg_cnt);
-	if (unlikely(wc->byte_len < rx_sz)) {
+	if (wc->byte_len < rx_sz) {
 		rtrs_err(sess->clt, "Sess info response is malformed: size %d\n",
 			  wc->byte_len);
 		goto out;
 	}
 	err = process_info_rsp(sess, msg);
-	if (unlikely(err))
+	if (err)
 		goto out;
 
 	err = post_recv_sess(sess);
-	if (unlikely(err))
+	if (err)
 		goto out;
 
 	state = RTRS_CLT_CONNECTED;
@@ -2528,13 +2526,13 @@ static int rtrs_send_sess_info(struct rtrs_clt_sess *sess)
 			       rtrs_clt_info_req_done);
 	rx_iu = rtrs_iu_alloc(1, rx_sz, GFP_KERNEL, sess->s.dev->ib_dev,
 			       DMA_FROM_DEVICE, rtrs_clt_info_rsp_done);
-	if (unlikely(!tx_iu || !rx_iu)) {
+	if (!tx_iu || !rx_iu) {
 		err = -ENOMEM;
 		goto out;
 	}
 	/* Prepare for getting info response */
 	err = rtrs_iu_post_recv(&usr_con->c, rx_iu);
-	if (unlikely(err)) {
+	if (err) {
 		rtrs_err(sess->clt, "rtrs_iu_post_recv(), err: %d\n", err);
 		goto out;
 	}
@@ -2549,7 +2547,7 @@ static int rtrs_send_sess_info(struct rtrs_clt_sess *sess)
 
 	/* Send info request */
 	err = rtrs_iu_post_send(&usr_con->c, tx_iu, sizeof(*msg), NULL);
-	if (unlikely(err)) {
+	if (err) {
 		rtrs_err(sess->clt, "rtrs_iu_post_send(), err: %d\n", err);
 		goto out;
 	}
@@ -2560,7 +2558,7 @@ static int rtrs_send_sess_info(struct rtrs_clt_sess *sess)
 					 sess->state != RTRS_CLT_CONNECTING,
 					 msecs_to_jiffies(
 						 RTRS_CONNECT_TIMEOUT_MS));
-	if (unlikely(READ_ONCE(sess->state) != RTRS_CLT_CONNECTED)) {
+	if (READ_ONCE(sess->state) != RTRS_CLT_CONNECTED) {
 		if (READ_ONCE(sess->state) == RTRS_CLT_CONNECTING_ERR)
 			err = -ECONNRESET;
 		else
@@ -2572,7 +2570,7 @@ static int rtrs_send_sess_info(struct rtrs_clt_sess *sess)
 		rtrs_iu_free(tx_iu, sess->s.dev->ib_dev, 1);
 	if (rx_iu)
 		rtrs_iu_free(rx_iu, sess->s.dev->ib_dev, 1);
-	if (unlikely(err))
+	if (err)
 		/* If we've never taken async path because of malloc problems */
 		rtrs_clt_change_state_get_old(sess, RTRS_CLT_CONNECTING_ERR, NULL);
 
@@ -2920,7 +2918,7 @@ int rtrs_clt_remove_path_from_sysfs(struct rtrs_clt_sess *sess,
 							&old_state);
 	} while (!changed && old_state != RTRS_CLT_DEAD);
 
-	if (likely(changed)) {
+	if (changed) {
 		rtrs_clt_remove_path_from_arr(sess);
 		rtrs_clt_destroy_sess_files(sess, sysfs_self);
 		kobject_put(&sess->kobj);
@@ -2992,10 +2990,10 @@ int rtrs_clt_request(int dir, struct rtrs_clt_req_ops *ops,
 	rcu_read_lock();
 	for (path_it_init(&it, clt);
 	     (sess = it.next_path(&it)) && it.i < it.clt->paths_num; it.i++) {
-		if (unlikely(READ_ONCE(sess->state) != RTRS_CLT_CONNECTED))
+		if (READ_ONCE(sess->state) != RTRS_CLT_CONNECTED)
 			continue;
 
-		if (unlikely(usr_len + hdr_len > sess->max_hdr_size)) {
+		if (usr_len + hdr_len > sess->max_hdr_size) {
 			rtrs_wrn_rl(sess->clt,
 				     "%s request failed, user message size is %zu and header length %zu, but max size is %u\n",
 				     dir == READ ? "Read" : "Write",
@@ -3010,7 +3008,7 @@ int rtrs_clt_request(int dir, struct rtrs_clt_req_ops *ops,
 			err = rtrs_clt_read_req(req);
 		else
 			err = rtrs_clt_write_req(req);
-		if (unlikely(err)) {
+		if (err) {
 			req->in_use = false;
 			continue;
 		}
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
index 5969a74d45a0..cc65cffdc65a 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
@@ -183,7 +183,7 @@ static void rtrs_srv_reg_mr_done(struct ib_cq *cq, struct ib_wc *wc)
 	struct rtrs_sess *s = con->c.sess;
 	struct rtrs_srv_sess *sess = to_srv_sess(s);
 
-	if (unlikely(wc->status != IB_WC_SUCCESS)) {
+	if (wc->status != IB_WC_SUCCESS) {
 		rtrs_err(s, "REG MR failed: %s\n",
 			  ib_wc_status_msg(wc->status));
 		close_sess(sess);
@@ -215,7 +215,7 @@ static int rdma_write_sg(struct rtrs_srv_op *id)
 
 	sg_cnt = le16_to_cpu(id->rd_msg->sg_cnt);
 	need_inval = le16_to_cpu(id->rd_msg->flags) & RTRS_MSG_NEED_INVAL_F;
-	if (unlikely(sg_cnt != 1))
+	if (sg_cnt != 1)
 		return -EINVAL;
 
 	offset = 0;
@@ -228,7 +228,7 @@ static int rdma_write_sg(struct rtrs_srv_op *id)
 	/* WR will fail with length error
 	 * if this is 0
 	 */
-	if (unlikely(plist->length == 0)) {
+	if (plist->length == 0) {
 		rtrs_err(s, "Invalid RDMA-Write sg list length 0\n");
 		return -EINVAL;
 	}
@@ -321,7 +321,7 @@ static int rdma_write_sg(struct rtrs_srv_op *id)
 				      offset, DMA_BIDIRECTIONAL);
 
 	err = ib_post_send(id->con->c.qp, &id->tx_wr.wr, NULL);
-	if (unlikely(err))
+	if (err)
 		rtrs_err(s,
 			  "Posting RDMA-Write-Request to QP failed, err: %d\n",
 			  err);
@@ -361,7 +361,7 @@ static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id,
 		sg_cnt = le16_to_cpu(rd_msg->sg_cnt);
 
 		if (need_inval) {
-			if (likely(sg_cnt)) {
+			if (sg_cnt) {
 				inv_wr.wr_cqe   = &io_comp_cqe;
 				inv_wr.sg_list = NULL;
 				inv_wr.num_sge = 0;
@@ -437,7 +437,7 @@ static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id,
 	imm_wr.wr.ex.imm_data = cpu_to_be32(imm);
 
 	err = ib_post_send(id->con->c.qp, wr, NULL);
-	if (unlikely(err))
+	if (err)
 		rtrs_err_rl(s, "Posting RDMA-Reply to QP failed, err: %d\n",
 			     err);
 
@@ -494,7 +494,7 @@ bool rtrs_srv_resp_rdma(struct rtrs_srv_op *id, int status)
 
 	id->status = status;
 
-	if (unlikely(sess->state != RTRS_SRV_CONNECTED)) {
+	if (sess->state != RTRS_SRV_CONNECTED) {
 		rtrs_err_rl(s,
 			    "Sending I/O response failed,  session %s is disconnected, sess state %s\n",
 			    kobject_name(&sess->kobj),
@@ -506,8 +506,7 @@ bool rtrs_srv_resp_rdma(struct rtrs_srv_op *id, int status)
 
 		ib_update_fast_reg_key(mr->mr, ib_inc_rkey(mr->mr->rkey));
 	}
-	if (unlikely(atomic_sub_return(1,
-				       &con->c.sq_wr_avail) < 0)) {
+	if (atomic_sub_return(1, &con->c.sq_wr_avail) < 0) {
 		rtrs_err(s, "IB send queue full: sess=%s cid=%d\n",
 			 kobject_name(&sess->kobj),
 			 con->c.cid);
@@ -523,7 +522,7 @@ bool rtrs_srv_resp_rdma(struct rtrs_srv_op *id, int status)
 	else
 		err = rdma_write_sg(id);
 
-	if (unlikely(err)) {
+	if (err) {
 		rtrs_err_rl(s, "IO response failed: %d: sess=%s\n", err,
 			    kobject_name(&sess->kobj));
 		close_sess(sess);
@@ -710,7 +709,7 @@ static void rtrs_srv_info_rsp_done(struct ib_cq *cq, struct ib_wc *wc)
 	iu = container_of(wc->wr_cqe, struct rtrs_iu, cqe);
 	rtrs_iu_free(iu, sess->s.dev->ib_dev, 1);
 
-	if (unlikely(wc->status != IB_WC_SUCCESS)) {
+	if (wc->status != IB_WC_SUCCESS) {
 		rtrs_err(s, "Sess info response send failed: %s\n",
 			  ib_wc_status_msg(wc->status));
 		close_sess(sess);
@@ -807,7 +806,7 @@ static int process_info_req(struct rtrs_srv_con *con,
 	size_t tx_sz;
 
 	err = post_recv_sess(sess);
-	if (unlikely(err)) {
+	if (err) {
 		rtrs_err(s, "post_recv_sess(), err: %d\n", err);
 		return err;
 	}
@@ -820,14 +819,14 @@ static int process_info_req(struct rtrs_srv_con *con,
 	strscpy(sess->s.sessname, msg->sessname, sizeof(sess->s.sessname));
 
 	rwr = kcalloc(sess->mrs_num, sizeof(*rwr), GFP_KERNEL);
-	if (unlikely(!rwr))
+	if (!rwr)
 		return -ENOMEM;
 
 	tx_sz  = sizeof(*rsp);
 	tx_sz += sizeof(rsp->desc[0]) * sess->mrs_num;
 	tx_iu = rtrs_iu_alloc(1, tx_sz, GFP_KERNEL, sess->s.dev->ib_dev,
 			       DMA_TO_DEVICE, rtrs_srv_info_rsp_done);
-	if (unlikely(!tx_iu)) {
+	if (!tx_iu) {
 		err = -ENOMEM;
 		goto rwr_free;
 	}
@@ -859,7 +858,7 @@ static int process_info_req(struct rtrs_srv_con *con,
 	}
 
 	err = rtrs_srv_create_sess_files(sess);
-	if (unlikely(err))
+	if (err)
 		goto iu_free;
 	kobject_get(&sess->kobj);
 	get_device(&sess->srv->dev);
@@ -879,7 +878,7 @@ static int process_info_req(struct rtrs_srv_con *con,
 
 	/* Send info response */
 	err = rtrs_iu_post_send(&con->c, tx_iu, tx_sz, reg_wr);
-	if (unlikely(err)) {
+	if (err) {
 		rtrs_err(s, "rtrs_iu_post_send(), err: %d\n", err);
 iu_free:
 		rtrs_iu_free(tx_iu, sess->s.dev->ib_dev, 1);
@@ -902,14 +901,14 @@ static void rtrs_srv_info_req_done(struct ib_cq *cq, struct ib_wc *wc)
 	WARN_ON(con->c.cid);
 
 	iu = container_of(wc->wr_cqe, struct rtrs_iu, cqe);
-	if (unlikely(wc->status != IB_WC_SUCCESS)) {
+	if (wc->status != IB_WC_SUCCESS) {
 		rtrs_err(s, "Sess info request receive failed: %s\n",
 			  ib_wc_status_msg(wc->status));
 		goto close;
 	}
 	WARN_ON(wc->opcode != IB_WC_RECV);
 
-	if (unlikely(wc->byte_len < sizeof(*msg))) {
+	if (wc->byte_len < sizeof(*msg)) {
 		rtrs_err(s, "Sess info request is malformed: size %d\n",
 			  wc->byte_len);
 		goto close;
@@ -917,13 +916,13 @@ static void rtrs_srv_info_req_done(struct ib_cq *cq, struct ib_wc *wc)
 	ib_dma_sync_single_for_cpu(sess->s.dev->ib_dev, iu->dma_addr,
 				   iu->size, DMA_FROM_DEVICE);
 	msg = iu->buf;
-	if (unlikely(le16_to_cpu(msg->type) != RTRS_MSG_INFO_REQ)) {
+	if (le16_to_cpu(msg->type) != RTRS_MSG_INFO_REQ) {
 		rtrs_err(s, "Sess info request is malformed: type %d\n",
 			  le16_to_cpu(msg->type));
 		goto close;
 	}
 	err = process_info_req(con, msg);
-	if (unlikely(err))
+	if (err)
 		goto close;
 
 out:
@@ -944,11 +943,11 @@ static int post_recv_info_req(struct rtrs_srv_con *con)
 	rx_iu = rtrs_iu_alloc(1, sizeof(struct rtrs_msg_info_req),
 			       GFP_KERNEL, sess->s.dev->ib_dev,
 			       DMA_FROM_DEVICE, rtrs_srv_info_req_done);
-	if (unlikely(!rx_iu))
+	if (!rx_iu)
 		return -ENOMEM;
 	/* Prepare for getting info response */
 	err = rtrs_iu_post_recv(&con->c, rx_iu);
-	if (unlikely(err)) {
+	if (err) {
 		rtrs_err(s, "rtrs_iu_post_recv(), err: %d\n", err);
 		rtrs_iu_free(rx_iu, sess->s.dev->ib_dev, 1);
 		return err;
@@ -963,7 +962,7 @@ static int post_recv_io(struct rtrs_srv_con *con, size_t q_size)
 
 	for (i = 0; i < q_size; i++) {
 		err = rtrs_post_recv_empty(&con->c, &io_comp_cqe);
-		if (unlikely(err))
+		if (err)
 			return err;
 	}
 
@@ -984,7 +983,7 @@ static int post_recv_sess(struct rtrs_srv_sess *sess)
 			q_size = srv->queue_depth;
 
 		err = post_recv_io(to_srv_con(sess->s.con[cid]), q_size);
-		if (unlikely(err)) {
+		if (err) {
 			rtrs_err(s, "post_recv_io(), err: %d\n", err);
 			return err;
 		}
@@ -1007,13 +1006,13 @@ static void process_read(struct rtrs_srv_con *con,
 	void *data;
 	int ret;
 
-	if (unlikely(sess->state != RTRS_SRV_CONNECTED)) {
+	if (sess->state != RTRS_SRV_CONNECTED) {
 		rtrs_err_rl(s,
 			     "Processing read request failed,  session is disconnected, sess state %s\n",
 			     rtrs_srv_state_str(sess->state));
 		return;
 	}
-	if (unlikely(msg->sg_cnt != 1 && msg->sg_cnt != 0)) {
+	if (msg->sg_cnt != 1 && msg->sg_cnt != 0) {
 		rtrs_err_rl(s,
 			    "Processing read request failed, invalid message\n");
 		return;
@@ -1031,7 +1030,7 @@ static void process_read(struct rtrs_srv_con *con,
 	ret = ctx->ops.rdma_ev(srv->priv, id, READ, data, data_len,
 			   data + data_len, usr_len);
 
-	if (unlikely(ret)) {
+	if (ret) {
 		rtrs_err_rl(s,
 			     "Processing read request failed, user module cb reported for msg_id %d, err: %d\n",
 			     buf_id, ret);
@@ -1065,7 +1064,7 @@ static void process_write(struct rtrs_srv_con *con,
 	void *data;
 	int ret;
 
-	if (unlikely(sess->state != RTRS_SRV_CONNECTED)) {
+	if (sess->state != RTRS_SRV_CONNECTED) {
 		rtrs_err_rl(s,
 			     "Processing write request failed,  session is disconnected, sess state %s\n",
 			     rtrs_srv_state_str(sess->state));
@@ -1082,8 +1081,8 @@ static void process_write(struct rtrs_srv_con *con,
 	data_len = off - usr_len;
 	data = page_address(srv->chunks[buf_id]);
 	ret = ctx->ops.rdma_ev(srv->priv, id, WRITE, data, data_len,
-			   data + data_len, usr_len);
-	if (unlikely(ret)) {
+			       data + data_len, usr_len);
+	if (ret) {
 		rtrs_err_rl(s,
 			     "Processing write request failed, user module callback reports err: %d\n",
 			     ret);
@@ -1147,7 +1146,7 @@ static void rtrs_srv_inv_rkey_done(struct ib_cq *cq, struct ib_wc *wc)
 	u32 msg_id, off;
 	void *data;
 
-	if (unlikely(wc->status != IB_WC_SUCCESS)) {
+	if (wc->status != IB_WC_SUCCESS) {
 		rtrs_err(s, "Failed IB_WR_LOCAL_INV: %s\n",
 			  ib_wc_status_msg(wc->status));
 		close_sess(sess);
@@ -1204,7 +1203,7 @@ static void rtrs_srv_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
 	u32 imm_type, imm_payload;
 	int err;
 
-	if (unlikely(wc->status != IB_WC_SUCCESS)) {
+	if (wc->status != IB_WC_SUCCESS) {
 		if (wc->status != IB_WC_WR_FLUSH_ERR) {
 			rtrs_err(s,
 				  "%s (wr_cqe: %p, type: %d, vendor_err: 0x%x, len: %u)\n",
@@ -1224,21 +1223,20 @@ static void rtrs_srv_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
 		if (WARN_ON(wc->wr_cqe != &io_comp_cqe))
 			return;
 		err = rtrs_post_recv_empty(&con->c, &io_comp_cqe);
-		if (unlikely(err)) {
+		if (err) {
 			rtrs_err(s, "rtrs_post_recv(), err: %d\n", err);
 			close_sess(sess);
 			break;
 		}
 		rtrs_from_imm(be32_to_cpu(wc->ex.imm_data),
 			       &imm_type, &imm_payload);
-		if (likely(imm_type == RTRS_IO_REQ_IMM)) {
+		if (imm_type == RTRS_IO_REQ_IMM) {
 			u32 msg_id, off;
 			void *data;
 
 			msg_id = imm_payload >> sess->mem_bits;
 			off = imm_payload & ((1 << sess->mem_bits) - 1);
-			if (unlikely(msg_id >= srv->queue_depth ||
-				     off >= max_chunk_size)) {
+			if (msg_id >= srv->queue_depth || off >= max_chunk_size) {
 				rtrs_err(s, "Wrong msg_id %u, off %u\n",
 					  msg_id, off);
 				close_sess(sess);
@@ -1250,7 +1248,7 @@ static void rtrs_srv_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
 				mr->msg_off = off;
 				mr->msg_id = msg_id;
 				err = rtrs_srv_inv_rkey(con, mr);
-				if (unlikely(err)) {
+				if (err) {
 					rtrs_err(s, "rtrs_post_recv(), err: %d\n",
 						  err);
 					close_sess(sess);
@@ -1278,7 +1276,7 @@ static void rtrs_srv_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
 		 */
 		atomic_add(s->signal_interval, &con->c.sq_wr_avail);
 
-		if (unlikely(!list_empty_careful(&con->rsp_wr_wait_list)))
+		if (!list_empty_careful(&con->rsp_wr_wait_list))
 			rtrs_rdma_process_wr_wait_list(con);
 
 		break;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH for-next 08/10] RDMA/rtrs-clt: Fix counting inflight IO
  2021-07-30 13:18 [PATCH for-next 00/10] Misc update for RTRS Jack Wang
                   ` (6 preceding siblings ...)
  2021-07-30 13:18 ` [PATCH for-next 07/10] RDMA/rtrs: Remove all likely and unlikely Jack Wang
@ 2021-07-30 13:18 ` Jack Wang
  2021-08-02  7:22   ` Leon Romanovsky
  2021-07-30 13:18 ` [PATCH for-next 09/10] RDMA/rtrs: Add support to disable an IB port on the storage side Jack Wang
  2021-07-30 13:18 ` [PATCH for-next 10/10] RDMA/rtrs: remove (void) casting for functions Jack Wang
  9 siblings, 1 reply; 33+ messages in thread
From: Jack Wang @ 2021-07-30 13:18 UTC (permalink / raw)
  To: linux-rdma
  Cc: bvanassche, leon, dledford, jgg, haris.iqbal, jinpu.wang, Gioh Kim

From: Gioh Kim <gi-oh.kim@ionos.com>

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.

Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
---
 drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c | 2 +-
 drivers/infiniband/ulp/rtrs/rtrs-clt.c       | 7 ++++---
 drivers/infiniband/ulp/rtrs/rtrs-clt.h       | 1 +
 3 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c b/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
index 4f1980a3608a..61d5e0018392 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
@@ -174,7 +174,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);
 }
 
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
index 3cf7118a1c00..5cce727abca0 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
@@ -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)
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.h b/drivers/infiniband/ulp/rtrs/rtrs-clt.h
index c31f920e6d10..6d81aae53df4 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.h
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.h
@@ -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;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH for-next 09/10] RDMA/rtrs: Add support to disable an IB port on the storage side
  2021-07-30 13:18 [PATCH for-next 00/10] Misc update for RTRS Jack Wang
                   ` (7 preceding siblings ...)
  2021-07-30 13:18 ` [PATCH for-next 08/10] RDMA/rtrs-clt: Fix counting inflight IO Jack Wang
@ 2021-07-30 13:18 ` Jack Wang
  2021-08-02  7:29   ` Leon Romanovsky
  2021-07-30 13:18 ` [PATCH for-next 10/10] RDMA/rtrs: remove (void) casting for functions Jack Wang
  9 siblings, 1 reply; 33+ messages in thread
From: Jack Wang @ 2021-07-30 13:18 UTC (permalink / raw)
  To: linux-rdma
  Cc: bvanassche, leon, dledford, jgg, haris.iqbal, jinpu.wang,
	Md Haris Iqbal, Gioh Kim

From: Md Haris Iqbal <haris.iqbal@cloud.ionos.com>

This commit adds support to reject connection on a specific IB port which
can be specified in the added sysfs entry for the rtrs-server module.

Example,

$ echo "mlx4_0 1" > /sys/class/rtrs-server/ctl/disable_port

When a connection request is received on the above IB port, rtrs_srv
rejects the connection and notifies the client to disable reconnection
attempts. A manual reconnect has to be triggerred in such a case.

A manual reconnect can be triggered by doing the following,

echo 1 > /sys/class/rtrs-client/blya/paths/<select-path>/reconnect

Signed-off-by: Md Haris Iqbal <haris.iqbal@cloud.ionos.com>
Reviewed-by: Gioh Kim <gi-oh.kim@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
---
 drivers/infiniband/ulp/rtrs/rtrs-clt.c | 10 ++++
 drivers/infiniband/ulp/rtrs/rtrs-srv.c | 82 +++++++++++++++++++++++++-
 2 files changed, 90 insertions(+), 2 deletions(-)

diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
index 5cce727abca0..21001818e607 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
@@ -1898,6 +1898,7 @@ static int rtrs_rdma_conn_rejected(struct rtrs_clt_con *con,
 				    struct rdma_cm_event *ev)
 {
 	struct rtrs_sess *s = con->c.sess;
+	struct rtrs_clt_sess *sess = to_clt_sess(s);
 	const struct rtrs_msg_conn_rsp *msg;
 	const char *rej_msg;
 	int status, errno;
@@ -1916,6 +1917,15 @@ static int rtrs_rdma_conn_rejected(struct rtrs_clt_con *con,
 			rtrs_err(s,
 				  "Connect rejected: status %d (%s), rtrs errno %d\n",
 				  status, rej_msg, errno);
+
+		if (errno == -ENETDOWN) {
+			/*
+			 * Stop reconnection attempts
+			 */
+			sess->reconnect_attempts = -1;
+			rtrs_err(s,
+				"Disabling auto-reconnect. Trigger a manual reconnect after issue is resolved\n");
+		}
 	} else {
 		rtrs_err(s,
 			  "Connect rejected but with malformed message: status %d (%s)\n",
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
index cc65cffdc65a..90d833041ccf 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
@@ -32,7 +32,9 @@ MODULE_LICENSE("GPL");
 static struct rtrs_rdma_dev_pd dev_pd;
 static mempool_t *chunk_pool;
 struct class *rtrs_dev_class;
+static struct device *rtrs_dev;
 static struct rtrs_srv_ib_ctx ib_ctx;
+static char disabled_port[NAME_MAX];
 
 static int __read_mostly max_chunk_size = DEFAULT_MAX_CHUNK_SIZE;
 static int __read_mostly sess_queue_depth = DEFAULT_SESS_QUEUE_DEPTH;
@@ -1826,6 +1828,20 @@ static int rtrs_rdma_connect(struct rdma_cm_id *cm_id,
 	u16 recon_cnt;
 	int err = -ECONNRESET;
 
+	if (strnlen(disabled_port, NAME_MAX) > 0) {
+		char ib_device[NAME_MAX];
+
+		snprintf(ib_device, NAME_MAX, "%s %u", cm_id->device->name, cm_id->port_num);
+		if (strncmp(disabled_port, ib_device, NAME_MAX) == 0) {
+			/*
+			 * Reject connection attempt on disabled port
+			 */
+			pr_err("Error: Connection request on a disabled port");
+			err = -ENETDOWN;
+			goto reject_w_err;
+		}
+	}
+
 	if (len < sizeof(*msg)) {
 		pr_err("Invalid RTRS connection request\n");
 		goto reject_w_err;
@@ -2242,6 +2258,56 @@ static int check_module_params(void)
 	return 0;
 }
 
+static ssize_t disable_port_show(struct kobject *kobj,
+				 struct kobj_attribute *attr,
+				 char *page)
+{
+	return sysfs_emit(page, "%s\n", disabled_port);
+}
+
+static ssize_t disable_port_store(struct kobject *kobj,
+				  struct kobj_attribute *attr,
+				  const char *buf, size_t count)
+{
+	int ret, len;
+
+	if (count > 1 && strnlen(disabled_port, NAME_MAX) > 0) {
+		pr_err("A disabled port already exists.\n");
+		return -EINVAL;
+	}
+
+	ret = strscpy(disabled_port, buf, NAME_MAX);
+	if (ret == -E2BIG) {
+		pr_err("String too big.\n");
+		disabled_port[0] = '\0';
+		return ret;
+	}
+
+	len = strlen(disabled_port);
+	if (len > 0 && disabled_port[len-1] == '\n')
+		disabled_port[len-1] = '\0';
+
+	return ret;
+}
+
+static struct kobj_attribute rtrs_srv_disable_port_device_attr =
+	__ATTR(disable_port, 0644,
+	       disable_port_show, disable_port_store);
+
+static struct attribute *default_attrs[] = {
+	&rtrs_srv_disable_port_device_attr.attr,
+	NULL,
+};
+
+static struct attribute_group default_attr_group = {
+	.attrs = default_attrs,
+};
+
+static const struct attribute_group *default_attr_groups[] = {
+	&default_attr_group,
+	NULL,
+};
+
 static int __init rtrs_server_init(void)
 {
 	int err;
@@ -2268,15 +2334,26 @@ static int __init rtrs_server_init(void)
 		err = PTR_ERR(rtrs_dev_class);
 		goto out_chunk_pool;
 	}
+
+	rtrs_dev = device_create_with_groups(rtrs_dev_class, NULL,
+					      MKDEV(0, 0), NULL,
+					      default_attr_groups, "ctl");
+	if (IS_ERR(rtrs_dev)) {
+		err = PTR_ERR(rtrs_dev);
+		goto out_class;
+	}
+
 	rtrs_wq = alloc_workqueue("rtrs_server_wq", 0, 0);
 	if (!rtrs_wq) {
 		err = -ENOMEM;
-		goto out_dev_class;
+		goto out_dev;
 	}
 
 	return 0;
 
-out_dev_class:
+out_dev:
+	device_destroy(rtrs_dev_class, MKDEV(0, 0));
+out_class:
 	class_destroy(rtrs_dev_class);
 out_chunk_pool:
 	mempool_destroy(chunk_pool);
@@ -2287,6 +2364,7 @@ static int __init rtrs_server_init(void)
 static void __exit rtrs_server_exit(void)
 {
 	destroy_workqueue(rtrs_wq);
+	device_destroy(rtrs_dev_class, MKDEV(0, 0));
 	class_destroy(rtrs_dev_class);
 	mempool_destroy(chunk_pool);
 	rtrs_rdma_dev_pd_deinit(&dev_pd);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH for-next 10/10] RDMA/rtrs: remove (void) casting for functions
  2021-07-30 13:18 [PATCH for-next 00/10] Misc update for RTRS Jack Wang
                   ` (8 preceding siblings ...)
  2021-07-30 13:18 ` [PATCH for-next 09/10] RDMA/rtrs: Add support to disable an IB port on the storage side Jack Wang
@ 2021-07-30 13:18 ` Jack Wang
  2021-08-02  7:32   ` Leon Romanovsky
  9 siblings, 1 reply; 33+ messages in thread
From: Jack Wang @ 2021-07-30 13:18 UTC (permalink / raw)
  To: linux-rdma
  Cc: bvanassche, leon, dledford, jgg, haris.iqbal, jinpu.wang, Gioh Kim

From: Gioh Kim <gi-oh.kim@ionos.com>

As recommended by Leon
https://www.spinics.net/lists/linux-rdma/msg102200.html
this patch removes (void) casting because that does nothing.

Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
Reviewed-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
---
 drivers/infiniband/ulp/rtrs/rtrs-srv.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
index 90d833041ccf..7d6df83eb636 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
@@ -1918,7 +1918,7 @@ static int rtrs_rdma_connect(struct rdma_cm_id *cm_id,
 	err = create_con(sess, cm_id, cid);
 	if (err) {
 		rtrs_err((&sess->s), "create_con(), error %d\n", err);
-		(void)rtrs_rdma_do_reject(cm_id, err);
+		rtrs_rdma_do_reject(cm_id, err);
 		/*
 		 * Since session has other connections we follow normal way
 		 * through workqueue, but still return an error to tell cma.c
@@ -1929,7 +1929,7 @@ static int rtrs_rdma_connect(struct rdma_cm_id *cm_id,
 	err = rtrs_rdma_do_accept(sess, cm_id);
 	if (err) {
 		rtrs_err((&sess->s), "rtrs_rdma_do_accept(), error %d\n", err);
-		(void)rtrs_rdma_do_reject(cm_id, err);
+		rtrs_rdma_do_reject(cm_id, err);
 		/*
 		 * Since current connection was successfully added to the
 		 * session we follow normal way through workqueue to close the
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 01/10] RDMA/rtrs-clt: During add_path change for_new_clt according to path_num
  2021-07-30 13:18 ` [PATCH for-next 01/10] RDMA/rtrs-clt: During add_path change for_new_clt according to path_num Jack Wang
@ 2021-08-02  6:40   ` Leon Romanovsky
  2021-08-02 14:17     ` Haris Iqbal
  0 siblings, 1 reply; 33+ messages in thread
From: Leon Romanovsky @ 2021-08-02  6:40 UTC (permalink / raw)
  To: Jack Wang; +Cc: linux-rdma, bvanassche, dledford, jgg, haris.iqbal

On Fri, Jul 30, 2021 at 03:18:23PM +0200, Jack Wang wrote:
> From: Md Haris Iqbal <haris.iqbal@ionos.com>
> 
> When all the paths are removed for a session, the addition of the first
> path is like a new session for the storage server.
> 
> Hence, for_new_clt has to be set to 1.
> 
> Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
> Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> ---
>  drivers/infiniband/ulp/rtrs/rtrs-clt.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
> index ece3205531b8..e048bfa12755 100644
> --- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
> +++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
> @@ -3083,6 +3083,15 @@ int rtrs_clt_create_path_from_sysfs(struct rtrs_clt *clt,
>  	if (IS_ERR(sess))
>  		return PTR_ERR(sess);
>  
> +	if (clt->paths_num == 0) {

Don't you need some protection to read paths_num?
rcu_read_lock() or mutex_lock?

Thanks

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 02/10] RDMA/rtrs-srv: Prevent sysfs error with path name "ctl"
  2021-07-30 13:18 ` [PATCH for-next 02/10] RDMA/rtrs-srv: Prevent sysfs error with path name "ctl" Jack Wang
@ 2021-08-02  6:47   ` Leon Romanovsky
  2021-08-02 14:24     ` Haris Iqbal
  0 siblings, 1 reply; 33+ messages in thread
From: Leon Romanovsky @ 2021-08-02  6:47 UTC (permalink / raw)
  To: Jack Wang; +Cc: linux-rdma, bvanassche, dledford, jgg, haris.iqbal, Gioh Kim

On Fri, Jul 30, 2021 at 03:18:24PM +0200, Jack Wang wrote:
> From: Gioh Kim <gi-oh.kim@ionos.com>
> 
> If the client tries to create a path with name "ctl",
> the server tries to creates /sys/devices/virtual/rtrs-server/ctl/.
> Then server generated below error because there is already ctl directory
> which manages some setup of the server.
> 
> sysfs: cannot create duplicate filename '/devices/virtual/rtrs-server/ctl'
> Workqueue: ib-comp-wq ib_cq_poll_work [ib_core]
> Call Trace:
> dump_stack+0x50/0x63
> sysfs_warn_dup.cold+0x17/0x24
> sysfs_create_dir_ns+0xb6/0xd0
> kobject_add_internal+0xa6/0x2a0
> kobject_add+0x7e/0xb0
> ? _cond_resched+0x15/0x30
> device_add+0x121/0x640
> rtrs_srv_create_sess_files+0x18f/0x1f0 [rtrs_server]
> ? __alloc_pages_nodemask+0x16c/0x2b0
> ? kmalloc_order+0x7c/0x90
> ? kmalloc_order_trace+0x1d/0xa0
> ? rtrs_iu_alloc+0x17e/0x1bf [rtrs_core]
> rtrs_srv_info_req_done+0x417/0x5b0 [rtrs_server]
> ? __switch_to_asm+0x40/0x70
> __ib_process_cq+0x76/0xd0 [ib_core]
> ib_cq_poll_work+0x26/0x80 [ib_core]
> process_one_work+0x1df/0x3a0
> worker_thread+0x4a/0x3c0
> kthread+0xfb/0x130
> ? process_one_work+0x3a0/0x3a0
> ? kthread_park+0x90/0x90
> ret_from_fork+0x1f/0x40
> kobject_add_internal failed for ctl with -EEXIST, don't try to register things with the same name in the same directory.
> rtrs_server L178: device_add(): -17
> 
> This patch checks the path name and disconnect on server to prevent
> the kernel error.
> 
> Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
> Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> ---
>  drivers/infiniband/ulp/rtrs/rtrs-srv.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
> index cd9a4ccf4c28..b814a6052cf1 100644
> --- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
> +++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
> @@ -758,6 +758,14 @@ static bool exist_sessname(struct rtrs_srv_ctx *ctx,
>  	struct rtrs_srv_sess *sess;
>  	bool found = false;
>  
> +	/*
> +	 * Session name "ct" is not allowed because
> +	 * /sys/devices/virtual/rtrs-server/ctl already exists
> +	 * for setup management.
> +	 */
> +	if (!strcmp(sessname, "ctl"))
> +		return true;

Why does it have special treatment?
And what will happen if user supplies "." or ".."?
Does rtrs receive this session name from the other side in the network?

Thanks

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 03/10] RDMA/rtrs: Use sysfs_emit instead of s*printf function for sysfs show
  2021-07-30 13:18 ` [PATCH for-next 03/10] RDMA/rtrs: Use sysfs_emit instead of s*printf function for sysfs show Jack Wang
@ 2021-08-02  6:52   ` Leon Romanovsky
  2021-08-02 14:18     ` Haris Iqbal
  0 siblings, 1 reply; 33+ messages in thread
From: Leon Romanovsky @ 2021-08-02  6:52 UTC (permalink / raw)
  To: Jack Wang; +Cc: linux-rdma, bvanassche, dledford, jgg, haris.iqbal

On Fri, Jul 30, 2021 at 03:18:25PM +0200, Jack Wang wrote:
> From: Md Haris Iqbal <haris.iqbal@ionos.com>
> 
> sysfs_emit function was added to be aware of the PAGE_SIZE maximum of
> the temporary buffer used for outputting sysfs content, so there is no
> possible overruns. So replace the uses of any s*printf functions for
> the sysfs show functions with sysfs_emit.
> 
> Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
> Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> ---
>  drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c | 24 +++++++++-----------
>  drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c |  2 +-
>  2 files changed, 12 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c b/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
> index 26bbe5d6dff5..c5c047aa45a4 100644
> --- a/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
> +++ b/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
> @@ -45,24 +45,23 @@ int rtrs_clt_stats_migration_cnt_to_str(struct rtrs_clt_stats *stats,
>  	size_t used;
>  	int cpu;
>  
> -	used = scnprintf(buf, len, "    ");
> +	used = sysfs_emit(buf, "    ");
>  	for_each_possible_cpu(cpu)
> -		used += scnprintf(buf + used, len - used, " CPU%u", cpu);
> +		used += sysfs_emit_at(buf, used, " CPU%u", cpu);
>  
> -	used += scnprintf(buf + used, len - used, "\nfrom:");
> +	used += sysfs_emit_at(buf, used, "\nfrom:");

"\nfrom" and "\nto" are abuse of sysfs rules.
https://lore.kernel.org/kernelnewbies/7a353c64-a81f-a149-9541-ef328a197761@gmail.com/T/#m8bf898fcdb4a5371781bbc9646993a50fa950fbc
https://lore.kernel.org/kernelnewbies/7a353c64-a81f-a149-9541-ef328a197761@gmail.com/T/#m9ce6f045a863597922012d71a6719d6d90c8e0a6

Thanks

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 04/10] RDMA/rtrs: Remove unused functions
  2021-07-30 13:18 ` [PATCH for-next 04/10] RDMA/rtrs: Remove unused functions Jack Wang
@ 2021-08-02  6:53   ` Leon Romanovsky
  0 siblings, 0 replies; 33+ messages in thread
From: Leon Romanovsky @ 2021-08-02  6:53 UTC (permalink / raw)
  To: Jack Wang; +Cc: linux-rdma, bvanassche, dledford, jgg, haris.iqbal

On Fri, Jul 30, 2021 at 03:18:26PM +0200, Jack Wang wrote:
> The two functions are unused, so just remove them.
> 
> Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> Reviewed-by: Md Haris Iqbal <haris.iqbal@ionos.com>
> ---
>  drivers/infiniband/ulp/rtrs/rtrs-clt.h | 5 +----
>  drivers/infiniband/ulp/rtrs/rtrs-srv.h | 4 ----
>  2 files changed, 1 insertion(+), 8 deletions(-)
> 

Thanks,
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 05/10] RDMA/rtrs: Fix warning when use poll mode
  2021-07-30 13:18 ` [PATCH for-next 05/10] RDMA/rtrs: Fix warning when use poll mode Jack Wang
@ 2021-08-02  7:06   ` Leon Romanovsky
  2021-08-02 14:18     ` Haris Iqbal
  0 siblings, 1 reply; 33+ messages in thread
From: Leon Romanovsky @ 2021-08-02  7:06 UTC (permalink / raw)
  To: Jack Wang; +Cc: linux-rdma, bvanassche, dledford, jgg, haris.iqbal, Gioh Kim

On Fri, Jul 30, 2021 at 03:18:27PM +0200, Jack Wang wrote:
> when test with poll mode, it will fail and lead to warning below:
> echo "sessname=bla path=gid:fe80::2:c903:4e:d0b3@gid:fe80::2:c903:8:ca17
> device_path=/dev/nullb2 nr_poll_queues=-1" |
> sudo tee /sys/devices/virtual/rnbd-client/ctl/map_device
> 
> rnbd_client L597: Mapping device /dev/nullb2 on session bla,
> (access_mode: rw, nr_poll_queues: 8)
> WARNING: CPU: 3 PID: 9886 at drivers/infiniband/core/cq.c:447 ib_cq_pool_get+0x26f/0x2a0 [ib_core]
> 
> The problem is in case of poll queue, we need to still call
> ib_alloc_cq/ib_free_cq, we can't use cq_poll api for poll queue.

It will be great to see an explanation here.

Thanks

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 06/10] RDMA/rtrs: Remove len parameter from helper print functions of sysfs
  2021-07-30 13:18 ` [PATCH for-next 06/10] RDMA/rtrs: Remove len parameter from helper print functions of sysfs Jack Wang
@ 2021-08-02  7:08   ` Leon Romanovsky
  2021-08-02 14:34     ` Haris Iqbal
  0 siblings, 1 reply; 33+ messages in thread
From: Leon Romanovsky @ 2021-08-02  7:08 UTC (permalink / raw)
  To: Jack Wang; +Cc: linux-rdma, bvanassche, dledford, jgg, haris.iqbal

On Fri, Jul 30, 2021 at 03:18:28PM +0200, Jack Wang wrote:
> From: Md Haris Iqbal <haris.iqbal@ionos.com>
> 
> Since we have changed all sysfs show functions to use sysfs_emit, we do
> not require the len (PAGE_SIZE) in our helper print functions. So remove
> it from the function parameter.
> 
> Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
> Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> ---
>  drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c | 12 ++++--------
>  drivers/infiniband/ulp/rtrs/rtrs-clt.h       | 12 +++++-------
>  drivers/infiniband/ulp/rtrs/rtrs-pri.h       |  2 +-
>  drivers/infiniband/ulp/rtrs/rtrs-srv-stats.c |  3 +--
>  drivers/infiniband/ulp/rtrs/rtrs-srv.h       |  3 +--
>  5 files changed, 12 insertions(+), 20 deletions(-)

I suggest to squash this patch to the one mentioned in the commit message.

Thanks

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 07/10] RDMA/rtrs: Remove all likely and unlikely
  2021-07-30 13:18 ` [PATCH for-next 07/10] RDMA/rtrs: Remove all likely and unlikely Jack Wang
@ 2021-08-02  7:10   ` Leon Romanovsky
  0 siblings, 0 replies; 33+ messages in thread
From: Leon Romanovsky @ 2021-08-02  7:10 UTC (permalink / raw)
  To: Jack Wang; +Cc: linux-rdma, bvanassche, dledford, jgg, haris.iqbal, Gioh Kim

On Fri, Jul 30, 2021 at 03:18:29PM +0200, Jack Wang wrote:
> From: Gioh Kim <gi-oh.kim@ionos.com>
> 
> The IO performance test with fio after swapping the likely
> and unlikely macros in all if-statement shows no difference.
> They do not help for the performance of rtrs.
> 
> Thanks to Haakon Bugge for the test scenario.
> 
> The fio test did random read on 32 rnbd devices and 64 processes.
> Test environment:
> - Intel(R) Xeon(R) Gold 6130 CPU @ 2.10GHz
> - 376G memory
> - kernel version: 5.4.86
> - gcc version: gcc (Debian 8.3.0-6) 8.3.0
> - Infiniband controller: Mellanox Technologies MT27800 Family
> [ConnectX-5]
> 
> Test result:
> - before swapping:       IOPS=829k, BW=3239MiB/s
> - after swapping:        IOPS=829k, BW=3238MiB/s
> - remove all (un)likely: IOPS=829k, BW=3238MiB/s
> 
> Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
> Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> ---
>  drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c |   2 +-
>  drivers/infiniband/ulp/rtrs/rtrs-clt.c       | 126 +++++++++----------
>  drivers/infiniband/ulp/rtrs/rtrs-srv.c       |  74 ++++++-----
>  3 files changed, 99 insertions(+), 103 deletions(-)
> 

Thanks a lot,
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 08/10] RDMA/rtrs-clt: Fix counting inflight IO
  2021-07-30 13:18 ` [PATCH for-next 08/10] RDMA/rtrs-clt: Fix counting inflight IO Jack Wang
@ 2021-08-02  7:22   ` Leon Romanovsky
  0 siblings, 0 replies; 33+ messages in thread
From: Leon Romanovsky @ 2021-08-02  7:22 UTC (permalink / raw)
  To: Jack Wang; +Cc: linux-rdma, bvanassche, dledford, jgg, haris.iqbal, Gioh Kim

On Fri, Jul 30, 2021 at 03:18:30PM +0200, Jack Wang wrote:
> From: Gioh Kim <gi-oh.kim@ionos.com>
> 
> 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.
> 
> Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
> Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> ---
>  drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c | 2 +-
>  drivers/infiniband/ulp/rtrs/rtrs-clt.c       | 7 ++++---
>  drivers/infiniband/ulp/rtrs/rtrs-clt.h       | 1 +
>  3 files changed, 6 insertions(+), 4 deletions(-)
> 

Thanks,
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 09/10] RDMA/rtrs: Add support to disable an IB port on the storage side
  2021-07-30 13:18 ` [PATCH for-next 09/10] RDMA/rtrs: Add support to disable an IB port on the storage side Jack Wang
@ 2021-08-02  7:29   ` Leon Romanovsky
  2021-08-02 14:31     ` Haris Iqbal
  0 siblings, 1 reply; 33+ messages in thread
From: Leon Romanovsky @ 2021-08-02  7:29 UTC (permalink / raw)
  To: Jack Wang
  Cc: linux-rdma, bvanassche, dledford, jgg, haris.iqbal,
	Md Haris Iqbal, Gioh Kim

On Fri, Jul 30, 2021 at 03:18:31PM +0200, Jack Wang wrote:
> From: Md Haris Iqbal <haris.iqbal@cloud.ionos.com>
> 
> This commit adds support to reject connection on a specific IB port which
> can be specified in the added sysfs entry for the rtrs-server module.
> 
> Example,
> 
> $ echo "mlx4_0 1" > /sys/class/rtrs-server/ctl/disable_port
> 
> When a connection request is received on the above IB port, rtrs_srv
> rejects the connection and notifies the client to disable reconnection
> attempts. A manual reconnect has to be triggerred in such a case.
> 
> A manual reconnect can be triggered by doing the following,
> 
> echo 1 > /sys/class/rtrs-client/blya/paths/<select-path>/reconnect
> 
> Signed-off-by: Md Haris Iqbal <haris.iqbal@cloud.ionos.com>
> Reviewed-by: Gioh Kim <gi-oh.kim@ionos.com>
> Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> ---
>  drivers/infiniband/ulp/rtrs/rtrs-clt.c | 10 ++++
>  drivers/infiniband/ulp/rtrs/rtrs-srv.c | 82 +++++++++++++++++++++++++-
>  2 files changed, 90 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
> index 5cce727abca0..21001818e607 100644
> --- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
> +++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
> @@ -1898,6 +1898,7 @@ static int rtrs_rdma_conn_rejected(struct rtrs_clt_con *con,
>  				    struct rdma_cm_event *ev)
>  {
>  	struct rtrs_sess *s = con->c.sess;
> +	struct rtrs_clt_sess *sess = to_clt_sess(s);
>  	const struct rtrs_msg_conn_rsp *msg;
>  	const char *rej_msg;
>  	int status, errno;
> @@ -1916,6 +1917,15 @@ static int rtrs_rdma_conn_rejected(struct rtrs_clt_con *con,
>  			rtrs_err(s,
>  				  "Connect rejected: status %d (%s), rtrs errno %d\n",
>  				  status, rej_msg, errno);
> +
> +		if (errno == -ENETDOWN) {
> +			/*
> +			 * Stop reconnection attempts
> +			 */
> +			sess->reconnect_attempts = -1;
> +			rtrs_err(s,
> +				"Disabling auto-reconnect. Trigger a manual reconnect after issue is resolved\n");
> +		}
>  	} else {
>  		rtrs_err(s,
>  			  "Connect rejected but with malformed message: status %d (%s)\n",
> diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
> index cc65cffdc65a..90d833041ccf 100644
> --- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
> +++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
> @@ -32,7 +32,9 @@ MODULE_LICENSE("GPL");
>  static struct rtrs_rdma_dev_pd dev_pd;
>  static mempool_t *chunk_pool;
>  struct class *rtrs_dev_class;
> +static struct device *rtrs_dev;
>  static struct rtrs_srv_ib_ctx ib_ctx;
> +static char disabled_port[NAME_MAX];
>  
>  static int __read_mostly max_chunk_size = DEFAULT_MAX_CHUNK_SIZE;
>  static int __read_mostly sess_queue_depth = DEFAULT_SESS_QUEUE_DEPTH;
> @@ -1826,6 +1828,20 @@ static int rtrs_rdma_connect(struct rdma_cm_id *cm_id,
>  	u16 recon_cnt;
>  	int err = -ECONNRESET;
>  
> +	if (strnlen(disabled_port, NAME_MAX) > 0) {
> +		char ib_device[NAME_MAX];
> +
> +		snprintf(ib_device, NAME_MAX, "%s %u", cm_id->device->name, cm_id->port_num);
> +		if (strncmp(disabled_port, ib_device, NAME_MAX) == 0) {
> +			/*
> +			 * Reject connection attempt on disabled port
> +			 */
> +			pr_err("Error: Connection request on a disabled port");
> +			err = -ENETDOWN;
> +			goto reject_w_err;
> +		}
> +	}
> +
>  	if (len < sizeof(*msg)) {
>  		pr_err("Invalid RTRS connection request\n");
>  		goto reject_w_err;
> @@ -2242,6 +2258,56 @@ static int check_module_params(void)
>  	return 0;
>  }
>  
> +static ssize_t disable_port_show(struct kobject *kobj,
> +				 struct kobj_attribute *attr,
> +				 char *page)
> +{
> +	return sysfs_emit(page, "%s\n", disabled_port);
> +}
> +
> +static ssize_t disable_port_store(struct kobject *kobj,
> +				  struct kobj_attribute *attr,
> +				  const char *buf, size_t count)
> +{
> +	int ret, len;
> +
> +	if (count > 1 && strnlen(disabled_port, NAME_MAX) > 0) {
> +		pr_err("A disabled port already exists.\n");
> +		return -EINVAL;
> +	}
> +
> +	ret = strscpy(disabled_port, buf, NAME_MAX);
> +	if (ret == -E2BIG) {
> +		pr_err("String too big.\n");
> +		disabled_port[0] = '\0';
> +		return ret;
> +	}
> +
> +	len = strlen(disabled_port);
> +	if (len > 0 && disabled_port[len-1] == '\n')

All the "\n" checks in rtrs sysfs looks like cargo cult. You don't need
them.

And maybe Jason thinks differently, but I don't feel comfortable with
such new sysfs file at all.

Thanks

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 10/10] RDMA/rtrs: remove (void) casting for functions
  2021-07-30 13:18 ` [PATCH for-next 10/10] RDMA/rtrs: remove (void) casting for functions Jack Wang
@ 2021-08-02  7:32   ` Leon Romanovsky
  2021-08-02 14:16     ` Haris Iqbal
  0 siblings, 1 reply; 33+ messages in thread
From: Leon Romanovsky @ 2021-08-02  7:32 UTC (permalink / raw)
  To: Jack Wang; +Cc: linux-rdma, bvanassche, dledford, jgg, haris.iqbal, Gioh Kim

On Fri, Jul 30, 2021 at 03:18:32PM +0200, Jack Wang wrote:
> From: Gioh Kim <gi-oh.kim@ionos.com>
> 
> As recommended by Leon
> https://www.spinics.net/lists/linux-rdma/msg102200.html
> this patch removes (void) casting because that does nothing.
> 
> Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
> Reviewed-by: Md Haris Iqbal <haris.iqbal@ionos.com>
> Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> ---
>  drivers/infiniband/ulp/rtrs/rtrs-srv.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 

I would write the commit message differently:

------

Casting to (void) does nothing, remove them.

Link: https://www.spinics.net/lists/linux-rdma/msg102200.html
Suggested-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
Reviewed-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 10/10] RDMA/rtrs: remove (void) casting for functions
  2021-08-02  7:32   ` Leon Romanovsky
@ 2021-08-02 14:16     ` Haris Iqbal
  0 siblings, 0 replies; 33+ messages in thread
From: Haris Iqbal @ 2021-08-02 14:16 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: Jack Wang, RDMA mailing list, Bart Van Assche, Doug Ledford,
	Jason Gunthorpe, Gioh Kim

On Mon, Aug 2, 2021 at 9:33 AM Leon Romanovsky <leon@kernel.org> wrote:
>
> On Fri, Jul 30, 2021 at 03:18:32PM +0200, Jack Wang wrote:
> > From: Gioh Kim <gi-oh.kim@ionos.com>
> >
> > As recommended by Leon
> > https://www.spinics.net/lists/linux-rdma/msg102200.html
> > this patch removes (void) casting because that does nothing.
> >
> > Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
> > Reviewed-by: Md Haris Iqbal <haris.iqbal@ionos.com>
> > Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> > ---
> >  drivers/infiniband/ulp/rtrs/rtrs-srv.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> >
>
> I would write the commit message differently:
>
> ------
>
> Casting to (void) does nothing, remove them.
>
> Link: https://www.spinics.net/lists/linux-rdma/msg102200.html
> Suggested-by: Leon Romanovsky <leon@kernel.org>

Thanks Leon. Will change and resend.

> Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
> Reviewed-by: Md Haris Iqbal <haris.iqbal@ionos.com>
> Signed-off-by: Jack Wang <jinpu.wang@ionos.com>

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 01/10] RDMA/rtrs-clt: During add_path change for_new_clt according to path_num
  2021-08-02  6:40   ` Leon Romanovsky
@ 2021-08-02 14:17     ` Haris Iqbal
  0 siblings, 0 replies; 33+ messages in thread
From: Haris Iqbal @ 2021-08-02 14:17 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: Jack Wang, RDMA mailing list, Bart Van Assche, Doug Ledford,
	Jason Gunthorpe

On Mon, Aug 2, 2021 at 8:40 AM Leon Romanovsky <leon@kernel.org> wrote:
>
> On Fri, Jul 30, 2021 at 03:18:23PM +0200, Jack Wang wrote:
> > From: Md Haris Iqbal <haris.iqbal@ionos.com>
> >
> > When all the paths are removed for a session, the addition of the first
> > path is like a new session for the storage server.
> >
> > Hence, for_new_clt has to be set to 1.
> >
> > Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
> > Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> > ---
> >  drivers/infiniband/ulp/rtrs/rtrs-clt.c | 9 +++++++++
> >  1 file changed, 9 insertions(+)
> >
> > diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
> > index ece3205531b8..e048bfa12755 100644
> > --- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
> > +++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
> > @@ -3083,6 +3083,15 @@ int rtrs_clt_create_path_from_sysfs(struct rtrs_clt *clt,
> >       if (IS_ERR(sess))
> >               return PTR_ERR(sess);
> >
> > +     if (clt->paths_num == 0) {
>
> Don't you need some protection to read paths_num?
> rcu_read_lock() or mutex_lock?

Good catch. The lock should be added.

Thanks

>
> Thanks

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 03/10] RDMA/rtrs: Use sysfs_emit instead of s*printf function for sysfs show
  2021-08-02  6:52   ` Leon Romanovsky
@ 2021-08-02 14:18     ` Haris Iqbal
  0 siblings, 0 replies; 33+ messages in thread
From: Haris Iqbal @ 2021-08-02 14:18 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: Jack Wang, RDMA mailing list, Bart Van Assche, Doug Ledford,
	Jason Gunthorpe

On Mon, Aug 2, 2021 at 8:52 AM Leon Romanovsky <leon@kernel.org> wrote:
>
> On Fri, Jul 30, 2021 at 03:18:25PM +0200, Jack Wang wrote:
> > From: Md Haris Iqbal <haris.iqbal@ionos.com>
> >
> > sysfs_emit function was added to be aware of the PAGE_SIZE maximum of
> > the temporary buffer used for outputting sysfs content, so there is no
> > possible overruns. So replace the uses of any s*printf functions for
> > the sysfs show functions with sysfs_emit.
> >
> > Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
> > Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> > ---
> >  drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c | 24 +++++++++-----------
> >  drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c |  2 +-
> >  2 files changed, 12 insertions(+), 14 deletions(-)
> >
> > diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c b/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
> > index 26bbe5d6dff5..c5c047aa45a4 100644
> > --- a/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
> > +++ b/drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c
> > @@ -45,24 +45,23 @@ int rtrs_clt_stats_migration_cnt_to_str(struct rtrs_clt_stats *stats,
> >       size_t used;
> >       int cpu;
> >
> > -     used = scnprintf(buf, len, "    ");
> > +     used = sysfs_emit(buf, "    ");
> >       for_each_possible_cpu(cpu)
> > -             used += scnprintf(buf + used, len - used, " CPU%u", cpu);
> > +             used += sysfs_emit_at(buf, used, " CPU%u", cpu);
> >
> > -     used += scnprintf(buf + used, len - used, "\nfrom:");
> > +     used += sysfs_emit_at(buf, used, "\nfrom:");
>
> "\nfrom" and "\nto" are abuse of sysfs rules.
> https://lore.kernel.org/kernelnewbies/7a353c64-a81f-a149-9541-ef328a197761@gmail.com/T/#m8bf898fcdb4a5371781bbc9646993a50fa950fbc
> https://lore.kernel.org/kernelnewbies/7a353c64-a81f-a149-9541-ef328a197761@gmail.com/T/#m9ce6f045a863597922012d71a6719d6d90c8e0a6

I see. We will discuss internally and see what can be done about this.

Thanks

>
> Thanks

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 05/10] RDMA/rtrs: Fix warning when use poll mode
  2021-08-02  7:06   ` Leon Romanovsky
@ 2021-08-02 14:18     ` Haris Iqbal
  0 siblings, 0 replies; 33+ messages in thread
From: Haris Iqbal @ 2021-08-02 14:18 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: Jack Wang, RDMA mailing list, Bart Van Assche, Doug Ledford,
	Jason Gunthorpe, Gioh Kim

On Mon, Aug 2, 2021 at 9:07 AM Leon Romanovsky <leon@kernel.org> wrote:
>
> On Fri, Jul 30, 2021 at 03:18:27PM +0200, Jack Wang wrote:
> > when test with poll mode, it will fail and lead to warning below:
> > echo "sessname=bla path=gid:fe80::2:c903:4e:d0b3@gid:fe80::2:c903:8:ca17
> > device_path=/dev/nullb2 nr_poll_queues=-1" |
> > sudo tee /sys/devices/virtual/rnbd-client/ctl/map_device
> >
> > rnbd_client L597: Mapping device /dev/nullb2 on session bla,
> > (access_mode: rw, nr_poll_queues: 8)
> > WARNING: CPU: 3 PID: 9886 at drivers/infiniband/core/cq.c:447 ib_cq_pool_get+0x26f/0x2a0 [ib_core]
> >
> > The problem is in case of poll queue, we need to still call
> > ib_alloc_cq/ib_free_cq, we can't use cq_poll api for poll queue.
>
> It will be great to see an explanation here.

Will add and resend. Thanks

>
> Thanks

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 02/10] RDMA/rtrs-srv: Prevent sysfs error with path name "ctl"
  2021-08-02  6:47   ` Leon Romanovsky
@ 2021-08-02 14:24     ` Haris Iqbal
  2021-08-02 16:34       ` Leon Romanovsky
  0 siblings, 1 reply; 33+ messages in thread
From: Haris Iqbal @ 2021-08-02 14:24 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: Jack Wang, RDMA mailing list, Bart Van Assche, Doug Ledford,
	Jason Gunthorpe, Gioh Kim

On Mon, Aug 2, 2021 at 8:47 AM Leon Romanovsky <leon@kernel.org> wrote:
>
> On Fri, Jul 30, 2021 at 03:18:24PM +0200, Jack Wang wrote:
> > From: Gioh Kim <gi-oh.kim@ionos.com>
> >
> > If the client tries to create a path with name "ctl",
> > the server tries to creates /sys/devices/virtual/rtrs-server/ctl/.
> > Then server generated below error because there is already ctl directory
> > which manages some setup of the server.
> >
> > sysfs: cannot create duplicate filename '/devices/virtual/rtrs-server/ctl'
> > Workqueue: ib-comp-wq ib_cq_poll_work [ib_core]
> > Call Trace:
> > dump_stack+0x50/0x63
> > sysfs_warn_dup.cold+0x17/0x24
> > sysfs_create_dir_ns+0xb6/0xd0
> > kobject_add_internal+0xa6/0x2a0
> > kobject_add+0x7e/0xb0
> > ? _cond_resched+0x15/0x30
> > device_add+0x121/0x640
> > rtrs_srv_create_sess_files+0x18f/0x1f0 [rtrs_server]
> > ? __alloc_pages_nodemask+0x16c/0x2b0
> > ? kmalloc_order+0x7c/0x90
> > ? kmalloc_order_trace+0x1d/0xa0
> > ? rtrs_iu_alloc+0x17e/0x1bf [rtrs_core]
> > rtrs_srv_info_req_done+0x417/0x5b0 [rtrs_server]
> > ? __switch_to_asm+0x40/0x70
> > __ib_process_cq+0x76/0xd0 [ib_core]
> > ib_cq_poll_work+0x26/0x80 [ib_core]
> > process_one_work+0x1df/0x3a0
> > worker_thread+0x4a/0x3c0
> > kthread+0xfb/0x130
> > ? process_one_work+0x3a0/0x3a0
> > ? kthread_park+0x90/0x90
> > ret_from_fork+0x1f/0x40
> > kobject_add_internal failed for ctl with -EEXIST, don't try to register things with the same name in the same directory.
> > rtrs_server L178: device_add(): -17
> >
> > This patch checks the path name and disconnect on server to prevent
> > the kernel error.
> >
> > Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
> > Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> > ---
> >  drivers/infiniband/ulp/rtrs/rtrs-srv.c | 8 ++++++++
> >  1 file changed, 8 insertions(+)
> >
> > diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
> > index cd9a4ccf4c28..b814a6052cf1 100644
> > --- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
> > +++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
> > @@ -758,6 +758,14 @@ static bool exist_sessname(struct rtrs_srv_ctx *ctx,
> >       struct rtrs_srv_sess *sess;
> >       bool found = false;
> >
> > +     /*
> > +      * Session name "ct" is not allowed because
> > +      * /sys/devices/virtual/rtrs-server/ctl already exists
> > +      * for setup management.
> > +      */
> > +     if (!strcmp(sessname, "ctl"))
> > +             return true;
>
> Why does it have special treatment?

rtrs-server creates a folder named ctl when the module is modprob'ed.
When a session is established, a folder of the session name is created
at the same location, which would hold sysfs entries such as
clt_hostname, path details, queue_depth, etc.

Due to this conflict of names, creation of session with that name is
not possible. So this gracefully fails the connection establishment
instead of a stack trace.

> And what will happen if user supplies "." or ".."?

Weirdly enough, this succeeds. I tried, and the session creation
succeeds, and there is a hidden entry in the rtrs-server folder, but
it cannot be accessed through bash.

> Does rtrs receive this session name from the other side in the network?

Yes. This string is entered by the user while creating the session.

>
> Thanks

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 09/10] RDMA/rtrs: Add support to disable an IB port on the storage side
  2021-08-02  7:29   ` Leon Romanovsky
@ 2021-08-02 14:31     ` Haris Iqbal
  2021-08-02 16:35       ` Leon Romanovsky
  0 siblings, 1 reply; 33+ messages in thread
From: Haris Iqbal @ 2021-08-02 14:31 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: Jack Wang, RDMA mailing list, Bart Van Assche, Doug Ledford,
	Jason Gunthorpe, Md Haris Iqbal, Gioh Kim

On Mon, Aug 2, 2021 at 9:30 AM Leon Romanovsky <leon@kernel.org> wrote:
>
> On Fri, Jul 30, 2021 at 03:18:31PM +0200, Jack Wang wrote:
> > From: Md Haris Iqbal <haris.iqbal@cloud.ionos.com>
> >
> > This commit adds support to reject connection on a specific IB port which
> > can be specified in the added sysfs entry for the rtrs-server module.
> >
> > Example,
> >
> > $ echo "mlx4_0 1" > /sys/class/rtrs-server/ctl/disable_port
> >
> > When a connection request is received on the above IB port, rtrs_srv
> > rejects the connection and notifies the client to disable reconnection
> > attempts. A manual reconnect has to be triggerred in such a case.
> >
> > A manual reconnect can be triggered by doing the following,
> >
> > echo 1 > /sys/class/rtrs-client/blya/paths/<select-path>/reconnect
> >
> > Signed-off-by: Md Haris Iqbal <haris.iqbal@cloud.ionos.com>
> > Reviewed-by: Gioh Kim <gi-oh.kim@ionos.com>
> > Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> > ---
> >  drivers/infiniband/ulp/rtrs/rtrs-clt.c | 10 ++++
> >  drivers/infiniband/ulp/rtrs/rtrs-srv.c | 82 +++++++++++++++++++++++++-
> >  2 files changed, 90 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
> > index 5cce727abca0..21001818e607 100644
> > --- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
> > +++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
> > @@ -1898,6 +1898,7 @@ static int rtrs_rdma_conn_rejected(struct rtrs_clt_con *con,
> >                                   struct rdma_cm_event *ev)
> >  {
> >       struct rtrs_sess *s = con->c.sess;
> > +     struct rtrs_clt_sess *sess = to_clt_sess(s);
> >       const struct rtrs_msg_conn_rsp *msg;
> >       const char *rej_msg;
> >       int status, errno;
> > @@ -1916,6 +1917,15 @@ static int rtrs_rdma_conn_rejected(struct rtrs_clt_con *con,
> >                       rtrs_err(s,
> >                                 "Connect rejected: status %d (%s), rtrs errno %d\n",
> >                                 status, rej_msg, errno);
> > +
> > +             if (errno == -ENETDOWN) {
> > +                     /*
> > +                      * Stop reconnection attempts
> > +                      */
> > +                     sess->reconnect_attempts = -1;
> > +                     rtrs_err(s,
> > +                             "Disabling auto-reconnect. Trigger a manual reconnect after issue is resolved\n");
> > +             }
> >       } else {
> >               rtrs_err(s,
> >                         "Connect rejected but with malformed message: status %d (%s)\n",
> > diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
> > index cc65cffdc65a..90d833041ccf 100644
> > --- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
> > +++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
> > @@ -32,7 +32,9 @@ MODULE_LICENSE("GPL");
> >  static struct rtrs_rdma_dev_pd dev_pd;
> >  static mempool_t *chunk_pool;
> >  struct class *rtrs_dev_class;
> > +static struct device *rtrs_dev;
> >  static struct rtrs_srv_ib_ctx ib_ctx;
> > +static char disabled_port[NAME_MAX];
> >
> >  static int __read_mostly max_chunk_size = DEFAULT_MAX_CHUNK_SIZE;
> >  static int __read_mostly sess_queue_depth = DEFAULT_SESS_QUEUE_DEPTH;
> > @@ -1826,6 +1828,20 @@ static int rtrs_rdma_connect(struct rdma_cm_id *cm_id,
> >       u16 recon_cnt;
> >       int err = -ECONNRESET;
> >
> > +     if (strnlen(disabled_port, NAME_MAX) > 0) {
> > +             char ib_device[NAME_MAX];
> > +
> > +             snprintf(ib_device, NAME_MAX, "%s %u", cm_id->device->name, cm_id->port_num);
> > +             if (strncmp(disabled_port, ib_device, NAME_MAX) == 0) {
> > +                     /*
> > +                      * Reject connection attempt on disabled port
> > +                      */
> > +                     pr_err("Error: Connection request on a disabled port");
> > +                     err = -ENETDOWN;
> > +                     goto reject_w_err;
> > +             }
> > +     }
> > +
> >       if (len < sizeof(*msg)) {
> >               pr_err("Invalid RTRS connection request\n");
> >               goto reject_w_err;
> > @@ -2242,6 +2258,56 @@ static int check_module_params(void)
> >       return 0;
> >  }
> >
> > +static ssize_t disable_port_show(struct kobject *kobj,
> > +                              struct kobj_attribute *attr,
> > +                              char *page)
> > +{
> > +     return sysfs_emit(page, "%s\n", disabled_port);
> > +}
> > +
> > +static ssize_t disable_port_store(struct kobject *kobj,
> > +                               struct kobj_attribute *attr,
> > +                               const char *buf, size_t count)
> > +{
> > +     int ret, len;
> > +
> > +     if (count > 1 && strnlen(disabled_port, NAME_MAX) > 0) {
> > +             pr_err("A disabled port already exists.\n");
> > +             return -EINVAL;
> > +     }
> > +
> > +     ret = strscpy(disabled_port, buf, NAME_MAX);
> > +     if (ret == -E2BIG) {
> > +             pr_err("String too big.\n");
> > +             disabled_port[0] = '\0';
> > +             return ret;
> > +     }
> > +
> > +     len = strlen(disabled_port);
> > +     if (len > 0 && disabled_port[len-1] == '\n')
>
> All the "\n" checks in rtrs sysfs looks like cargo cult. You don't need
> them.

Thanks. Will change and resend.

>
> And maybe Jason thinks differently, but I don't feel comfortable with
> such new sysfs file at all.
>
> Thanks

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 06/10] RDMA/rtrs: Remove len parameter from helper print functions of sysfs
  2021-08-02  7:08   ` Leon Romanovsky
@ 2021-08-02 14:34     ` Haris Iqbal
  0 siblings, 0 replies; 33+ messages in thread
From: Haris Iqbal @ 2021-08-02 14:34 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: Jack Wang, RDMA mailing list, Bart Van Assche, Doug Ledford,
	Jason Gunthorpe

On Mon, Aug 2, 2021 at 9:09 AM Leon Romanovsky <leon@kernel.org> wrote:
>
> On Fri, Jul 30, 2021 at 03:18:28PM +0200, Jack Wang wrote:
> > From: Md Haris Iqbal <haris.iqbal@ionos.com>
> >
> > Since we have changed all sysfs show functions to use sysfs_emit, we do
> > not require the len (PAGE_SIZE) in our helper print functions. So remove
> > it from the function parameter.
> >
> > Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
> > Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> > ---
> >  drivers/infiniband/ulp/rtrs/rtrs-clt-stats.c | 12 ++++--------
> >  drivers/infiniband/ulp/rtrs/rtrs-clt.h       | 12 +++++-------
> >  drivers/infiniband/ulp/rtrs/rtrs-pri.h       |  2 +-
> >  drivers/infiniband/ulp/rtrs/rtrs-srv-stats.c |  3 +--
> >  drivers/infiniband/ulp/rtrs/rtrs-srv.h       |  3 +--
> >  5 files changed, 12 insertions(+), 20 deletions(-)
>
> I suggest to squash this patch to the one mentioned in the commit message.

The purpose of the 2 patches are different. I would prefer keeping
them separate; unless there is a clear and obvious reason NOT to do
so.

Thanks

>
> Thanks

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 02/10] RDMA/rtrs-srv: Prevent sysfs error with path name "ctl"
  2021-08-02 14:24     ` Haris Iqbal
@ 2021-08-02 16:34       ` Leon Romanovsky
  0 siblings, 0 replies; 33+ messages in thread
From: Leon Romanovsky @ 2021-08-02 16:34 UTC (permalink / raw)
  To: Haris Iqbal
  Cc: Jack Wang, RDMA mailing list, Bart Van Assche, Doug Ledford,
	Jason Gunthorpe, Gioh Kim

On Mon, Aug 02, 2021 at 04:24:39PM +0200, Haris Iqbal wrote:
> On Mon, Aug 2, 2021 at 8:47 AM Leon Romanovsky <leon@kernel.org> wrote:
> >
> > On Fri, Jul 30, 2021 at 03:18:24PM +0200, Jack Wang wrote:
> > > From: Gioh Kim <gi-oh.kim@ionos.com>
> > >
> > > If the client tries to create a path with name "ctl",
> > > the server tries to creates /sys/devices/virtual/rtrs-server/ctl/.
> > > Then server generated below error because there is already ctl directory
> > > which manages some setup of the server.
> > >
> > > sysfs: cannot create duplicate filename '/devices/virtual/rtrs-server/ctl'
> > > Workqueue: ib-comp-wq ib_cq_poll_work [ib_core]
> > > Call Trace:
> > > dump_stack+0x50/0x63
> > > sysfs_warn_dup.cold+0x17/0x24
> > > sysfs_create_dir_ns+0xb6/0xd0
> > > kobject_add_internal+0xa6/0x2a0
> > > kobject_add+0x7e/0xb0
> > > ? _cond_resched+0x15/0x30
> > > device_add+0x121/0x640
> > > rtrs_srv_create_sess_files+0x18f/0x1f0 [rtrs_server]
> > > ? __alloc_pages_nodemask+0x16c/0x2b0
> > > ? kmalloc_order+0x7c/0x90
> > > ? kmalloc_order_trace+0x1d/0xa0
> > > ? rtrs_iu_alloc+0x17e/0x1bf [rtrs_core]
> > > rtrs_srv_info_req_done+0x417/0x5b0 [rtrs_server]
> > > ? __switch_to_asm+0x40/0x70
> > > __ib_process_cq+0x76/0xd0 [ib_core]
> > > ib_cq_poll_work+0x26/0x80 [ib_core]
> > > process_one_work+0x1df/0x3a0
> > > worker_thread+0x4a/0x3c0
> > > kthread+0xfb/0x130
> > > ? process_one_work+0x3a0/0x3a0
> > > ? kthread_park+0x90/0x90
> > > ret_from_fork+0x1f/0x40
> > > kobject_add_internal failed for ctl with -EEXIST, don't try to register things with the same name in the same directory.
> > > rtrs_server L178: device_add(): -17
> > >
> > > This patch checks the path name and disconnect on server to prevent
> > > the kernel error.
> > >
> > > Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
> > > Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
> > > ---
> > >  drivers/infiniband/ulp/rtrs/rtrs-srv.c | 8 ++++++++
> > >  1 file changed, 8 insertions(+)
> > >
> > > diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
> > > index cd9a4ccf4c28..b814a6052cf1 100644
> > > --- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
> > > +++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
> > > @@ -758,6 +758,14 @@ static bool exist_sessname(struct rtrs_srv_ctx *ctx,
> > >       struct rtrs_srv_sess *sess;
> > >       bool found = false;
> > >
> > > +     /*
> > > +      * Session name "ct" is not allowed because
> > > +      * /sys/devices/virtual/rtrs-server/ctl already exists
> > > +      * for setup management.
> > > +      */
> > > +     if (!strcmp(sessname, "ctl"))
> > > +             return true;
> >
> > Why does it have special treatment?
> 
> rtrs-server creates a folder named ctl when the module is modprob'ed.
> When a session is established, a folder of the session name is created
> at the same location, which would hold sysfs entries such as
> clt_hostname, path details, queue_depth, etc.
> 
> Due to this conflict of names, creation of session with that name is
> not possible. So this gracefully fails the connection establishment
> instead of a stack trace.
> 
> > And what will happen if user supplies "." or ".."?
> 
> Weirdly enough, this succeeds. I tried, and the session creation
> succeeds, and there is a hidden entry in the rtrs-server folder, but
> it cannot be accessed through bash.

All special symbols must be disallowed and filtered on the server side. 

> 
> > Does rtrs receive this session name from the other side in the network?
> 
> Yes. This string is entered by the user while creating the session.

It sounds scary

> 
> >
> > Thanks

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 09/10] RDMA/rtrs: Add support to disable an IB port on the storage side
  2021-08-02 14:31     ` Haris Iqbal
@ 2021-08-02 16:35       ` Leon Romanovsky
  2021-08-02 17:43         ` Haris Iqbal
  0 siblings, 1 reply; 33+ messages in thread
From: Leon Romanovsky @ 2021-08-02 16:35 UTC (permalink / raw)
  To: Haris Iqbal
  Cc: Jack Wang, RDMA mailing list, Bart Van Assche, Doug Ledford,
	Jason Gunthorpe, Md Haris Iqbal, Gioh Kim

On Mon, Aug 02, 2021 at 04:31:01PM +0200, Haris Iqbal wrote:
> On Mon, Aug 2, 2021 at 9:30 AM Leon Romanovsky <leon@kernel.org> wrote:
> >
> > On Fri, Jul 30, 2021 at 03:18:31PM +0200, Jack Wang wrote:
> > > From: Md Haris Iqbal <haris.iqbal@cloud.ionos.com>
> > >
> > > This commit adds support to reject connection on a specific IB port which
> > > can be specified in the added sysfs entry for the rtrs-server module.
> > >
> > > Example,
> > >
> > > $ echo "mlx4_0 1" > /sys/class/rtrs-server/ctl/disable_port
> > >
> > > When a connection request is received on the above IB port, rtrs_srv
> > > rejects the connection and notifies the client to disable reconnection
> > > attempts. A manual reconnect has to be triggerred in such a case.
> > >
> > > A manual reconnect can be triggered by doing the following,
> > >
> > > echo 1 > /sys/class/rtrs-client/blya/paths/<select-path>/reconnect

<...>

> >
> > And maybe Jason thinks differently, but I don't feel comfortable with
> > such new sysfs file at all.

This part is much more important and should be cleared before resending.

> >
> > Thanks

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 09/10] RDMA/rtrs: Add support to disable an IB port on the storage side
  2021-08-02 16:35       ` Leon Romanovsky
@ 2021-08-02 17:43         ` Haris Iqbal
  2021-08-06  1:22           ` Jason Gunthorpe
  0 siblings, 1 reply; 33+ messages in thread
From: Haris Iqbal @ 2021-08-02 17:43 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: Jack Wang, RDMA mailing list, Bart Van Assche, Doug Ledford,
	Jason Gunthorpe, Md Haris Iqbal, Gioh Kim

On Mon, Aug 2, 2021 at 6:36 PM Leon Romanovsky <leon@kernel.org> wrote:
>
> On Mon, Aug 02, 2021 at 04:31:01PM +0200, Haris Iqbal wrote:
> > On Mon, Aug 2, 2021 at 9:30 AM Leon Romanovsky <leon@kernel.org> wrote:
> > >
> > > On Fri, Jul 30, 2021 at 03:18:31PM +0200, Jack Wang wrote:
> > > > From: Md Haris Iqbal <haris.iqbal@cloud.ionos.com>
> > > >
> > > > This commit adds support to reject connection on a specific IB port which
> > > > can be specified in the added sysfs entry for the rtrs-server module.
> > > >
> > > > Example,
> > > >
> > > > $ echo "mlx4_0 1" > /sys/class/rtrs-server/ctl/disable_port
> > > >
> > > > When a connection request is received on the above IB port, rtrs_srv
> > > > rejects the connection and notifies the client to disable reconnection
> > > > attempts. A manual reconnect has to be triggerred in such a case.
> > > >
> > > > A manual reconnect can be triggered by doing the following,
> > > >
> > > > echo 1 > /sys/class/rtrs-client/blya/paths/<select-path>/reconnect
>
> <...>
>
> > >
> > > And maybe Jason thinks differently, but I don't feel comfortable with
> > > such new sysfs file at all.
>
> This part is much more important and should be cleared before resending.

Agreed. I will wait for Jason to respond.

>
> > >
> > > Thanks

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 09/10] RDMA/rtrs: Add support to disable an IB port on the storage side
  2021-08-02 17:43         ` Haris Iqbal
@ 2021-08-06  1:22           ` Jason Gunthorpe
  2021-08-06 10:14             ` Haris Iqbal
  0 siblings, 1 reply; 33+ messages in thread
From: Jason Gunthorpe @ 2021-08-06  1:22 UTC (permalink / raw)
  To: Haris Iqbal
  Cc: Leon Romanovsky, Jack Wang, RDMA mailing list, Bart Van Assche,
	Doug Ledford, Md Haris Iqbal, Gioh Kim

On Mon, Aug 02, 2021 at 07:43:05PM +0200, Haris Iqbal wrote:
> On Mon, Aug 2, 2021 at 6:36 PM Leon Romanovsky <leon@kernel.org> wrote:
> >
> > On Mon, Aug 02, 2021 at 04:31:01PM +0200, Haris Iqbal wrote:
> > > On Mon, Aug 2, 2021 at 9:30 AM Leon Romanovsky <leon@kernel.org> wrote:
> > > >
> > > > On Fri, Jul 30, 2021 at 03:18:31PM +0200, Jack Wang wrote:
> > > > > From: Md Haris Iqbal <haris.iqbal@cloud.ionos.com>
> > > > >
> > > > > This commit adds support to reject connection on a specific IB port which
> > > > > can be specified in the added sysfs entry for the rtrs-server module.
> > > > >
> > > > > Example,
> > > > >
> > > > > $ echo "mlx4_0 1" > /sys/class/rtrs-server/ctl/disable_port
> > > > >
> > > > > When a connection request is received on the above IB port, rtrs_srv
> > > > > rejects the connection and notifies the client to disable reconnection
> > > > > attempts. A manual reconnect has to be triggerred in such a case.
> > > > >
> > > > > A manual reconnect can be triggered by doing the following,
> > > > >
> > > > > echo 1 > /sys/class/rtrs-client/blya/paths/<select-path>/reconnect
> >
> > <...>
> >
> > > >
> > > > And maybe Jason thinks differently, but I don't feel comfortable with
> > > > such new sysfs file at all.
> >
> > This part is much more important and should be cleared before resending.
> 
> Agreed. I will wait for Jason to respond.

Based on some past conversation with Greg I'm skeptical he would
approve of this kind of usage of sysfs..

It is also very strange that this is under a class directory, I'm
starting to think it was a mistake to merge the original sysfs stuff
:(

Can you do this some other way?

Jason

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH for-next 09/10] RDMA/rtrs: Add support to disable an IB port on the storage side
  2021-08-06  1:22           ` Jason Gunthorpe
@ 2021-08-06 10:14             ` Haris Iqbal
  0 siblings, 0 replies; 33+ messages in thread
From: Haris Iqbal @ 2021-08-06 10:14 UTC (permalink / raw)
  To: Jason Gunthorpe
  Cc: Leon Romanovsky, Jack Wang, RDMA mailing list, Bart Van Assche,
	Doug Ledford, Md Haris Iqbal, Gioh Kim

On Fri, Aug 6, 2021 at 3:22 AM Jason Gunthorpe <jgg@ziepe.ca> wrote:
>
> On Mon, Aug 02, 2021 at 07:43:05PM +0200, Haris Iqbal wrote:
> > On Mon, Aug 2, 2021 at 6:36 PM Leon Romanovsky <leon@kernel.org> wrote:
> > >
> > > On Mon, Aug 02, 2021 at 04:31:01PM +0200, Haris Iqbal wrote:
> > > > On Mon, Aug 2, 2021 at 9:30 AM Leon Romanovsky <leon@kernel.org> wrote:
> > > > >
> > > > > On Fri, Jul 30, 2021 at 03:18:31PM +0200, Jack Wang wrote:
> > > > > > From: Md Haris Iqbal <haris.iqbal@cloud.ionos.com>
> > > > > >
> > > > > > This commit adds support to reject connection on a specific IB port which
> > > > > > can be specified in the added sysfs entry for the rtrs-server module.
> > > > > >
> > > > > > Example,
> > > > > >
> > > > > > $ echo "mlx4_0 1" > /sys/class/rtrs-server/ctl/disable_port
> > > > > >
> > > > > > When a connection request is received on the above IB port, rtrs_srv
> > > > > > rejects the connection and notifies the client to disable reconnection
> > > > > > attempts. A manual reconnect has to be triggerred in such a case.
> > > > > >
> > > > > > A manual reconnect can be triggered by doing the following,
> > > > > >
> > > > > > echo 1 > /sys/class/rtrs-client/blya/paths/<select-path>/reconnect
> > >
> > > <...>
> > >
> > > > >
> > > > > And maybe Jason thinks differently, but I don't feel comfortable with
> > > > > such new sysfs file at all.
> > >
> > > This part is much more important and should be cleared before resending.
> >
> > Agreed. I will wait for Jason to respond.
>
> Based on some past conversation with Greg I'm skeptical he would
> approve of this kind of usage of sysfs..
>
> It is also very strange that this is under a class directory, I'm
> starting to think it was a mistake to merge the original sysfs stuff
> :(
>
> Can you do this some other way?

I understand the discomfort. I will try to see if there is another way
to do this.

In the meanwhile, I will resend the other patches which has been reviewed.

Thanks.

>
> Jason

^ permalink raw reply	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2021-08-06 10:14 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-30 13:18 [PATCH for-next 00/10] Misc update for RTRS Jack Wang
2021-07-30 13:18 ` [PATCH for-next 01/10] RDMA/rtrs-clt: During add_path change for_new_clt according to path_num Jack Wang
2021-08-02  6:40   ` Leon Romanovsky
2021-08-02 14:17     ` Haris Iqbal
2021-07-30 13:18 ` [PATCH for-next 02/10] RDMA/rtrs-srv: Prevent sysfs error with path name "ctl" Jack Wang
2021-08-02  6:47   ` Leon Romanovsky
2021-08-02 14:24     ` Haris Iqbal
2021-08-02 16:34       ` Leon Romanovsky
2021-07-30 13:18 ` [PATCH for-next 03/10] RDMA/rtrs: Use sysfs_emit instead of s*printf function for sysfs show Jack Wang
2021-08-02  6:52   ` Leon Romanovsky
2021-08-02 14:18     ` Haris Iqbal
2021-07-30 13:18 ` [PATCH for-next 04/10] RDMA/rtrs: Remove unused functions Jack Wang
2021-08-02  6:53   ` Leon Romanovsky
2021-07-30 13:18 ` [PATCH for-next 05/10] RDMA/rtrs: Fix warning when use poll mode Jack Wang
2021-08-02  7:06   ` Leon Romanovsky
2021-08-02 14:18     ` Haris Iqbal
2021-07-30 13:18 ` [PATCH for-next 06/10] RDMA/rtrs: Remove len parameter from helper print functions of sysfs Jack Wang
2021-08-02  7:08   ` Leon Romanovsky
2021-08-02 14:34     ` Haris Iqbal
2021-07-30 13:18 ` [PATCH for-next 07/10] RDMA/rtrs: Remove all likely and unlikely Jack Wang
2021-08-02  7:10   ` Leon Romanovsky
2021-07-30 13:18 ` [PATCH for-next 08/10] RDMA/rtrs-clt: Fix counting inflight IO Jack Wang
2021-08-02  7:22   ` Leon Romanovsky
2021-07-30 13:18 ` [PATCH for-next 09/10] RDMA/rtrs: Add support to disable an IB port on the storage side Jack Wang
2021-08-02  7:29   ` Leon Romanovsky
2021-08-02 14:31     ` Haris Iqbal
2021-08-02 16:35       ` Leon Romanovsky
2021-08-02 17:43         ` Haris Iqbal
2021-08-06  1:22           ` Jason Gunthorpe
2021-08-06 10:14             ` Haris Iqbal
2021-07-30 13:18 ` [PATCH for-next 10/10] RDMA/rtrs: remove (void) casting for functions Jack Wang
2021-08-02  7:32   ` Leon Romanovsky
2021-08-02 14:16     ` Haris Iqbal

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.