X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lnet%2Flnet%2Fconfig.c;h=f6ade3993fccf118f4de0e9dbf1424c63eac417f;hp=955997519f98f6150c99d1f0bd10405977110727;hb=b77a6d86936;hpb=135b5c0009e5201ac70394ee1fe98e523fe86072 diff --git a/lnet/lnet/config.c b/lnet/lnet/config.c index 9559975..f6ade39 100644 --- a/lnet/lnet/config.c +++ b/lnet/lnet/config.c @@ -27,7 +27,6 @@ */ /* * This file is part of Lustre, http://www.lustre.org/ - * Lustre is a trademark of Sun Microsystems, Inc. */ #define DEBUG_SUBSYSTEM S_LNET @@ -113,29 +112,13 @@ lnet_ni_unique_net(struct list_head *nilist, char *iface) 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) { @@ -165,15 +148,14 @@ lnet_net_append_cpts(__u32 *cpts, __u32 ncpts, struct lnet_net *net) 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)); @@ -181,7 +163,7 @@ lnet_net_append_cpts(__u32 *cpts, __u32 ncpts, struct lnet_net *net) 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; @@ -197,24 +179,24 @@ lnet_net_append_cpts(__u32 *cpts, __u32 ncpts, struct lnet_net *net) __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; } @@ -265,8 +247,7 @@ lnet_net_remove_cpts(__u32 *cpts, __u32 ncpts, struct lnet_net *net) * 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; } @@ -283,9 +264,8 @@ lnet_net_remove_cpts(__u32 *cpts, __u32 ncpts, struct lnet_net *net) * 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; } @@ -297,8 +277,6 @@ lnet_net_remove_cpts(__u32 *cpts, __u32 ncpts, struct lnet_net *net) 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) @@ -310,10 +288,9 @@ lnet_ni_free(struct lnet_ni *ni) 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 */ @@ -349,8 +326,7 @@ lnet_net_free(struct lnet_net *net) } 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)); } @@ -360,10 +336,10 @@ lnet_net_alloc(__u32 net_id, struct list_head *net_list) { 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)); @@ -377,11 +353,14 @@ lnet_net_alloc(__u32 net_id, struct list_head *net_list) 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; @@ -397,41 +376,32 @@ lnet_net_alloc(__u32 net_id, struct list_head *net_list) 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; } @@ -485,6 +455,7 @@ lnet_ni_alloc_common(struct lnet_net *net, char *iface) 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); /* @@ -526,7 +497,7 @@ lnet_ni_alloc(struct lnet_net *net, struct cfs_expr_list *el, char *iface) 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; } @@ -559,7 +530,8 @@ lnet_ni_alloc_w_cpt_array(struct lnet_net *net, __u32 *cpts, __u32 ncpts, 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); @@ -581,8 +553,7 @@ failed: * 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; @@ -695,7 +666,7 @@ lnet_parse_networks(struct list_head *netlist, char *networks, * 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; @@ -724,8 +695,7 @@ lnet_parse_networks(struct list_head *netlist, char *networks, 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. @@ -804,16 +774,9 @@ lnet_parse_networks(struct list_head *netlist, char *networks, 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) { @@ -902,10 +865,10 @@ lnet_free_text_bufs(struct list_head *tbs) } 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; @@ -1104,7 +1067,7 @@ lnet_parse_priority(char *str, unsigned int *priority, char **token) } 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]; @@ -1113,17 +1076,17 @@ lnet_parse_route (char *str, int *im_a_router) 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)); @@ -1184,7 +1147,7 @@ lnet_parse_route (char *str, int *im_a_router) 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 { @@ -1194,8 +1157,7 @@ lnet_parse_route (char *str, int *im_a_router) 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; } } @@ -1212,7 +1174,7 @@ lnet_parse_route (char *str, int *im_a_router) 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); @@ -1267,7 +1229,7 @@ lnet_parse_route_tbs(struct list_head *tbs, int *im_a_router) } 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; @@ -1423,7 +1385,7 @@ lnet_splitnets(char *source, struct list_head *nets) *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; @@ -1461,7 +1423,8 @@ lnet_splitnets(char *source, struct list_head *nets) } 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]; @@ -1472,12 +1435,8 @@ lnet_match_networks (char **networksp, char *ip2nets, __u32 *ipaddrs, int nip) 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) { @@ -1517,33 +1476,6 @@ lnet_match_networks (char **networksp, char *ip2nets, __u32 *ipaddrs, int nip) 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); @@ -1575,19 +1507,6 @@ lnet_match_networks (char **networksp, char *ip2nets, __u32 *ipaddrs, int nip) *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) { @@ -1663,7 +1582,7 @@ unlock_rtnl: 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; @@ -1687,7 +1606,7 @@ lnet_parse_ip2nets (char **networksp, char *ip2nets) 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", @@ -1706,7 +1625,7 @@ lnet_parse_ip2nets (char **networksp, char *ip2nets) "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;