*/
/*
* This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
*/
#define DEBUG_SUBSYSTEM S_LNET
list_for_each(tmp, nilist) {
ni = list_entry(tmp, struct lnet_ni, ni_netlist);
- if (ni->ni_interfaces[0] != NULL &&
- strncmp(ni->ni_interfaces[0], iface, strlen(iface)) == 0)
+ if (ni->ni_interface != NULL &&
+ strncmp(ni->ni_interface, iface, strlen(iface)) == 0)
return false;
}
return true;
}
-
-/* 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_INTERFACES_NUM], char *iface)
-{
- int i;
- for (i = 0; i < LNET_INTERFACES_NUM; i++) {
- if (iface_list[i] != NULL &&
- strncmp(iface_list[i], iface, strlen(iface)) == 0)
- return false;
- }
-
- return true;
-}
-
static bool
in_array(__u32 *array, __u32 size, __u32 value)
{
if (cpts == NULL) {
/* there is an NI which will exist on all CPTs */
if (net->net_cpts != NULL)
- LIBCFS_FREE(net->net_cpts, sizeof(*net->net_cpts) *
- net->net_ncpts);
+ CFS_FREE_PTR_ARRAY(net->net_cpts, net->net_ncpts);
net->net_cpts = NULL;
net->net_ncpts = LNET_CPT_NUMBER;
return 0;
}
if (net->net_cpts == NULL) {
- LIBCFS_ALLOC(net->net_cpts, sizeof(*net->net_cpts) * ncpts);
+ CFS_ALLOC_PTR_ARRAY(net->net_cpts, ncpts);
if (net->net_cpts == NULL)
return -ENOMEM;
memcpy(net->net_cpts, cpts, ncpts * sizeof(*net->net_cpts));
return 0;
}
- LIBCFS_ALLOC(added_cpts, sizeof(*added_cpts) * LNET_CPT_NUMBER);
+ CFS_ALLOC_PTR_ARRAY(added_cpts, LNET_CPT_NUMBER);
if (added_cpts == NULL)
return -ENOMEM;
__u32 *array = NULL, *loc;
__u32 total_entries = j + net->net_ncpts;
- LIBCFS_ALLOC(array, sizeof(*net->net_cpts) * total_entries);
+ CFS_ALLOC_PTR_ARRAY(array, total_entries);
if (array == NULL) {
rc = -ENOMEM;
goto failed;
}
- memcpy(array, net->net_cpts, net->net_ncpts);
+ memcpy(array, net->net_cpts,
+ net->net_ncpts * sizeof(*net->net_cpts));
loc = array + net->net_ncpts;
- memcpy(loc, added_cpts, j);
+ memcpy(loc, added_cpts, j * sizeof(*net->net_cpts));
- LIBCFS_FREE(net->net_cpts, sizeof(*net->net_cpts) *
- net->net_ncpts);
+ CFS_FREE_PTR_ARRAY(net->net_cpts, net->net_ncpts);
net->net_ncpts = total_entries;
net->net_cpts = array;
}
failed:
- LIBCFS_FREE(added_cpts, sizeof(*added_cpts) * LNET_CPT_NUMBER);
+ CFS_FREE_PTR_ARRAY(added_cpts, LNET_CPT_NUMBER);
return rc;
}
* CPTs which the remaining NIs are associated with.
*/
if (net->net_cpts != NULL) {
- LIBCFS_FREE(net->net_cpts,
- sizeof(*net->net_cpts) * net->net_ncpts);
+ CFS_FREE_PTR_ARRAY(net->net_cpts, net->net_ncpts);
net->net_cpts = NULL;
}
* accross CPT lines.
*/
if (net->net_cpts != NULL) {
- LIBCFS_FREE(net->net_cpts,
- sizeof(*net->net_cpts) *
- net->net_ncpts);
+ CFS_FREE_PTR_ARRAY(net->net_cpts,
+ net->net_ncpts);
net->net_cpts = NULL;
net->net_ncpts = LNET_CPT_NUMBER;
}
void
lnet_ni_free(struct lnet_ni *ni)
{
- int i;
-
lnet_net_remove_cpts(ni->ni_cpts, ni->ni_ncpts, ni->ni_net);
if (ni->ni_refs != NULL)
if (ni->ni_cpts != NULL)
cfs_expr_list_values_free(ni->ni_cpts, ni->ni_ncpts);
- for (i = 0; i < LNET_INTERFACES_NUM &&
- ni->ni_interfaces[i] != NULL; i++) {
- LIBCFS_FREE(ni->ni_interfaces[i],
- strlen(ni->ni_interfaces[i]) + 1);
+ if (ni->ni_interface != NULL) {
+ LIBCFS_FREE(ni->ni_interface,
+ strlen(ni->ni_interface) + 1);
}
/* release reference to net namespace */
}
if (net->net_cpts != NULL)
- LIBCFS_FREE(net->net_cpts,
- sizeof(*net->net_cpts) * net->net_ncpts);
+ CFS_FREE_PTR_ARRAY(net->net_cpts, net->net_ncpts);
LIBCFS_FREE(net, sizeof(*net));
}
{
struct lnet_net *net;
- if (!lnet_net_unique(net_id, net_list, NULL)) {
- CERROR("Duplicate net %s. Ignore\n",
- libcfs_net2str(net_id));
- return NULL;
+ if (!lnet_net_unique(net_id, net_list, &net)) {
+ CDEBUG(D_NET, "Returning duplicate net %p %s\n", net,
+ libcfs_net2str(net->net_id));
+ return net;
}
LIBCFS_ALLOC(net, sizeof(*net));
INIT_LIST_HEAD(&net->net_ni_list);
INIT_LIST_HEAD(&net->net_ni_added);
INIT_LIST_HEAD(&net->net_ni_zombie);
+ INIT_LIST_HEAD(&net->net_rtr_pref_nids);
spin_lock_init(&net->net_lock);
net->net_id = net_id;
net->net_last_alive = ktime_get_real_seconds();
+ net->net_sel_priority = LNET_MAX_SELECTION_PRIORITY;
+
/* initialize global paramters to undefiend */
net->net_tunables.lct_peer_timeout = -1;
net->net_tunables.lct_max_tx_credits = -1;
static int
lnet_ni_add_interface(struct lnet_ni *ni, char *iface)
{
- int niface = 0;
+ size_t iface_len = strlen(iface) + 1;
if (ni == NULL)
return -ENOMEM;
- if (!lnet_ni_unique_ni(ni->ni_interfaces, iface))
- return -EINVAL;
-
- /* Allocate a separate piece of memory and copy
- * into it the string, so we don't have
- * a depencency on the tokens string. This way we
- * 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_INTERFACES_NUM &&
- ni->ni_interfaces[niface] != NULL)
- niface++;
-
- if (niface >= LNET_INTERFACES_NUM) {
- LCONSOLE_ERROR_MSG(0x115, "Too many interfaces "
- "for net %s\n",
- libcfs_net2str(LNET_NIDNET(ni->ni_nid)));
+ if (ni->ni_interface != NULL) {
+ LCONSOLE_ERROR_MSG(0x115, "%s: interface %s already set for net %s: rc = %d\n",
+ iface, ni->ni_interface,
+ libcfs_net2str(LNET_NIDNET(ni->ni_nid)),
+ -EINVAL);
return -EINVAL;
}
- LIBCFS_ALLOC(ni->ni_interfaces[niface],
- strlen(iface) + 1);
+ /* Allocate memory for the interface, so the code parsing input into
+ * tokens and adding interfaces can free the input safely.
+ * ni->ni_interface is freed in lnet_ni_free().
+ */
+ LIBCFS_ALLOC(ni->ni_interface, iface_len);
- if (ni->ni_interfaces[niface] == NULL) {
- CERROR("Can't allocate net interface name\n");
+ if (ni->ni_interface == NULL) {
+ CERROR("%s: cannot allocate net interface name: rc = %d\n",
+ iface, -ENOMEM);
return -ENOMEM;
}
- strncpy(ni->ni_interfaces[niface], iface,
- strlen(iface) + 1);
+ strscpy(ni->ni_interface, iface, iface_len);
return 0;
}
ni->ni_net_ns = get_net(&init_net);
ni->ni_state = LNET_NI_STATE_INIT;
+ ni->ni_sel_priority = LNET_MAX_SELECTION_PRIORITY;
list_add_tail(&ni->ni_netlist, &net->net_ni_added);
/*
LASSERT(rc <= LNET_CPT_NUMBER);
if (rc == LNET_CPT_NUMBER) {
- LIBCFS_FREE(ni->ni_cpts, rc * sizeof(ni->ni_cpts[0]));
+ CFS_FREE_PTR_ARRAY(ni->ni_cpts, rc);
ni->ni_cpts = NULL;
}
ni->ni_ncpts = LNET_CPT_NUMBER;
} else {
size_t array_size = ncpts * sizeof(ni->ni_cpts[0]);
- LIBCFS_ALLOC(ni->ni_cpts, array_size);
+
+ CFS_ALLOC_PTR_ARRAY(ni->ni_cpts, ncpts);
if (ni->ni_cpts == NULL)
goto failed;
memcpy(ni->ni_cpts, cpts, array_size);
* nilist.
*/
int
-lnet_parse_networks(struct list_head *netlist, char *networks,
- bool use_tcp_bonding)
+lnet_parse_networks(struct list_head *netlist, const char *networks)
{
struct cfs_expr_list *net_el = NULL;
struct cfs_expr_list *ni_el = NULL;
* At this point the name is properly terminated.
*/
net_id = libcfs_str2net(name);
- if (net_id == LNET_NIDNET(LNET_NID_ANY)) {
+ if (net_id == LNET_NET_ANY) {
LCONSOLE_ERROR_MSG(0x113,
"Unrecognised network type\n");
str = name;
if (IS_ERR_OR_NULL(net))
goto failed;
- if (!nistr ||
- (use_tcp_bonding && LNET_NETTYP(net_id) == SOCKLND)) {
+ if (!nistr) {
/*
* No interface list was specified, allocate a
* ni using the defaults.
goto failed_syntax;
}
- if (use_tcp_bonding &&
- LNET_NETTYP(net->net_id) == SOCKLND) {
- rc = lnet_ni_add_interface(ni, name);
- if (rc != 0)
- goto failed;
- } else {
- ni = lnet_ni_alloc(net, ni_el, name);
- if (IS_ERR_OR_NULL(ni))
- goto failed;
- }
+ ni = lnet_ni_alloc(net, ni_el, name);
+ if (IS_ERR_OR_NULL(ni))
+ goto failed;
if (ni_el) {
if (ni_el != net_el) {
}
static int
-lnet_str2tbs_sep(struct list_head *tbs, char *str)
+lnet_str2tbs_sep(struct list_head *tbs, const char *str)
{
LIST_HEAD(pending);
- char *sep;
+ const char *sep;
int nob;
int i;
struct lnet_text_buf *ltb;
}
static int
-lnet_parse_route (char *str, int *im_a_router)
+lnet_parse_route(char *str, int *im_a_router)
{
/* static scratch buffer OK (single threaded) */
static char cmd[LNET_SINGLE_TEXTBUF_NOB];
LIST_HEAD(gateways);
struct list_head *tmp1;
struct list_head *tmp2;
- __u32 net;
- lnet_nid_t nid;
- struct lnet_text_buf *ltb;
- int rc;
- char *sep;
- char *token = str;
- int ntokens = 0;
- int myrc = -1;
- __u32 hops;
- int got_hops = 0;
- unsigned int priority = 0;
+ __u32 net;
+ lnet_nid_t nid;
+ struct lnet_text_buf *ltb;
+ int rc;
+ char *sep;
+ char *token = str;
+ int ntokens = 0;
+ int myrc = -1;
+ __u32 hops;
+ int got_hops = 0;
+ unsigned int priority = 0;
/* save a copy of the string for error messages */
strncpy(cmd, str, sizeof(cmd));
if (ntokens == 1) {
net = libcfs_str2net(ltb->ltb_text);
- if (net == LNET_NIDNET(LNET_NID_ANY) ||
+ if (net == LNET_NET_ANY ||
LNET_NETTYP(net) == LOLND)
goto token_error;
} else {
goto token_error;
nid = libcfs_str2nid(ltb->ltb_text);
- if (nid == LNET_NID_ANY ||
- LNET_NETTYP(LNET_NIDNET(nid)) == LOLND)
+ if (nid == LNET_NID_ANY || nid == LNET_NID_LO_0)
goto token_error;
}
}
list_for_each(tmp1, &nets) {
ltb = list_entry(tmp1, struct lnet_text_buf, ltb_list);
net = libcfs_str2net(ltb->ltb_text);
- LASSERT (net != LNET_NIDNET(LNET_NID_ANY));
+ LASSERT(net != LNET_NET_ANY);
list_for_each(tmp2, &gateways) {
ltb = list_entry(tmp2, struct lnet_text_buf, ltb_list);
}
int
-lnet_parse_routes (char *routes, int *im_a_router)
+lnet_parse_routes(const char *routes, int *im_a_router)
{
LIST_HEAD(tbs);
int rc = 0;
*sep++ = 0;
net = lnet_netspec2net(tb->ltb_text);
- if (net == LNET_NIDNET(LNET_NID_ANY)) {
+ if (net == LNET_NET_ANY) {
lnet_syntax("ip2nets", source, offset,
strlen(tb->ltb_text));
return -EINVAL;
}
static int
-lnet_match_networks (char **networksp, char *ip2nets, __u32 *ipaddrs, int nip)
+lnet_match_networks(const char **networksp, const char *ip2nets,
+ __u32 *ipaddrs, int nip)
{
static char networks[LNET_SINGLE_TEXTBUF_NOB];
static char source[LNET_SINGLE_TEXTBUF_NOB];
struct list_head *t;
struct list_head *t2;
struct lnet_text_buf *tb;
- struct lnet_text_buf *tb2;
- __u32 net1;
- __u32 net2;
int len;
int count;
- int dup;
int rc;
if (lnet_str2tbs_sep(&raw_entries, ip2nets) < 0) {
if (rc < 0)
break;
- dup = 0;
- list_for_each(t, ¤t_nets) {
- tb = list_entry(t, struct lnet_text_buf, ltb_list);
- net1 = lnet_netspec2net(tb->ltb_text);
- LASSERT(net1 != LNET_NIDNET(LNET_NID_ANY));
-
- list_for_each(t2, &matched_nets) {
- tb2 = list_entry(t2, struct lnet_text_buf,
- ltb_list);
- net2 = lnet_netspec2net(tb2->ltb_text);
- LASSERT(net2 != LNET_NIDNET(LNET_NID_ANY));
-
- if (net1 == net2) {
- dup = 1;
- break;
- }
- }
-
- if (dup)
- break;
- }
-
- if (dup) {
- lnet_free_text_bufs(¤t_nets);
- continue;
- }
-
list_for_each_safe(t, t2, ¤t_nets) {
tb = list_entry(t, struct lnet_text_buf, ltb_list);
*networksp = networks;
return count;
}
-/*
- * kernel 5.3: commit ef11db3310e272d3d8dbe8739e0770820dd20e52
- * added in_dev_for_each_ifa_rtnl and in_dev_for_each_ifa_rcu
- * and removed for_ifa and endfor_ifa.
- * Use the _rntl variant as the current locking is rtnl.
- */
-#ifdef in_dev_for_each_ifa_rtnl
-#define DECLARE_CONST_IN_IFADDR(ifa) const struct in_ifaddr *ifa
-#define endfor_ifa(in_dev)
-#else
-#define DECLARE_CONST_IN_IFADDR(ifa)
-#define in_dev_for_each_ifa_rtnl(ifa, in_dev) for_ifa((in_dev))
-#endif
int lnet_inet_enumerate(struct lnet_inetdev **dev_list, struct net *ns)
{
EXPORT_SYMBOL(lnet_inet_enumerate);
int
-lnet_parse_ip2nets (char **networksp, char *ip2nets)
+lnet_parse_ip2nets(const char **networksp, const char *ip2nets)
{
struct lnet_inetdev *ifaces = NULL;
__u32 *ipaddrs = NULL;
return nip;
}
- LIBCFS_ALLOC(ipaddrs, nip * sizeof(*ipaddrs));
+ CFS_ALLOC_PTR_ARRAY(ipaddrs, nip);
if (!ipaddrs) {
rc = -ENOMEM;
CERROR("lnet: Can't allocate ipaddrs[%d], rc = %d\n",
"any local IP interfaces\n");
rc = -ENOENT;
}
- LIBCFS_FREE(ipaddrs, nip * sizeof(*ipaddrs));
+ CFS_FREE_PTR_ARRAY(ipaddrs, nip);
out_free_addrs:
kfree(ifaces);
return rc > 0 ? 0 : rc;