All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jack Wang <jinpu.wang@profitbricks.com>
To: linux-block@vger.kernel.org, linux-rdma@vger.kernel.org
Cc: dledford@redhat.com, axboe@kernel.dk, hch@lst.de,
	mail@fholler.de, Milind.dumbare@gmail.com,
	yun.wang@profitbricks.com,
	Jack Wang <jinpu.wang@profitbricks.com>,
	Kleber Souza <kleber.souza@profitbricks.com>,
	Danil Kipnis <danil.kipnis@profitbricks.com>,
	Roman Pen <roman.penyaev@profitbricks.com>
Subject: [PATCH 12/28] ibtrs_srv: add sysfs interface
Date: Fri, 24 Mar 2017 11:45:27 +0100	[thread overview]
Message-ID: <1490352343-20075-13-git-send-email-jinpu.wangl@profitbricks.com> (raw)
In-Reply-To: <1490352343-20075-1-git-send-email-jinpu.wangl@profitbricks.com>

From: Jack Wang <jinpu.wang@profitbricks.com>

Signed-off-by: Jack Wang <jinpu.wang@profitbricks.com>
Signed-off-by: Kleber Souza <kleber.souza@profitbricks.com>
Signed-off-by: Danil Kipnis <danil.kipnis@profitbricks.com>
Signed-off-by: Roman Pen <roman.penyaev@profitbricks.com>
---
 .../infiniband/ulp/ibtrs_server/ibtrs_srv_sysfs.c  | 301 +++++++++++++++++++++
 .../infiniband/ulp/ibtrs_server/ibtrs_srv_sysfs.h  |  59 ++++
 2 files changed, 360 insertions(+)
 create mode 100644 drivers/infiniband/ulp/ibtrs_server/ibtrs_srv_sysfs.c
 create mode 100644 drivers/infiniband/ulp/ibtrs_server/ibtrs_srv_sysfs.h

