From: NeilBrown <neilb@suse.com>
To: lustre-devel@lists.lustre.org
Subject: [lustre-devel] [PATCH 01/24] lustre: lnet: add lnet_interfaces_max tunable
Date: Mon, 08 Oct 2018 10:19:37 +1100 [thread overview]
Message-ID: <153895437756.16383.14536895691182127915.stgit@noble> (raw)
In-Reply-To: <153895417139.16383.3791701638653772865.stgit@noble>
From: Olaf Weber <olaf@sgi.com>
Add an lnet_interfaces_max tunable value, that describes the maximum
number of interfaces per node. This tunable is primarily useful for
sanity checks prior to allocating memory.
Allow lnet_interfaces_max to be set and get from the sysfs interface.
Add LNET_INTERFACES_MIN, value 16, as the minimum value.
Add LNET_INTERFACES_MAX_DEFAULT, value 200, as the default value. This
value was chosen to ensure that the size of an LNet ping message with
any associated LND overhead would fit in 4096 bytes.
(The LNET_INTERFACES_MAX name was not reused to allow for the early
detection of issues when merging code that uses it.)
Rename LNET_NUM_INTERFACES to LNET_INTERFACES_NUM
WC-bug-id: https://jira.whamcloud.com/browse/LU-9480
Signed-off-by: Olaf Weber <olaf@sgi.com>
Signed-off-by: Amir Shehata <amir.shehata@intel.com>
Reviewed-on: https://review.whamcloud.com/25770
Signed-off-by: NeilBrown <neilb@suse.com>
---
.../staging/lustre/include/linux/lnet/lib-types.h | 2 +
.../lustre/include/uapi/linux/lnet/lnet-dlc.h | 4 +--
.../lustre/include/uapi/linux/lnet/lnet-types.h | 7 ++++
.../staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c | 2 +
.../staging/lustre/lnet/klnds/socklnd/socklnd.c | 22 +++++++-------
.../staging/lustre/lnet/klnds/socklnd/socklnd.h | 4 +--
.../staging/lustre/lnet/klnds/socklnd/socklnd_cb.c | 2 +
.../lustre/lnet/klnds/socklnd/socklnd_proto.c | 4 +--
drivers/staging/lustre/lnet/lnet/api-ni.c | 32 +++++++++++++++++++-
drivers/staging/lustre/lnet/lnet/config.c | 10 +++---
10 files changed, 62 insertions(+), 27 deletions(-)
diff --git a/drivers/staging/lustre/include/linux/lnet/lib-types.h b/drivers/staging/lustre/include/linux/lnet/lib-types.h
index 7219a7bacf6e..7b11c31f0029 100644
--- a/drivers/staging/lustre/include/linux/lnet/lib-types.h
+++ b/drivers/staging/lustre/include/linux/lnet/lib-types.h
@@ -371,7 +371,7 @@ struct lnet_ni {
* equivalent interfaces to use
* This is an array because socklnd bonding can still be configured
*/
- char *ni_interfaces[LNET_NUM_INTERFACES];
+ char *ni_interfaces[LNET_INTERFACES_NUM];
/* original net namespace */
struct net *ni_net_ns;
};
diff --git a/drivers/staging/lustre/include/uapi/linux/lnet/lnet-dlc.h b/drivers/staging/lustre/include/uapi/linux/lnet/lnet-dlc.h
index 8f03aa3c5676..d88b30d2e76c 100644
--- a/drivers/staging/lustre/include/uapi/linux/lnet/lnet-dlc.h
+++ b/drivers/staging/lustre/include/uapi/linux/lnet/lnet-dlc.h
@@ -81,7 +81,7 @@ struct lnet_ioctl_config_lnd_tunables {
};
struct lnet_ioctl_net_config {
- char ni_interfaces[LNET_NUM_INTERFACES][LNET_MAX_STR_LEN];
+ char ni_interfaces[LNET_INTERFACES_NUM][LNET_MAX_STR_LEN];
__u32 ni_status;
__u32 ni_cpts[LNET_MAX_SHOW_NUM_CPT];
char cfg_bulk[0];
@@ -184,7 +184,7 @@ struct lnet_ioctl_element_msg_stats {
struct lnet_ioctl_config_ni {
struct libcfs_ioctl_hdr lic_cfg_hdr;
lnet_nid_t lic_nid;
- char lic_ni_intf[LNET_NUM_INTERFACES][LNET_MAX_STR_LEN];
+ char lic_ni_intf[LNET_INTERFACES_NUM][LNET_MAX_STR_LEN];
char lic_legacy_ip2nets[LNET_MAX_STR_LEN];
__u32 lic_cpts[LNET_MAX_SHOW_NUM_CPT];
__u32 lic_ncpts;
diff --git a/drivers/staging/lustre/include/uapi/linux/lnet/lnet-types.h b/drivers/staging/lustre/include/uapi/linux/lnet/lnet-types.h
index f8a873bab135..6ee60d07ff84 100644
--- a/drivers/staging/lustre/include/uapi/linux/lnet/lnet-types.h
+++ b/drivers/staging/lustre/include/uapi/linux/lnet/lnet-types.h
@@ -264,7 +264,12 @@ struct lnet_counters {
#define LNET_NI_STATUS_DOWN 0xdeadface
#define LNET_NI_STATUS_INVALID 0x00000000
-#define LNET_NUM_INTERFACES 16
+#define LNET_INTERFACES_NUM 16
+
+/* The minimum number of interfaces per node supported by LNet. */
+#define LNET_INTERFACES_MIN 16
+/* The default - arbitrary - value of the lnet_max_interfaces tunable. */
+#define LNET_INTERFACES_MAX_DEFAULT 200
/**
* Objects maintained by the LNet are accessed through handles. Handle types
diff --git a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
index c20766379323..bf969b3891a9 100644
--- a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
+++ b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
@@ -2915,7 +2915,7 @@ static int kiblnd_startup(struct lnet_ni *ni)
if (ni->ni_interfaces[0]) {
/* Use the IPoIB interface specified in 'networks=' */
- BUILD_BUG_ON(LNET_NUM_INTERFACES <= 1);
+ BUILD_BUG_ON(LNET_INTERFACES_NUM <= 1);
if (ni->ni_interfaces[1]) {
CERROR("Multiple interfaces not supported\n");
goto failed;
diff --git a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c
index b2f0148d0087..ff8d73295fff 100644
--- a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c
+++ b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c
@@ -53,7 +53,7 @@ ksocknal_ip2iface(struct lnet_ni *ni, __u32 ip)
struct ksock_interface *iface;
for (i = 0; i < net->ksnn_ninterfaces; i++) {
- LASSERT(i < LNET_NUM_INTERFACES);
+ LASSERT(i < LNET_INTERFACES_NUM);
iface = &net->ksnn_interfaces[i];
if (iface->ksni_ipaddr == ip)
@@ -221,7 +221,7 @@ ksocknal_unlink_peer_locked(struct ksock_peer *peer_ni)
struct ksock_interface *iface;
for (i = 0; i < peer_ni->ksnp_n_passive_ips; i++) {
- LASSERT(i < LNET_NUM_INTERFACES);
+ LASSERT(i < LNET_INTERFACES_NUM);
ip = peer_ni->ksnp_passive_ips[i];
iface = ksocknal_ip2iface(peer_ni->ksnp_ni, ip);
@@ -689,7 +689,7 @@ ksocknal_local_ipvec(struct lnet_ni *ni, __u32 *ipaddrs)
read_lock(&ksocknal_data.ksnd_global_lock);
nip = net->ksnn_ninterfaces;
- LASSERT(nip <= LNET_NUM_INTERFACES);
+ LASSERT(nip <= LNET_INTERFACES_NUM);
/*
* Only offer interfaces for additional connections if I have
@@ -770,8 +770,8 @@ ksocknal_select_ips(struct ksock_peer *peer_ni, __u32 *peerips, int n_peerips)
*/
write_lock_bh(global_lock);
- LASSERT(n_peerips <= LNET_NUM_INTERFACES);
- LASSERT(net->ksnn_ninterfaces <= LNET_NUM_INTERFACES);
+ LASSERT(n_peerips <= LNET_INTERFACES_NUM);
+ LASSERT(net->ksnn_ninterfaces <= LNET_INTERFACES_NUM);
/*
* Only match interfaces for additional connections
@@ -890,7 +890,7 @@ ksocknal_create_routes(struct ksock_peer *peer_ni, int port,
return;
}
- LASSERT(npeer_ipaddrs <= LNET_NUM_INTERFACES);
+ LASSERT(npeer_ipaddrs <= LNET_INTERFACES_NUM);
for (i = 0; i < npeer_ipaddrs; i++) {
if (newroute) {
@@ -919,7 +919,7 @@ ksocknal_create_routes(struct ksock_peer *peer_ni, int port,
best_nroutes = 0;
best_netmatch = 0;
- LASSERT(net->ksnn_ninterfaces <= LNET_NUM_INTERFACES);
+ LASSERT(net->ksnn_ninterfaces <= LNET_INTERFACES_NUM);
/* Select interface to connect from */
for (j = 0; j < net->ksnn_ninterfaces; j++) {
@@ -1060,7 +1060,7 @@ ksocknal_create_conn(struct lnet_ni *ni, struct ksock_route *route,
atomic_set(&conn->ksnc_tx_nob, 0);
hello = kvzalloc(offsetof(struct ksock_hello_msg,
- kshm_ips[LNET_NUM_INTERFACES]),
+ kshm_ips[LNET_INTERFACES_NUM]),
GFP_KERNEL);
if (!hello) {
rc = -ENOMEM;
@@ -1983,7 +1983,7 @@ ksocknal_add_interface(struct lnet_ni *ni, __u32 ipaddress, __u32 netmask)
if (iface) {
/* silently ignore dups */
rc = 0;
- } else if (net->ksnn_ninterfaces == LNET_NUM_INTERFACES) {
+ } else if (net->ksnn_ninterfaces == LNET_INTERFACES_NUM) {
rc = -ENOSPC;
} else {
iface = &net->ksnn_interfaces[net->ksnn_ninterfaces++];
@@ -2624,7 +2624,7 @@ ksocknal_enumerate_interfaces(struct ksock_net *net, char *iname)
continue;
}
- if (j == LNET_NUM_INTERFACES) {
+ if (j == LNET_INTERFACES_NUM) {
CWARN("Ignoring interface %s (too many interfaces)\n",
name);
continue;
@@ -2812,7 +2812,7 @@ ksocknal_startup(struct lnet_ni *ni)
net->ksnn_ninterfaces = rc;
} else {
- for (i = 0; i < LNET_NUM_INTERFACES; i++) {
+ for (i = 0; i < LNET_INTERFACES_NUM; i++) {
if (!ni->ni_interfaces[i])
break;
rc = ksocknal_enumerate_interfaces(net, ni->ni_interfaces[i]);
diff --git a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.h b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.h
index 82e3523f6463..297d1e5af1bd 100644
--- a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.h
+++ b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.h
@@ -173,7 +173,7 @@ struct ksock_net {
int ksnn_npeers; /* # peers */
int ksnn_shutdown; /* shutting down? */
int ksnn_ninterfaces; /* IP interfaces */
- struct ksock_interface ksnn_interfaces[LNET_NUM_INTERFACES];
+ struct ksock_interface ksnn_interfaces[LNET_INTERFACES_NUM];
};
/** connd timeout */
@@ -441,7 +441,7 @@ struct ksock_peer {
int ksnp_n_passive_ips; /* # of... */
/* preferred local interfaces */
- u32 ksnp_passive_ips[LNET_NUM_INTERFACES];
+ u32 ksnp_passive_ips[LNET_INTERFACES_NUM];
};
struct ksock_connreq {
diff --git a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_cb.c b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_cb.c
index dc9a12910a8d..c401896bf649 100644
--- a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_cb.c
+++ b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_cb.c
@@ -1579,7 +1579,7 @@ ksocknal_send_hello(struct lnet_ni *ni, struct ksock_conn *conn,
/* CAVEAT EMPTOR: this byte flips 'ipaddrs' */
struct ksock_net *net = (struct ksock_net *)ni->ni_data;
- LASSERT(hello->kshm_nips <= LNET_NUM_INTERFACES);
+ LASSERT(hello->kshm_nips <= LNET_INTERFACES_NUM);
/* rely on caller to hold a ref on socket so it wouldn't disappear */
LASSERT(conn->ksnc_proto);
diff --git a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_proto.c b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_proto.c
index 10a2757895f3..54ec5d0a85c8 100644
--- a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_proto.c
+++ b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_proto.c
@@ -614,7 +614,7 @@ ksocknal_recv_hello_v1(struct ksock_conn *conn, struct ksock_hello_msg *hello,
hello->kshm_nips = le32_to_cpu(hdr->payload_length) /
sizeof(__u32);
- if (hello->kshm_nips > LNET_NUM_INTERFACES) {
+ if (hello->kshm_nips > LNET_INTERFACES_NUM) {
CERROR("Bad nips %d from ip %pI4h\n",
hello->kshm_nips, &conn->ksnc_ipaddr);
rc = -EPROTO;
@@ -684,7 +684,7 @@ ksocknal_recv_hello_v2(struct ksock_conn *conn, struct ksock_hello_msg *hello,
__swab32s(&hello->kshm_nips);
}
- if (hello->kshm_nips > LNET_NUM_INTERFACES) {
+ if (hello->kshm_nips > LNET_INTERFACES_NUM) {
CERROR("Bad nips %d from ip %pI4h\n",
hello->kshm_nips, &conn->ksnc_ipaddr);
return -EPROTO;
diff --git a/drivers/staging/lustre/lnet/lnet/api-ni.c b/drivers/staging/lustre/lnet/lnet/api-ni.c
index b37abdedccaa..6a692d5c4608 100644
--- a/drivers/staging/lustre/lnet/lnet/api-ni.c
+++ b/drivers/staging/lustre/lnet/lnet/api-ni.c
@@ -34,6 +34,7 @@
#define DEBUG_SUBSYSTEM S_LNET
#include <linux/log2.h>
#include <linux/ktime.h>
+#include <linux/moduleparam.h>
#include <linux/lnet/lib-lnet.h>
#include <uapi/linux/lnet/lnet-dlc.h>
@@ -70,6 +71,13 @@ module_param(lnet_numa_range, uint, 0444);
MODULE_PARM_DESC(lnet_numa_range,
"NUMA range to consider during Multi-Rail selection");
+static int lnet_interfaces_max = LNET_INTERFACES_MAX_DEFAULT;
+static int intf_max_set(const char *val, const struct kernel_param *kp);
+module_param_call(lnet_interfaces_max, intf_max_set, param_get_int,
+ &lnet_interfaces_max, 0644);
+MODULE_PARM_DESC(lnet_interfaces_max,
+ "Maximum number of interfaces in a node.");
+
/*
* This sequence number keeps track of how many times DLC was used to
* update the local NIs. It is incremented when a NI is added or
@@ -82,6 +90,28 @@ static atomic_t lnet_dlc_seq_no = ATOMIC_INIT(0);
static int lnet_ping(struct lnet_process_id id, signed long timeout,
struct lnet_process_id __user *ids, int n_ids);
+static int
+intf_max_set(const char *val, const struct kernel_param *kp)
+{
+ int value, rc;
+
+ rc = kstrtoint(val, 0, &value);
+ if (rc) {
+ CERROR("Invalid module parameter value for 'lnet_interfaces_max'\n");
+ return rc;
+ }
+
+ if (value < LNET_INTERFACES_MIN) {
+ CWARN("max interfaces provided are too small, setting to %d\n",
+ LNET_INTERFACES_MIN);
+ value = LNET_INTERFACES_MIN;
+ }
+
+ *(int *)kp->arg = value;
+
+ return 0;
+}
+
static char *
lnet_get_routes(void)
{
@@ -2924,7 +2954,7 @@ static int lnet_ping(struct lnet_process_id id, signed long timeout,
infosz = offsetof(struct lnet_ping_info, pi_ni[n_ids]);
/* n_ids limit is arbitrary */
- if (n_ids <= 0 || n_ids > 20 || id.nid == LNET_NID_ANY)
+ if (n_ids <= 0 || n_ids > lnet_interfaces_max || id.nid == LNET_NID_ANY)
return -EINVAL;
if (id.pid == LNET_PID_ANY)
diff --git a/drivers/staging/lustre/lnet/lnet/config.c b/drivers/staging/lustre/lnet/lnet/config.c
index 3ea56c81ec0e..087d9a8a6b6a 100644
--- a/drivers/staging/lustre/lnet/lnet/config.c
+++ b/drivers/staging/lustre/lnet/lnet/config.c
@@ -123,10 +123,10 @@ lnet_ni_unique_net(struct list_head *nilist, char *iface)
/* check that the NI is unique to the interfaces with in the same NI.
* This is only a consideration if use_tcp_bonding is set */
static bool
-lnet_ni_unique_ni(char *iface_list[LNET_NUM_INTERFACES], char *iface)
+lnet_ni_unique_ni(char *iface_list[LNET_INTERFACES_NUM], char *iface)
{
int i;
- for (i = 0; i < LNET_NUM_INTERFACES; i++) {
+ for (i = 0; i < LNET_INTERFACES_NUM; i++) {
if (iface_list[i] &&
strncmp(iface_list[i], iface, strlen(iface)) == 0)
return false;
@@ -304,7 +304,7 @@ lnet_ni_free(struct lnet_ni *ni)
kfree(ni->ni_cpts);
- for (i = 0; i < LNET_NUM_INTERFACES && ni->ni_interfaces[i]; i++)
+ for (i = 0; i < LNET_INTERFACES_NUM && ni->ni_interfaces[i]; i++)
kfree(ni->ni_interfaces[i]);
/* release reference to net namespace */
@@ -397,11 +397,11 @@ lnet_ni_add_interface(struct lnet_ni *ni, char *iface)
* can free the tokens at the end of the function.
* The newly allocated ni_interfaces[] can be
* freed when freeing the NI */
- while (niface < LNET_NUM_INTERFACES &&
+ while (niface < LNET_INTERFACES_NUM &&
ni->ni_interfaces[niface])
niface++;
- if (niface >= LNET_NUM_INTERFACES) {
+ if (niface >= LNET_INTERFACES_NUM) {
LCONSOLE_ERROR_MSG(0x115, "Too many interfaces "
"for net %s\n",
libcfs_net2str(LNET_NIDNET(ni->ni_nid)));
next prev parent reply other threads:[~2018-10-07 23:19 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-07 23:19 [lustre-devel] [PATCH 00/24] Port Dynamic Discovery to drivers/staging NeilBrown
2018-10-07 23:19 ` [lustre-devel] [PATCH 08/24] lustre: lnet: rename lnet_add/del_peer_ni_to/from_peer() NeilBrown
2018-10-14 19:55 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 09/24] lustre: lnet: refactor lnet_del_peer_ni() NeilBrown
2018-10-14 19:58 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 02/24] lustre: lnet: configure lnet_interfaces_max tunable from dlc NeilBrown
2018-10-14 19:10 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 06/24] lustre: lnet: add sanity checks on ping-related constants NeilBrown
2018-10-14 19:36 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 04/24] lustre: lnet: automatic sizing of router pinger buffers NeilBrown
2018-10-14 19:32 ` James Simmons
2018-10-14 19:33 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 10/24] lustre: lnet: refactor lnet_add_peer_ni() NeilBrown
2018-10-14 20:02 ` James Simmons
2018-10-07 23:19 ` NeilBrown [this message]
2018-10-14 19:08 ` [lustre-devel] [PATCH 01/24] lustre: lnet: add lnet_interfaces_max tunable James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 05/24] lustre: lnet: add Multi-Rail and Discovery ping feature bits NeilBrown
2018-10-14 19:34 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 03/24] lustre: lnet: add struct lnet_ping_buffer NeilBrown
2018-10-14 19:29 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 07/24] lustre: lnet: cleanup of lnet_peer_ni_addref/decref_locked() NeilBrown
2018-10-14 19:38 ` James Simmons
2018-10-14 19:39 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 11/24] lustre: lnet: introduce LNET_PEER_MULTI_RAIL flag bit NeilBrown
2018-10-14 20:11 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 16/24] lustre: lnet: add discovery thread NeilBrown
2018-10-14 22:51 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 15/24] lustre: lnet: add msg_type to lnet_event NeilBrown
2018-10-14 22:44 ` James Simmons
2018-10-14 22:44 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 17/24] lustre: lnet: add the Push target NeilBrown
2018-10-14 22:58 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 24/24] lustre: lnet: balance references in lnet_discover_peer_locked() NeilBrown
2018-10-14 23:53 ` James Simmons
2018-10-14 23:54 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 19/24] lustre: lnet: add "lnetctl peer list" NeilBrown
2018-10-14 23:38 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 13/24] lustre: lnet: add LNET_PEER_CONFIGURED flag NeilBrown
2018-10-14 20:32 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 21/24] lustre: lnet: add "lnetctl discover" NeilBrown
2018-10-14 23:45 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 12/24] lustre: lnet: preferred NIs for non-Multi-Rail peers NeilBrown
2018-10-14 20:20 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 20/24] lustre: lnet: add "lnetctl ping" command NeilBrown
2018-10-14 23:43 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 23/24] lustre: lnet: show peer state NeilBrown
2018-10-14 23:52 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 14/24] lustre: lnet: reference counts on lnet_peer/lnet_peer_net NeilBrown
2018-10-14 22:42 ` James Simmons
2018-10-17 5:16 ` NeilBrown
2018-10-20 16:47 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 18/24] lustre: lnet: implement Peer Discovery NeilBrown
2018-10-14 23:33 ` James Simmons
2018-10-07 23:19 ` [lustre-devel] [PATCH 22/24] lustre: lnet: add enhanced statistics NeilBrown
2018-10-14 23:50 ` James Simmons
2018-10-14 23:54 ` [lustre-devel] [PATCH 00/24] Port Dynamic Discovery to drivers/staging James Simmons
2018-10-17 5:20 ` NeilBrown
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=153895437756.16383.14536895691182127915.stgit@noble \
--to=neilb@suse.com \
--cc=lustre-devel@lists.lustre.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.