diff mbox series

net: ignore sysctl_devconf_inherit_init_net without SYSCTL

Message ID 20190304203822.2094613-1-arnd@arndb.de
State Accepted
Commit a154d5d83d21af6b9ee32adc5dbcea5ac1fb534c
Headers show
Series net: ignore sysctl_devconf_inherit_init_net without SYSCTL | expand

Commit Message

Arnd Bergmann March 4, 2019, 8:38 p.m. UTC
When CONFIG_SYSCTL is turned off, we get a link failure for
the newly introduced tuning knob.

net/ipv6/addrconf.o: In function `addrconf_init_net':
addrconf.c:(.text+0x31dc): undefined reference to `sysctl_devconf_inherit_init_net'

Add an IS_ENABLED() check to fall back to the default behavior
(sysctl_devconf_inherit_init_net=0) here.

Fixes: 856c395cfa63 ("net: introduce a knob to control whether to inherit devconf config")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

---
 net/ipv4/devinet.c  | 4 +++-
 net/ipv6/addrconf.c | 3 ++-
 2 files changed, 5 insertions(+), 2 deletions(-)

-- 
2.20.0

Comments

Christian Brauner March 4, 2019, 9 p.m. UTC | #1
On Mon, Mar 04, 2019 at 09:38:03PM +0100, Arnd Bergmann wrote:
> When CONFIG_SYSCTL is turned off, we get a link failure for

> the newly introduced tuning knob.

> 

> net/ipv6/addrconf.o: In function `addrconf_init_net':

> addrconf.c:(.text+0x31dc): undefined reference to `sysctl_devconf_inherit_init_net'

> 

> Add an IS_ENABLED() check to fall back to the default behavior

> (sysctl_devconf_inherit_init_net=0) here.

> 

> Fixes: 856c395cfa63 ("net: introduce a knob to control whether to inherit devconf config")

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

> ---

>  net/ipv4/devinet.c  | 4 +++-

>  net/ipv6/addrconf.c | 3 ++-

>  2 files changed, 5 insertions(+), 2 deletions(-)

> 

> diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c

> index cd9033245b98..eb514f312e6f 100644

> --- a/net/ipv4/devinet.c

> +++ b/net/ipv4/devinet.c

> @@ -2614,7 +2614,9 @@ static __net_init int devinet_init_net(struct net *net)

>  	tbl[0].extra2 = net;

>  #endif

>  

