Skip to content

Commit 607ea7c

Browse files
koct9idavem330
authored andcommitted
net/ipv6/addrconf: simplify sysctl registration
Struct ctl_table_header holds pointer to sysctl table which could be used for freeing it after unregistration. IPv4 sysctls already use that. Remove redundant NULL assignment: ndev allocated using kzalloc. This also saves some bytes: sysctl table could be shorter than DEVCONF_MAX+1 if some options are disable in config. Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 35c5845 commit 607ea7c

File tree

2 files changed

+19
-27
lines changed

2 files changed

+19
-27
lines changed

include/linux/ipv6.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ struct ipv6_devconf {
6363
} stable_secret;
6464
__s32 use_oif_addrs_only;
6565
__s32 keep_addr_on_down;
66-
void *sysctl;
66+
67+
struct ctl_table_header *sysctl_header;
6768
};
6869

6970
struct ipv6_params {

net/ipv6/addrconf.c

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,6 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
359359
ndev->addr_gen_mode = IN6_ADDR_GEN_MODE_EUI64;
360360

361361
ndev->cnf.mtu6 = dev->mtu;
362-
ndev->cnf.sysctl = NULL;
363362
ndev->nd_parms = neigh_parms_alloc(dev, &nd_tbl);
364363
if (!ndev->nd_parms) {
365364
kfree(ndev);
@@ -5620,13 +5619,7 @@ int addrconf_sysctl_ignore_routes_with_linkdown(struct ctl_table *ctl,
56205619
return ret;
56215620
}
56225621

5623-
static struct addrconf_sysctl_table
5624-
{
5625-
struct ctl_table_header *sysctl_header;
5626-
struct ctl_table addrconf_vars[DEVCONF_MAX+1];
5627-
} addrconf_sysctl __read_mostly = {
5628-
.sysctl_header = NULL,
5629-
.addrconf_vars = {
5622+
static const struct ctl_table addrconf_sysctl[] = {
56305623
{
56315624
.procname = "forwarding",
56325625
.data = &ipv6_devconf.forwarding,
@@ -5944,52 +5937,50 @@ static struct addrconf_sysctl_table
59445937
{
59455938
/* sentinel */
59465939
}
5947-
},
59485940
};
59495941

59505942
static int __addrconf_sysctl_register(struct net *net, char *dev_name,
59515943
struct inet6_dev *idev, struct ipv6_devconf *p)
59525944
{
59535945
int i;
5954-
struct addrconf_sysctl_table *t;
5946+
struct ctl_table *table;
59555947
char path[sizeof("net/ipv6/conf/") + IFNAMSIZ];
59565948

5957-
t = kmemdup(&addrconf_sysctl, sizeof(*t), GFP_KERNEL);
5958-
if (!t)
5949+
table = kmemdup(addrconf_sysctl, sizeof(addrconf_sysctl), GFP_KERNEL);
5950+
if (!table)
59595951
goto out;
59605952

5961-
for (i = 0; t->addrconf_vars[i].data; i++) {
5962-
t->addrconf_vars[i].data += (char *)p - (char *)&ipv6_devconf;
5963-
t->addrconf_vars[i].extra1 = idev; /* embedded; no ref */
5964-
t->addrconf_vars[i].extra2 = net;
5953+
for (i = 0; table[i].data; i++) {
5954+
table[i].data += (char *)p - (char *)&ipv6_devconf;
5955+
table[i].extra1 = idev; /* embedded; no ref */
5956+
table[i].extra2 = net;
59655957
}
59665958

59675959
snprintf(path, sizeof(path), "net/ipv6/conf/%s", dev_name);
59685960

5969-
t->sysctl_header = register_net_sysctl(net, path, t->addrconf_vars);
5970-
if (!t->sysctl_header)
5961+
p->sysctl_header = register_net_sysctl(net, path, table);
5962+
if (!p->sysctl_header)
59715963
goto free;
59725964

5973-
p->sysctl = t;
59745965
return 0;
59755966

59765967
free:
5977-
kfree(t);
5968+
kfree(table);
59785969
out:
59795970
return -ENOBUFS;
59805971
}
59815972

59825973
static void __addrconf_sysctl_unregister(struct ipv6_devconf *p)
59835974
{
5984-
struct addrconf_sysctl_table *t;
5975+
struct ctl_table *table;
59855976

5986-
if (!p->sysctl)
5977+
if (!p->sysctl_header)
59875978
return;
59885979

5989-
t = p->sysctl;
5990-
p->sysctl = NULL;
5991-
unregister_net_sysctl_table(t->sysctl_header);
5992-
kfree(t);
5980+
table = p->sysctl_header->ctl_table_arg;
5981+
unregister_net_sysctl_table(p->sysctl_header);
5982+
p->sysctl_header = NULL;
5983+
kfree(table);
59935984
}
59945985

59955986
static int addrconf_sysctl_register(struct inet6_dev *idev)

0 commit comments

Comments
 (0)