[Devel] [patch 08/20] [Network namespace] Move the dev name hash relative to the namespace.
dlezcano at fr.ibm.com
dlezcano at fr.ibm.com
Sun Dec 10 13:58:25 PST 2006
Signed-off-by: Daniel Lezcano <dlezcano at fr.ibm.com>
---
include/linux/net_namespace.h | 14 ++++++++++++++
include/linux/netdevice.h | 1 +
net/core/dev.c | 17 ++++++++++++-----
net/core/net_namespace.c | 32 +++++++++++++++++++++++++++++++-
4 files changed, 58 insertions(+), 6 deletions(-)
Index: 2.6.19-rc6-mm2/net/core/dev.c
===================================================================
--- 2.6.19-rc6-mm2.orig/net/core/dev.c
+++ 2.6.19-rc6-mm2/net/core/dev.c
@@ -188,9 +188,13 @@ EXPORT_SYMBOL(dev_base);
DEFINE_RWLOCK(dev_base_lock);
EXPORT_SYMBOL(dev_base_lock);
-#define NETDEV_HASHBITS 8
+#ifdef CONFIG_NET_NS
+#define dev_name_head (current_net_ns->net_device.name_head)
+#define dev_index_head (current_net_ns->net_device.index_head)
+#else
static struct hlist_head dev_name_head[1<<NETDEV_HASHBITS];
static struct hlist_head dev_index_head[1<<NETDEV_HASHBITS];
+#endif
static inline struct hlist_head *dev_name_hash(const char *name,
struct net_namespace *ns)
@@ -486,13 +490,11 @@ __setup("netdev=", netdev_boot_setup);
struct net_device *__dev_get_by_name(const char *name)
{
struct hlist_node *p;
- struct net_namespace *ns = current_net_ns;
+ struct net_namespace *net_ns = current_net_ns;
- hlist_for_each(p, dev_name_hash(name, ns)) {
+ hlist_for_each(p, dev_name_hash(name, net_ns)) {
struct net_device *dev
= hlist_entry(p, struct net_device, name_hlist);
- if (!net_ns_match(dev->net_ns, ns))
- continue;
if (!strncmp(dev->name, name, IFNAMSIZ))
return dev;
}
@@ -3636,6 +3638,11 @@ static int __init net_dev_init(void)
if (netdev_sysfs_init())
goto out;
+#ifdef CONFIG_NET_NS
+ if (hlist_dev_name_init(current_net_ns))
+ goto out;
+#endif
+
INIT_LIST_HEAD(&ptype_all);
for (i = 0; i < 16; i++)
INIT_LIST_HEAD(&ptype_base[i]);
Index: 2.6.19-rc6-mm2/net/core/net_namespace.c
===================================================================
--- 2.6.19-rc6-mm2.orig/net/core/net_namespace.c
+++ 2.6.19-rc6-mm2/net/core/net_namespace.c
@@ -12,6 +12,8 @@
#include <linux/net.h>
#include <linux/netdevice.h>
#include <net/ip_fib.h>
+#include <linux/inetdevice.h>
+#include <linux/in.h>
static spinlock_t net_ns_list_lock = SPIN_LOCK_UNLOCKED;
@@ -31,6 +33,33 @@ struct net_namespace init_net_ns = {
#ifdef CONFIG_NET_NS
+int hlist_dev_name_init(struct net_namespace *net_ns)
+{
+ struct hlist_head *hlist_index, *hlist_name;
+ const int size = sizeof(struct hlist_head)*(1<<NETDEV_HASHBITS);
+
+ hlist_name = kmalloc(size, GFP_KERNEL);
+ if (!hlist_name)
+ return -ENOMEM;
+
+ hlist_index = kmalloc(size, GFP_KERNEL);
+ if (!hlist_index) {
+ kfree(hlist_name);
+ return -ENOMEM;
+ }
+
+ net_ns->net_device.name_head = hlist_name;
+ net_ns->net_device.index_head = hlist_index;
+
+ return 0;
+}
+
+static inline void hlist_dev_name_cleanup(struct net_namespace *net_ns)
+{
+ kfree(net_ns->net_device.name_head);
+ kfree(net_ns->net_device.index_head);
+}
+
/*
* Clone a new ns copying an original net ns, setting refcount to 1
* @level: level of namespace to create
@@ -52,7 +81,6 @@ static struct net_namespace *clone_net_n
kref_init(&ns->kref);
ns->ns = old_ns->ns;
- ns->hash = net_random();
INIT_LIST_HEAD(&ns->child_list);
spin_lock_irq(&net_ns_list_lock);
get_net_ns(old_ns);
@@ -62,6 +90,7 @@ static struct net_namespace *clone_net_n
if (level == NET_NS_LEVEL2) {
+ ns->hash = net_random();
ns->dev_base_p = NULL;
ns->dev_tail_p = &ns->dev_base_p;
@@ -153,4 +182,5 @@ void free_net_ns(struct kref *kref)
}
/* because of put_net_ns() */
EXPORT_SYMBOL(free_net_ns);
+
#endif /* CONFIG_NET_NS */
Index: 2.6.19-rc6-mm2/include/linux/net_namespace.h
===================================================================
--- 2.6.19-rc6-mm2.orig/include/linux/net_namespace.h
+++ 2.6.19-rc6-mm2/include/linux/net_namespace.h
@@ -5,11 +5,18 @@
#include <linux/nsproxy.h>
#include <linux/errno.h>
+struct net_ns_net_device {
+ struct hlist_head *name_head;
+ struct hlist_head *index_head;
+};
+
struct net_namespace {
struct kref kref;
struct nsproxy *ns;
struct net_device *dev_base_p, **dev_tail_p;
struct net_device *loopback_dev_p;
+ struct net_ns_net_device net_device;
+
struct pcpu_lstats *pcpu_lstats_p;
#ifndef CONFIG_IP_MULTIPLE_TABLES
struct fib_table *fib4_local_table, *fib4_main_table;
@@ -77,6 +84,8 @@ static inline void pop_net_ns(struct net
extern struct net_namespace *find_net_ns(unsigned int id);
+extern int hlist_dev_name_init(struct net_namespace *net_ns);
+
#else /* CONFIG_NET_NS */
#define INIT_NET_NS(net_ns)
@@ -123,6 +132,11 @@ static inline struct net_namespace *find
return NULL;
}
+static inline int net_ns_ioctl(unsigned int cmd, void __user *arg)
+{
+ return 0;
+}
+
#endif /* !CONFIG_NET_NS */
#endif /* _LINUX_NET_NAMESPACE_H */
Index: 2.6.19-rc6-mm2/include/linux/netdevice.h
===================================================================
--- 2.6.19-rc6-mm2.orig/include/linux/netdevice.h
+++ 2.6.19-rc6-mm2/include/linux/netdevice.h
@@ -81,6 +81,7 @@ struct netpoll_info;
#define NETDEV_TX_BUSY 1 /* driver tx path was busy*/
#define NETDEV_TX_LOCKED -1 /* driver tx lock was already taken */
+#define NETDEV_HASHBITS 8 /* hash bit size for netdev hash table */
/*
* Compute the worst case header length according to the protocols
* used.
--
_______________________________________________
Containers mailing list
Containers at lists.osdl.org
https://lists.osdl.org/mailman/listinfo/containers
More information about the Devel
mailing list