diff --git a/drivers/infiniband/ulp/ibtrs_server/ibtrs_srv_sysfs.c b/drivers/infiniband/ulp/ibtrs_server/ibtrs_srv_sysfs.c
new file mode 100644
index 0000000..c95a124
--- /dev/null
+++ b/drivers/infiniband/ulp/ibtrs_server/ibtrs_srv_sysfs.c
@@ -0,0 +1,301 @@
+/*
+ * InfiniBand Transport Layer
+ *
+ * Copyright (c) 2014 - 2017 ProfitBricks GmbH. All rights reserved.
+ * Authors: Fabian Holler < mail@fholler.de>
+ *          Jack Wang <jinpu.wang@profitbricks.com>
+ *   	    Kleber Souza <kleber.souza@profitbricks.com>
+ * 	    Danil Kipnis <danil.kipnis@profitbricks.com>
+ *   	    Roman Pen <roman.penyaev@profitbricks.com>
+ *          Milind Dumbare <Milind.dumbare@gmail.com>
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for further
+ *    binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ *    of any contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ */
+
+#include "ibtrs_srv_sysfs.h"
+#include "ibtrs_srv_internal.h"
+#include <rdma/ibtrs_srv.h>
+#include <rdma/ibtrs.h>
+#include <rdma/ibtrs_log.h>
+
+static struct kobject *ibtrs_srv_kobj;
+static struct kobject *ibtrs_srv_sessions_kobj;
+
+static ssize_t ibtrs_srv_hb_timeout_show(struct kobject *kobj,
+					 struct kobj_attribute *attr,
+					 char *page)
+{
+	struct ibtrs_session *sess = container_of(kobj, struct ibtrs_session,
+						  kobj);
+
+	return scnprintf(page, PAGE_SIZE, "%u\n", sess->heartbeat.timeout_ms);
+}
+
+static ssize_t ibtrs_srv_hb_timeout_store(struct kobject *kobj,
+					  struct kobj_attribute *attr,
+					  const char *buf, size_t count)
+{
+	int ret;
+	u32 timeout_ms;
+	struct ibtrs_session *sess = container_of(kobj, struct ibtrs_session,
+						  kobj);
+
+	ret = kstrtouint(buf, 0, &timeout_ms);
+	if (ret)
+		return ret;
+
+	ret = ibtrs_heartbeat_timeout_validate(timeout_ms);
+	if (ret)
+		return ret;
+
+	INFO(sess, "%s: changing value from %u to %u\n", attr->attr.name,
+	     sess->heartbeat.timeout_ms, timeout_ms);
+	ibtrs_set_heartbeat_timeout(&sess->heartbeat, timeout_ms);
+	return count;
+}
+
+static struct kobj_attribute ibtrs_srv_heartbeat_timeout_ms_attr =
+	__ATTR(heartbeat_timeout_ms, 0644,
+	       ibtrs_srv_hb_timeout_show, ibtrs_srv_hb_timeout_store);
+
+static ssize_t ibtrs_srv_disconnect_show(struct kobject *kobj,
+					 struct kobj_attribute *attr,
+					 char *page)
+{
+	return scnprintf(page, PAGE_SIZE, "Usage: echo 1 > %s\n",
+			 attr->attr.name);
+}
+
+static ssize_t ibtrs_srv_disconnect_store(struct kobject *kobj,
+					  struct kobj_attribute *attr,
+					  const char *buf, size_t count)
+{
+	struct ibtrs_session *sess = container_of(kobj, struct ibtrs_session,
+						  kobj);
+
+	if (!sysfs_streq(buf, "1")) {
+		ERR(sess, "%s: invalid value: '%s'\n", attr->attr.name, buf);
+		return -EINVAL;
+	}
+
+	INFO(sess, "%s: Session disconnect requested\n", attr->attr.name);
+	ibtrs_srv_queue_close(sess);
+
+	return count;
+}
+
+static struct kobj_attribute disconnect_attr =
+	__ATTR(disconnect, 0644,
+	       ibtrs_srv_disconnect_show, ibtrs_srv_disconnect_store);
+
+static ssize_t ibtrs_srv_current_hca_port_show(struct kobject *kobj,
+					       struct kobj_attribute *attr,
+					       char *page)
+{
+	struct ibtrs_session *sess = container_of(kobj, struct ibtrs_session,
+						  kobj);
+	return ibtrs_srv_current_hca_port_to_str(sess, page, PAGE_SIZE);
+}
+
+static struct kobj_attribute current_hca_port_attr =
+	__ATTR(current_hca_port, 0444, ibtrs_srv_current_hca_port_show,
+	       NULL);
+
+static ssize_t ibtrs_srv_hca_name_show(struct kobject *kobj,
+				       struct kobj_attribute *attr,
+				       char *page)
+{
+	struct ibtrs_session *sess = container_of(kobj, struct ibtrs_session,
+						  kobj);
+
+	return scnprintf(page, PAGE_SIZE, "%s\n",
+			 ibtrs_srv_get_sess_hca_name(sess));
+}
+
+static struct kobj_attribute hca_name_attr =
+	__ATTR(hca_name, 0444, ibtrs_srv_hca_name_show, NULL);
+
+static ssize_t hostname_show(struct kobject *kobj,
+			     struct kobj_attribute *attr, char *page)
+{
+	struct ibtrs_session *sess = container_of(kobj, struct ibtrs_session,
+						  kobj);
+	return sprintf(page, "%s\n", sess->hostname);
+}
+
+static struct kobj_attribute hostname_attr =
+		__ATTR(hostname, 0444, hostname_show, NULL);
+
+static struct attribute *default_sess_attrs[] = {
+	&hca_name_attr.attr,
+	&hostname_attr.attr,
+	&current_hca_port_attr.attr,
+	&disconnect_attr.attr,
+	&ibtrs_srv_heartbeat_timeout_ms_attr.attr,
+	NULL,
+};
+
+static struct attribute_group default_sess_attr_group = {
+	.attrs = default_sess_attrs,
+};
+
+static void ibtrs_srv_sess_release(struct kobject *kobj)
+{
+	struct ibtrs_session *sess = container_of(kobj, struct ibtrs_session,
+						  kobj);
+
+	ibtrs_srv_sess_put(sess);
+}
+
+static struct kobj_type ibtrs_srv_sess_ktype = {
+	.sysfs_ops	= &kobj_sysfs_ops,
+	.release	= ibtrs_srv_sess_release,
+};
+
+STAT_ATTR(rdma, ibtrs_srv_stats_rdma_to_str, ibtrs_srv_reset_rdma_stats);
+
+STAT_ATTR(user_ib_messages, ibtrs_srv_stats_user_ib_msgs_to_str,
+	  ibtrs_srv_reset_user_ib_msgs_stats);
+
+STAT_ATTR(wc_completion, ibtrs_srv_stats_wc_completion_to_str,
+	  ibtrs_srv_reset_wc_completion_stats);
+
+STAT_ATTR(reset_all, ibtrs_srv_reset_all_help, ibtrs_srv_reset_all_stats);
+
+static struct attribute *ibtrs_srv_default_stats_attrs[] = {
+	&rdma_attr.attr,
+	&user_ib_messages_attr.attr,
+	&wc_completion_attr.attr,
+	&reset_all_attr.attr,
+	NULL,
+};
+
+static struct attribute_group ibtrs_srv_default_stats_attr_group = {
+	.attrs = ibtrs_srv_default_stats_attrs,
+};
+
+static struct kobj_type ibtrs_stats_ktype = {
+	.sysfs_ops = &kobj_sysfs_ops,
+};
+
+static int ibtrs_srv_create_stats_files(struct ibtrs_session *sess)
+{
+	int ret;
+
+	ret = kobject_init_and_add(&sess->kobj_stats, &ibtrs_stats_ktype,
+				   &sess->kobj, "stats");
+	if (ret) {
+		ERR(sess,
+		    "Failed to init and add sysfs directory for session stats,"
+		    " errno: %d\n", ret);
+		return ret;
+	}
+
+	ret = sysfs_create_group(&sess->kobj_stats,
+				 &ibtrs_srv_default_stats_attr_group);
+	if (ret) {
+		ERR(sess, "Failed to create sysfs group for session stats,"
+		    " errno: %d\n", ret);
+		goto err;
+	}
+
+	return 0;
+
+err:
+	kobject_put(&sess->kobj_stats);
+
+	return ret;
+}
+
+int ibtrs_srv_create_sess_files(struct ibtrs_session *sess)
+{
+	int ret;
+
+	DEB("creating sysfs files for sess %s\n", sess->addr);
+
+	if (WARN_ON(!ibtrs_srv_sess_get(sess)))
+		return -EINVAL;
+
+	ret = kobject_init_and_add(&sess->kobj, &ibtrs_srv_sess_ktype,
+				   ibtrs_srv_sessions_kobj, "%s", sess->addr);
+	if (ret) {
+		ERR(sess, "Failed to init and add sysfs directory for session,"
+		    " errno: %d\n", ret);
+		ibtrs_srv_sess_put(sess);
+		return ret;
+	}
+
+	ret = sysfs_create_group(&sess->kobj, &default_sess_attr_group);
+	if (ret) {
+		ERR(sess, "Failed to create sysfs group for session,"
+		    " errno: %d\n", ret);
+		goto err;
+	}
+
+	ret = ibtrs_srv_create_stats_files(sess);
+	if (ret)
+		goto err1;
+
+	return 0;
+
+err1:
+	sysfs_remove_group(&sess->kobj, &default_sess_attr_group);
+err:
+	kobject_put(&sess->kobj);
+
+	return ret;
+}
+
+int ibtrs_srv_create_sysfs_files(void)
+{
+	ibtrs_srv_kobj = kobject_create_and_add("ibtrs", kernel_kobj);
+	if (!ibtrs_srv_kobj)
+		return -ENOMEM;
+
+	ibtrs_srv_sessions_kobj = kobject_create_and_add("sessions",
+							 ibtrs_srv_kobj);
+	if (!ibtrs_srv_sessions_kobj) {
+		kobject_put(ibtrs_srv_kobj);
+		return -ENOMEM;
+	}
+
+	return 0;
+}
+
+void ibtrs_srv_destroy_sysfs_files(void)
+{
+	kobject_put(ibtrs_srv_sessions_kobj);
+	kobject_put(ibtrs_srv_kobj);
+}
diff --git a/drivers/infiniband/ulp/ibtrs_server/ibtrs_srv_sysfs.h b/drivers/infiniband/ulp/ibtrs_server/ibtrs_srv_sysfs.h
new file mode 100644
index 0000000..e5dfa62
--- /dev/null
+++ b/drivers/infiniband/ulp/ibtrs_server/ibtrs_srv_sysfs.h
@@ -0,0 +1,59 @@
+/*
+ * InfiniBand Transport Layer
+ *
+ * Copyright (c) 2014 - 2017 ProfitBricks GmbH. All rights reserved.
+ * Authors: Fabian Holler < mail@fholler.de>
+ *          Jack Wang <jinpu.wang@profitbricks.com>
+ *   	    Kleber Souza <kleber.souza@profitbricks.com>
+ * 	    Danil Kipnis <danil.kipnis@profitbricks.com>
+ *   	    Roman Pen <roman.penyaev@profitbricks.com>
+ *          Milind Dumbare <Milind.dumbare@gmail.com>
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for further
+ *    binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ *    of any contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ */
+
+#ifndef _IBTRS_SRV_SYFS_H
+#define _IBTRS_SRV_SYFS_H
+
+#include <linux/kobject.h>
+#include "ibtrs_srv_internal.h"
+
+int ibtrs_srv_create_sysfs_files(void);
+
+void ibtrs_srv_destroy_sysfs_files(void);
+
+int ibtrs_srv_create_sess_files(struct ibtrs_session *sess);
+
+#endif
-- 
2.7.4

  parent reply	other threads:[~2017-03-24 10:45 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-24 10:45 [RFC PATCH 00/28] INFINIBAND NETWORK BLOCK DEVICE (IBNBD) Jack Wang
2017-03-24 10:45 ` Jack Wang
2017-03-24 10:45 ` [PATCH 01/28] ibtrs: add header shared between ibtrs_client and ibtrs_server Jack Wang
2017-03-24 10:45   ` Jack Wang
2017-03-24 12:35   ` Johannes Thumshirn
2017-03-24 12:35     ` Johannes Thumshirn
2017-03-24 12:54     ` Jinpu Wang
2017-03-24 12:54       ` Jinpu Wang
2017-03-24 14:31       ` Johannes Thumshirn
2017-03-24 14:31         ` Johannes Thumshirn
2017-03-24 14:35         ` Jinpu Wang
2017-03-24 14:35           ` Jinpu Wang
2017-03-24 10:45 ` [PATCH 02/28] ibtrs: add header for log MICROs " Jack Wang
2017-03-24 10:45 ` [PATCH 03/28] ibtrs_lib: add common functions shared by client and server Jack Wang
2017-03-24 10:45 ` [PATCH 04/28] ibtrs_clt: add header file for exported interface Jack Wang
2017-03-24 10:45 ` [PATCH 05/28] ibtrs_clt: main functionality of ibtrs_client Jack Wang
2017-03-24 10:45   ` Jack Wang
2017-03-24 10:45 ` [PATCH 06/28] ibtrs_clt: add header file shared only in ibtrs_client Jack Wang
2017-03-24 10:45 ` [PATCH 07/28] ibtrs_clt: add files for sysfs interface Jack Wang
2017-03-24 10:45 ` [PATCH 08/28] ibtrs_clt: add Makefile and Kconfig Jack Wang
2017-03-25  5:51   ` kbuild test robot
2017-03-25  5:51     ` kbuild test robot
2017-03-25  6:55   ` kbuild test robot
2017-03-25  6:55     ` kbuild test robot
2017-03-24 10:45 ` [PATCH 09/28] ibtrs_srv: add header file for exported interface Jack Wang
2017-03-24 10:45   ` Jack Wang
2017-03-24 10:45 ` [PATCH 10/28] ibtrs_srv: add main functionality for ibtrs_server Jack Wang
2017-03-24 10:45 ` [PATCH 11/28] ibtrs_srv: add header shared in ibtrs_server Jack Wang
2017-03-24 10:45   ` Jack Wang
2017-03-24 10:45 ` Jack Wang [this message]
2017-03-24 10:45 ` [PATCH 13/28] ibtrs_srv: add Makefile and Kconfig Jack Wang
2017-03-24 10:45   ` Jack Wang
2017-03-25  7:55   ` kbuild test robot
2017-03-25  7:55     ` kbuild test robot
2017-03-25 10:54   ` kbuild test robot
2017-03-25 10:54     ` kbuild test robot
2017-03-24 10:45 ` [PATCH 14/28] ibnbd: add headers shared by ibnbd_client and ibnbd_server Jack Wang
2017-03-24 10:45 ` [PATCH 15/28] ibnbd: add shared library functions Jack Wang
2017-03-24 10:45   ` Jack Wang
2017-03-24 10:45 ` [PATCH 16/28] ibnbd_clt: add main functionality of ibnbd_client Jack Wang
2017-03-24 10:45   ` Jack Wang
2017-03-24 10:45 ` [PATCH 17/28] ibnbd_clt: add header shared in ibnbd_client Jack Wang
2017-03-24 10:45   ` Jack Wang
2017-03-24 10:45 ` [PATCH 18/28] ibnbd_clt: add sysfs interface Jack Wang
2017-03-24 10:45   ` Jack Wang
2017-03-24 10:45 ` [PATCH 19/28] ibnbd_clt: add log helpers Jack Wang
2017-03-24 10:45 ` [PATCH 20/28] ibnbd_clt: add Makefile and Kconfig Jack Wang
2017-03-24 10:45   ` Jack Wang
2017-03-25  8:38   ` kbuild test robot
2017-03-25  8:38     ` kbuild test robot
2017-03-25 11:17   ` kbuild test robot
2017-03-25 11:17     ` kbuild test robot
2017-03-24 10:45 ` [PATCH 21/28] ibnbd_srv: add header shared in ibnbd_server Jack Wang
2017-03-24 10:45   ` Jack Wang
2017-03-24 10:45 ` [PATCH 22/28] ibnbd_srv: add main functionality Jack Wang
2017-03-24 10:45 ` [PATCH 23/28] ibnbd_srv: add abstraction for submit IO to file or block device Jack Wang
2017-03-24 10:45   ` Jack Wang
2017-03-24 10:45 ` [PATCH 24/28] ibnbd_srv: add log helpers Jack Wang
2017-03-24 10:45 ` [PATCH 25/28] ibnbd_srv: add sysfs interface Jack Wang
2017-03-24 10:45   ` Jack Wang
2017-03-24 10:45 ` [PATCH 26/28] ibnbd_srv: add Makefile and Kconfig Jack Wang
2017-03-25  9:27   ` kbuild test robot
2017-03-25  9:27     ` kbuild test robot
2017-03-24 10:45 ` [PATCH 27/28] ibnbd: add doc for how to use ibnbd and sysfs interface Jack Wang
2017-03-25  7:44   ` kbuild test robot
2017-03-25  7:44     ` kbuild test robot
2017-03-24 10:45 ` [PATCH 28/28] MAINTRAINERS: Add maintainer for IBNBD/IBTRS Jack Wang
2017-03-24 12:15 ` [RFC PATCH 00/28] INFINIBAND NETWORK BLOCK DEVICE (IBNBD) Johannes Thumshirn
2017-03-24 12:15   ` Johannes Thumshirn
2017-03-24 12:46   ` Jinpu Wang
2017-03-24 12:46     ` Jinpu Wang
2017-03-24 12:48     ` Johannes Thumshirn
2017-03-24 12:48       ` Johannes Thumshirn
2017-03-24 13:31     ` Bart Van Assche
2017-03-24 13:31       ` Bart Van Assche
2017-03-24 14:24       ` Jinpu Wang
2017-03-24 14:24         ` Jinpu Wang
2017-03-24 14:20 ` Steve Wise
2017-03-24 14:20   ` Steve Wise
2017-03-24 14:37   ` Jinpu Wang
2017-03-24 14:37     ` Jinpu Wang
2017-03-27  2:20 ` Sagi Grimberg
2017-03-27  2:20   ` Sagi Grimberg
2017-03-27 10:21   ` Jinpu Wang
2017-03-27 10:21     ` Jinpu Wang
2017-03-28 14:17     ` Roman Penyaev
2017-03-28 14:17       ` Roman Penyaev

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=1490352343-20075-13-git-send-email-jinpu.wangl@profitbricks.com \
    --to=jinpu.wang@profitbricks.com \
    --cc=Milind.dumbare@gmail.com \
    --cc=axboe@kernel.dk \
    --cc=danil.kipnis@profitbricks.com \
    --cc=dledford@redhat.com \
    --cc=hch@lst.de \
    --cc=kleber.souza@profitbricks.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    --cc=mail@fholler.de \
    --cc=roman.penyaev@profitbricks.com \
    --cc=yun.wang@profitbricks.com \
    /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.