> -	if (sysctl_devconf_inherit_init_net != 2 && !net_eq(net, &init_net)) {

> +	if ((!IS_ENABLED(CONFIG_SYSCTL) ||

> +	     sysctl_devconf_inherit_init_net != 2) &&


I'm sure I'm just being stupid here but wouldn't this still trigger the
warning or is sysctl_devconf_inherit_init_net unconditionally defined?
The error you're reporting makes it look like it isn't.

> +	    !net_eq(net, &init_net)) {

>  		memcpy(all, init_net.ipv4.devconf_all, sizeof(ipv4_devconf));

>  		memcpy(dflt, init_net.ipv4.devconf_dflt, sizeof(ipv4_devconf_dflt));

>  	}

> diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c

> index da5a21050ba9..4ae17a966ae3 100644

> --- a/net/ipv6/addrconf.c

> +++ b/net/ipv6/addrconf.c

> @@ -6905,7 +6905,8 @@ static int __net_init addrconf_init_net(struct net *net)

>  	if (!dflt)

>  		goto err_alloc_dflt;

>  

> -	if (sysctl_devconf_inherit_init_net == 1 && !net_eq(net, &init_net)) {

> +	if (IS_ENABLED(CONFIG_SYSCTL) &&

> +	    sysctl_devconf_inherit_init_net == 1 && !net_eq(net, &init_net)) {

>  		memcpy(all, init_net.ipv6.devconf_all, sizeof(ipv6_devconf));

>  		memcpy(dflt, init_net.ipv6.devconf_dflt, sizeof(ipv6_devconf_dflt));

>  	}

> -- 

> 2.20.0

>
Arnd Bergmann March 4, 2019, 9:07 p.m. UTC | #2
On Mon, Mar 4, 2019 at 10:00 PM Christian Brauner <christian@brauner.io> wrote:
>

> On Mon, Mar 04, 2019 at 09:38:03PM +0100, Arnd Bergmann wrote:

> > When CONFIG_SYSCTL is turned off, we get a link failure for

> > the newly introduced tuning knob.

> >

> > net/ipv6/addrconf.o: In function `addrconf_init_net':

> > addrconf.c:(.text+0x31dc): undefined reference to `sysctl_devconf_inherit_init_net'

> >

> > Add an IS_ENABLED() check to fall back to the default behavior

> > (sysctl_devconf_inherit_init_net=0) here.

> >

> > Fixes: 856c395cfa63 ("net: introduce a knob to control whether to inherit devconf config")

> > Signed-off-by: Arnd Bergmann <arnd@arndb.de>

> > ---

> >  net/ipv4/devinet.c  | 4 +++-

> >  net/ipv6/addrconf.c | 3 ++-

> >  2 files changed, 5 insertions(+), 2 deletions(-)

> >

> > diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c

> > index cd9033245b98..eb514f312e6f 100644

> > --- a/net/ipv4/devinet.c

> > +++ b/net/ipv4/devinet.c

> > @@ -2614,7 +2614,9 @@ static __net_init int devinet_init_net(struct net *net)

> >       tbl[0].extra2 = net;

> >  #endif

> >

> > -     if (sysctl_devconf_inherit_init_net != 2 && !net_eq(net, &init_net)) {

> > +     if ((!IS_ENABLED(CONFIG_SYSCTL) ||

> > +          sysctl_devconf_inherit_init_net != 2) &&

>

> I'm sure I'm just being stupid here but wouldn't this still trigger the

> warning or is sysctl_devconf_inherit_init_net unconditionally defined?

> The error you're reporting makes it look like it isn't.


The declaration is unconditional in include/linux/netdevice.h, so the
compiler does not see a problem, it simply doesn't create a reference
when it sees that the code path is dead.

The error message I quoted is from the linker, so this is in turn
not a problem after there is no reference to the variable.

      Arnd
Christian Brauner March 4, 2019, 9:08 p.m. UTC | #3
On Mon, Mar 04, 2019 at 10:07:17PM +0100, Arnd Bergmann wrote:
> On Mon, Mar 4, 2019 at 10:00 PM Christian Brauner <christian@brauner.io> wrote:

> >

> > On Mon, Mar 04, 2019 at 09:38:03PM +0100, Arnd Bergmann wrote:

> > > When CONFIG_SYSCTL is turned off, we get a link failure for

> > > the newly introduced tuning knob.

> > >

> > > net/ipv6/addrconf.o: In function `addrconf_init_net':

> > > addrconf.c:(.text+0x31dc): undefined reference to `sysctl_devconf_inherit_init_net'

> > >

> > > Add an IS_ENABLED() check to fall back to the default behavior

> > > (sysctl_devconf_inherit_init_net=0) here.

> > >

> > > Fixes: 856c395cfa63 ("net: introduce a knob to control whether to inherit devconf config")

> > > Signed-off-by: Arnd Bergmann <arnd@arndb.de>

> > > ---

> > >  net/ipv4/devinet.c  | 4 +++-

> > >  net/ipv6/addrconf.c | 3 ++-

> > >  2 files changed, 5 insertions(+), 2 deletions(-)

> > >

> > > diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c

> > > index cd9033245b98..eb514f312e6f 100644

> > > --- a/net/ipv4/devinet.c

> > > +++ b/net/ipv4/devinet.c

> > > @@ -2614,7 +2614,9 @@ static __net_init int devinet_init_net(struct net *net)

> > >       tbl[0].extra2 = net;

> > >  #endif

> > >

> > > -     if (sysctl_devconf_inherit_init_net != 2 && !net_eq(net, &init_net)) {

> > > +     if ((!IS_ENABLED(CONFIG_SYSCTL) ||

> > > +          sysctl_devconf_inherit_init_net != 2) &&

> >

> > I'm sure I'm just being stupid here but wouldn't this still trigger the

> > warning or is sysctl_devconf_inherit_init_net unconditionally defined?

> > The error you're reporting makes it look like it isn't.

> 

> The declaration is unconditional in include/linux/netdevice.h, so the

> compiler does not see a problem, it simply doesn't create a reference

> when it sees that the code path is dead.

> 

> The error message I quoted is from the linker, so this is in turn

> not a problem after there is no reference to the variable.


Perfect!

Acked-by: Christian Brauner <christian@brauner.io>
David Miller March 4, 2019, 9:14 p.m. UTC | #4
From: Arnd Bergmann <arnd@arndb.de>

Date: Mon,  4 Mar 2019 21:38:03 +0100

> When CONFIG_SYSCTL is turned off, we get a link failure for

> the newly introduced tuning knob.

> 

> net/ipv6/addrconf.o: In function `addrconf_init_net':

> addrconf.c:(.text+0x31dc): undefined reference to `sysctl_devconf_inherit_init_net'

> 

> Add an IS_ENABLED() check to fall back to the default behavior

> (sysctl_devconf_inherit_init_net=0) here.

> 

> Fixes: 856c395cfa63 ("net: introduce a knob to control whether to inherit devconf config")

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>


Applied, thanks Arnd.
diff mbox series

Patch

diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index cd9033245b98..eb514f312e6f 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -2614,7 +2614,9 @@  static __net_init int devinet_init_net(struct net *net)
 	tbl[0].extra2 = net;
 #endif
 
-	if (sysctl_devconf_inherit_init_net != 2 && !net_eq(net, &init_net)) {
+	if ((!IS_ENABLED(CONFIG_SYSCTL) ||
+	     sysctl_devconf_inherit_init_net != 2) &&
+	    !net_eq(net, &init_net)) {
 		memcpy(all, init_net.ipv4.devconf_all, sizeof(ipv4_devconf));
 		memcpy(dflt, init_net.ipv4.devconf_dflt, sizeof(ipv4_devconf_dflt));
 	}
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index da5a21050ba9..4ae17a966ae3 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -6905,7 +6905,8 @@  static int __net_init addrconf_init_net(struct net *net)
 	if (!dflt)
 		goto err_alloc_dflt;
 
-	if (sysctl_devconf_inherit_init_net == 1 && !net_eq(net, &init_net)) {
+	if (IS_ENABLED(CONFIG_SYSCTL) &&
+	    sysctl_devconf_inherit_init_net == 1 && !net_eq(net, &init_net)) {
 		memcpy(all, init_net.ipv6.devconf_all, sizeof(ipv6_devconf));
 		memcpy(dflt, init_net.ipv6.devconf_dflt, sizeof(ipv6_devconf_dflt));
 	}