From 6a0879fff048b82fc4bb349e371e9dac00a3c673 Mon Sep 17 00:00:00 2001 From: "Eric W. Biederman" Date: Fri, 7 Nov 2008 22:54:20 -0800 Subject: [PATCH] --- yaml --- r: 121744 b: refs/heads/master c: 505d4f73dda9e20d59da05008f1f5eb432613e71 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/net/loopback.c | 13 ++----------- trunk/include/linux/netdevice.h | 1 + trunk/net/core/dev.c | 22 +++++++++++++++++----- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/[refs] b/[refs] index 2bf49343c15f..4b5227bafca5 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5d6d480908300a0c0b3be8b58567dfcef62c83a5 +refs/heads/master: 505d4f73dda9e20d59da05008f1f5eb432613e71 diff --git a/trunk/drivers/net/loopback.c b/trunk/drivers/net/loopback.c index 91d08585a6d8..c4516b580ba5 100644 --- a/trunk/drivers/net/loopback.c +++ b/trunk/drivers/net/loopback.c @@ -204,17 +204,8 @@ static __net_exit void loopback_net_exit(struct net *net) unregister_netdev(dev); } -static struct pernet_operations __net_initdata loopback_net_ops = { +/* Registered in net/core/dev.c */ +struct pernet_operations __net_initdata loopback_net_ops = { .init = loopback_net_init, .exit = loopback_net_exit, }; - -static int __init loopback_init(void) -{ - return register_pernet_device(&loopback_net_ops); -} - -/* Loopback is special. It should be initialized before any other network - * device and network subsystem. - */ -fs_initcall(loopback_init); diff --git a/trunk/include/linux/netdevice.h b/trunk/include/linux/netdevice.h index f1b0dbe58464..12d7f4469dc9 100644 --- a/trunk/include/linux/netdevice.h +++ b/trunk/include/linux/netdevice.h @@ -1766,6 +1766,7 @@ static inline int skb_bond_should_drop(struct sk_buff *skb) return 0; } +extern struct pernet_operations __net_initdata loopback_net_ops; #endif /* __KERNEL__ */ #endif /* _LINUX_DEV_H */ diff --git a/trunk/net/core/dev.c b/trunk/net/core/dev.c index 2306d56fbb5e..31568b2068ac 100644 --- a/trunk/net/core/dev.c +++ b/trunk/net/core/dev.c @@ -4909,9 +4909,6 @@ static int __init net_dev_init(void) if (register_pernet_subsys(&netdev_net_ops)) goto out; - if (register_pernet_device(&default_device_ops)) - goto out; - /* * Initialise the packet receive queues. */ @@ -4928,10 +4925,25 @@ static int __init net_dev_init(void) queue->backlog.weight = weight_p; } - netdev_dma_register(); - dev_boot_phase = 0; + /* The loopback device is special if any other network devices + * is present in a network namespace the loopback device must + * be present. Since we now dynamically allocate and free the + * loopback device ensure this invariant is maintained by + * keeping the loopback device as the first device on the + * list of network devices. Ensuring the loopback devices + * is the first device that appears and the last network device + * that disappears. + */ + if (register_pernet_device(&loopback_net_ops)) + goto out; + + if (register_pernet_device(&default_device_ops)) + goto out; + + netdev_dma_register(); + open_softirq(NET_TX_SOFTIRQ, net_tx_action); open_softirq(NET_RX_SOFTIRQ, net_rx_action);