All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jack Wang <jinpu.wang@ionos.com>
To: linux-rdma@vger.kernel.org
Cc: bvanassche@acm.org, leon@kernel.org, dledford@redhat.com,
	jgg@ziepe.ca, haris.iqbal@ionos.com, jinpu.wang@ionos.com,
	Md Haris Iqbal <haris.iqbal@cloud.ionos.com>,
	Gioh Kim <gi-oh.kim@ionos.com>
Subject: [PATCH for-next 09/10] RDMA/rtrs: Add support to disable an IB port on the storage side
Date: Fri, 30 Jul 2021 15:18:31 +0200	[thread overview]
Message-ID: <20210730131832.118865-10-jinpu.wang@ionos.com> (raw)
In-Reply-To: <20210730131832.118865-1-jinpu.wang@ionos.com>

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


  parent reply	other threads:[~2021-07-30 13:18 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 ` Jack Wang [this message]
2021-08-02  7:29   ` [PATCH for-next 09/10] RDMA/rtrs: Add support to disable an IB port on the storage side 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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210730131832.118865-10-jinpu.wang@ionos.com \
    --to=jinpu.wang@ionos.com \
    --cc=bvanassche@acm.org \
    --cc=dledford@redhat.com \
    --cc=gi-oh.kim@ionos.com \
    --cc=haris.iqbal@cloud.ionos.com \
    --cc=haris.iqbal@ionos.com \
    --cc=jgg@ziepe.ca \
    --cc=leon@kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.