<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">
Reviewed-by: Doug Oucharek &lt;<a href="mailto:dougso@me.com" class="">dougso@me.com</a>&gt;
<div class=""><br class="">
</div>
<div class="">Note:</div>
<div class="">I did not think your changes would collide with Multi-Rail. &nbsp;Unfortunately, it looks like this one does. &nbsp;This config code was changed quite a bit by the Multi-Rail feature. &nbsp;However, it is ok as landing this change now will prompt the Multi-Rail
 changes to utilize the better way of getting interface information. &nbsp;Just a heads up to Multi-Rail porters.</div>
<div class=""><br class="">
</div>
<div class="">Doug</div>
<div class=""><br class="">
<div>
<blockquote type="cite" class="">
<div class="">On Jul 24, 2018, at 4:07 PM, NeilBrown &lt;<a href="mailto:neilb@suse.com" class="">neilb@suse.com</a>&gt; wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div class="">for_each_netdev() is a more direct interface than<br class="">
lnet_ipif_enumerate(), so use it instead. &nbsp;Also get<br class="">
address and 'up' status directly from the device.<br class="">
<br class="">
This means we need to possible re-allocate the storage<br class="">
space if there are lots of IP addresses.<br class="">
<br class="">
However there is no need to resize the allocation down if we<br class="">
over-allocated. &nbsp;This is only used once, and is freed soon<br class="">
after it is allocated, so that is a false optimization.<br class="">
<br class="">
Signed-off-by: NeilBrown &lt;<a href="mailto:neilb@suse.com" class="">neilb@suse.com</a>&gt;<br class="">
---<br class="">
drivers/staging/lustre/lnet/lnet/config.c | &nbsp;&nbsp;78 &#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;----------------<br class="">
1 file changed, 35 insertions(&#43;), 43 deletions(-)<br class="">
<br class="">
diff --git a/drivers/staging/lustre/lnet/lnet/config.c b/drivers/staging/lustre/lnet/lnet/config.c<br class="">
index 55ecc1998b7e..136905db2746 100644<br class="">
--- a/drivers/staging/lustre/lnet/lnet/config.c<br class="">
&#43;&#43;&#43; b/drivers/staging/lustre/lnet/lnet/config.c<br class="">
@@ -36,6 &#43;36,7 @@<br class="">
#include &lt;net/net_namespace.h&gt;<br class="">
#include &lt;linux/ctype.h&gt;<br class="">
#include &lt;linux/lnet/lib-lnet.h&gt;<br class="">
&#43;#include &lt;linux/inetdevice.h&gt;<br class="">
<br class="">
struct lnet_text_buf {<span class="Apple-tab-span" style="white-space:pre"> </span>
&nbsp;&nbsp;&nbsp;/* tmp struct for parsing routes */<br class="">
<span class="Apple-tab-span" style="white-space:pre"></span>struct list_head ltb_list;<span class="Apple-tab-span" style="white-space:pre">
</span>/* stash on lists */<br class="">
@@ -1134,66 &#43;1135,57 @@ lnet_match_networks(char **networksp, char *ip2nets, __u32 *ipaddrs, int nip)<br class="">
static int<br class="">
lnet_ipaddr_enumerate(__u32 **ipaddrsp)<br class="">
{<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span>int up;<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span>__u32 netmask;<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span>struct net_device *dev;<br class="">
<span class="Apple-tab-span" style="white-space:pre"></span>__u32 *ipaddrs;<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span>__u32 *ipaddrs2;<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span>int nalloc = 64;<br class="">
<span class="Apple-tab-span" style="white-space:pre"></span>int nip;<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span>char **ifnames;<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span>int nif = lnet_ipif_enumerate(&amp;ifnames);<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span>int i;<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span>int rc;<br class="">
<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span>if (nif &lt;= 0)<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>return nif;<br class="">
-<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span>ipaddrs = kcalloc(nif, sizeof(*ipaddrs), GFP_KERNEL);<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span>ipaddrs = kcalloc(nalloc, sizeof(*ipaddrs), GFP_KERNEL);<br class="">
<span class="Apple-tab-span" style="white-space:pre"></span>if (!ipaddrs) {<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>CERROR(&quot;Can't allocate ipaddrs[%d]\n&quot;, nif);<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>lnet_ipif_free_enumeration(ifnames, nif);<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>CERROR(&quot;Can't allocate ipaddrs[%d]\n&quot;, nalloc);<br class="">
<span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>return -ENOMEM;<br class="">
<span class="Apple-tab-span" style="white-space:pre"></span>}<br class="">
<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span>for (i = nip = 0; i &lt; nif; i&#43;&#43;) {<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>if (!strcmp(ifnames[i], &quot;lo&quot;))<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span>rtnl_lock();<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span>for_each_netdev(&amp;init_net, dev) {<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>struct in_device *in_dev;<br class="">
&#43;<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>if (strcmp(dev-&gt;name, &quot;lo&quot;) == 0)<br class="">
<span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>continue;<br class="">
<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>rc = lnet_ipif_query(ifnames[i], &amp;up, &amp;ipaddrs[nip], &amp;netmask);<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>if (rc) {<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>CWARN(&quot;Can't query interface %s: %d\n&quot;,<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifnames[i], rc);<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>if (!(dev_get_flags(dev) &amp; IFF_UP)) {<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>CWARN(&quot;Ignoring interface %s: it's down\n&quot;, dev-&gt;name);<br class="">
<span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>continue;<br class="">
<span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>}<br class="">
-<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>if (!up) {<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>CWARN(&quot;Ignoring interface %s: it's down\n&quot;,<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifnames[i]);<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>in_dev = __in_dev_get_rtnl(dev);<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>if (!in_dev) {<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>CWARN(&quot;Interface %s has no IPv4 status.\n&quot;, dev-&gt;name);<br class="">
<span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>continue;<br class="">
<span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>}<br class="">
<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>nip&#43;&#43;;<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span>}<br class="">
-<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span>lnet_ipif_free_enumeration(ifnames, nif);<br class="">
-<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span>if (nip == nif) {<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>*ipaddrsp = ipaddrs;<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span>} else {<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>if (nip &gt; 0) {<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>ipaddrs2 = kcalloc(nip, sizeof(*ipaddrs2),<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;&nbsp;GFP_KERNEL);<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>if (!ipaddrs2) {<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>CERROR(&quot;Can't allocate
 ipaddrs[%d]\n&quot;, nip);<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>nip = -ENOMEM;<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>} else {<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>memcpy(ipaddrs2,
 ipaddrs,<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nip * sizeof(*ipaddrs));<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>*ipaddrsp = ipaddrs2;<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>rc = nip;<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>if (nip &gt;= nalloc) {<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>__u32 *ipaddrs2;<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>nalloc &#43;= nalloc;<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>ipaddrs2 = krealloc(ipaddrs, nalloc * sizeof(*ipaddrs2),<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;&nbsp;&nbsp;GFP_KERNEL);<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>if (ipaddrs2 == NULL) {<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>kfree(ipaddrs);<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>CERROR(&quot;Can't allocate
 ipaddrs[%d]\n&quot;, nalloc);<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>return -ENOMEM;<br class="">
<span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>}<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>ipaddrs = ipaddrs2;<br class="">
<span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>}<br class="">
-<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>kfree(ipaddrs);<br class="">
&#43;<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>for_primary_ifa(in_dev)<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>if (strcmp(ifa-&gt;ifa_label, dev-&gt;name) == 0) {<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>ipaddrs[nip&#43;&#43;]
 = ifa-&gt;ifa_local;<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>break;<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span>}<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span><span class="Apple-tab-span" style="white-space:pre"></span>endfor_ifa(in_dev);<br class="">
<span class="Apple-tab-span" style="white-space:pre"></span>}<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span>rtnl_unlock();<br class="">
&#43;<br class="">
&#43;<span class="Apple-tab-span" style="white-space:pre"> </span>*ipaddrsp = ipaddrs;<br class="">
<span class="Apple-tab-span" style="white-space:pre"></span>return nip;<br class="">
}<br class="">
<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
lustre-devel mailing list<br class="">
<a href="mailto:lustre-devel@lists.lustre.org" class="">lustre-devel@lists.lustre.org</a><br class="">
http://lists.lustre.org/listinfo.cgi/lustre-devel-lustre.org<br class="">
</div>
</div>
</blockquote>
</div>
<br class="">
</div>
</body>
</html>