Skip to content

Commit

Permalink
ipv4: Link IPv4 address to per-netns hash table.
Browse files Browse the repository at this point in the history
As a prep for per-netns RTNL conversion, we want to namespacify
the IPv4 address hash table and the GC work.

Let's allocate the per-netns IPv4 address hash table to
net->ipv4.inet_addr_lst and link IPv4 addresses into it.

The actual users will be converted later.

Note that the IPv6 address hash table is already namespacified.

Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20241008172906.1326-2-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Kuniyuki Iwashima authored and Jakub Kicinski committed Oct 10, 2024
1 parent 22ee378 commit 8717302
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 3 deletions.
1 change: 1 addition & 0 deletions include/linux/inetdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ static inline void ipv4_devconf_setall(struct in_device *in_dev)

struct in_ifaddr {
struct hlist_node hash;
struct hlist_node addr_lst;
struct in_ifaddr __rcu *ifa_next;
struct in_device *ifa_dev;
struct rcu_head rcu_head;
Expand Down
1 change: 1 addition & 0 deletions include/net/netns/ipv4.h
Original file line number Diff line number Diff line change
Expand Up @@ -270,5 +270,6 @@ struct netns_ipv4 {

atomic_t rt_genid;
siphash_key_t ip_id_key;
struct hlist_head *inet_addr_lst;
};
#endif
22 changes: 19 additions & 3 deletions net/ipv4/devinet.c
Original file line number Diff line number Diff line change
Expand Up @@ -134,11 +134,13 @@ static void inet_hash_insert(struct net *net, struct in_ifaddr *ifa)

ASSERT_RTNL();
hlist_add_head_rcu(&ifa->hash, &inet_addr_lst[hash]);
hlist_add_head_rcu(&ifa->addr_lst, &net->ipv4.inet_addr_lst[hash]);
}

static void inet_hash_remove(struct in_ifaddr *ifa)
{
ASSERT_RTNL();
hlist_del_init_rcu(&ifa->addr_lst);
hlist_del_init_rcu(&ifa->hash);
}

Expand Down Expand Up @@ -228,6 +230,7 @@ static struct in_ifaddr *inet_alloc_ifa(struct in_device *in_dev)
ifa->ifa_dev = in_dev;

INIT_HLIST_NODE(&ifa->hash);
INIT_HLIST_NODE(&ifa->addr_lst);

return ifa;
}
Expand Down Expand Up @@ -2663,14 +2666,21 @@ static struct ctl_table ctl_forward_entry[] = {

static __net_init int devinet_init_net(struct net *net)
{
int err;
struct ipv4_devconf *all, *dflt;
#ifdef CONFIG_SYSCTL
struct ctl_table *tbl;
struct ctl_table_header *forw_hdr;
struct ctl_table *tbl;
#endif
struct ipv4_devconf *all, *dflt;
int err;
int i;

err = -ENOMEM;
net->ipv4.inet_addr_lst = kmalloc_array(IN4_ADDR_HSIZE,
sizeof(struct hlist_head),
GFP_KERNEL);
if (!net->ipv4.inet_addr_lst)
goto err_alloc_hash;

all = kmemdup(&ipv4_devconf, sizeof(ipv4_devconf), GFP_KERNEL);
if (!all)
goto err_alloc_all;
Expand Down Expand Up @@ -2731,6 +2741,9 @@ static __net_init int devinet_init_net(struct net *net)
net->ipv4.forw_hdr = forw_hdr;
#endif

for (i = 0; i < IN4_ADDR_HSIZE; i++)
INIT_HLIST_HEAD(&net->ipv4.inet_addr_lst[i]);

net->ipv4.devconf_all = all;
net->ipv4.devconf_dflt = dflt;
return 0;
Expand All @@ -2748,6 +2761,8 @@ static __net_init int devinet_init_net(struct net *net)
err_alloc_dflt:
kfree(all);
err_alloc_all:
kfree(net->ipv4.inet_addr_lst);
err_alloc_hash:
return err;
}

Expand All @@ -2766,6 +2781,7 @@ static __net_exit void devinet_exit_net(struct net *net)
#endif
kfree(net->ipv4.devconf_dflt);
kfree(net->ipv4.devconf_all);
kfree(net->ipv4.inet_addr_lst);
}

static __net_initdata struct pernet_operations devinet_ops = {
Expand Down

0 comments on commit 8717302

Please sign in to comment.