diff options
-rw-r--r-- | drivers/net/loopback.c | 13 | ||||
-rw-r--r-- | include/linux/netdevice.h | 1 | ||||
-rw-r--r-- | net/core/dev.c | 22 |
3 files changed, 20 insertions, 16 deletions
diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c index 91d08585a6d8..c4516b580ba5 100644 --- a/drivers/net/loopback.c +++ b/drivers/net/loopback.c | |||
@@ -204,17 +204,8 @@ static __net_exit void loopback_net_exit(struct net *net) | |||
204 | unregister_netdev(dev); | 204 | unregister_netdev(dev); |
205 | } | 205 | } |
206 | 206 | ||
207 | static struct pernet_operations __net_initdata loopback_net_ops = { | 207 | /* Registered in net/core/dev.c */ |
208 | struct pernet_operations __net_initdata loopback_net_ops = { | ||
208 | .init = loopback_net_init, | 209 | .init = loopback_net_init, |
209 | .exit = loopback_net_exit, | 210 | .exit = loopback_net_exit, |
210 | }; | 211 | }; |
211 | |||
212 | static int __init loopback_init(void) | ||
213 | { | ||
214 | return register_pernet_device(&loopback_net_ops); | ||
215 | } | ||
216 | |||
217 | /* Loopback is special. It should be initialized before any other network | ||
218 | * device and network subsystem. | ||
219 | */ | ||
220 | fs_initcall(loopback_init); | ||
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index f1b0dbe58464..12d7f4469dc9 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -1766,6 +1766,7 @@ static inline int skb_bond_should_drop(struct sk_buff *skb) | |||
1766 | return 0; | 1766 | return 0; |
1767 | } | 1767 | } |
1768 | 1768 | ||
1769 | extern struct pernet_operations __net_initdata loopback_net_ops; | ||
1769 | #endif /* __KERNEL__ */ | 1770 | #endif /* __KERNEL__ */ |
1770 | 1771 | ||
1771 | #endif /* _LINUX_DEV_H */ | 1772 | #endif /* _LINUX_DEV_H */ |
diff --git a/net/core/dev.c b/net/core/dev.c index 2306d56fbb5e..31568b2068ac 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -4909,9 +4909,6 @@ static int __init net_dev_init(void) | |||
4909 | if (register_pernet_subsys(&netdev_net_ops)) | 4909 | if (register_pernet_subsys(&netdev_net_ops)) |
4910 | goto out; | 4910 | goto out; |
4911 | 4911 | ||
4912 | if (register_pernet_device(&default_device_ops)) | ||
4913 | goto out; | ||
4914 | |||
4915 | /* | 4912 | /* |
4916 | * Initialise the packet receive queues. | 4913 | * Initialise the packet receive queues. |
4917 | */ | 4914 | */ |
@@ -4928,10 +4925,25 @@ static int __init net_dev_init(void) | |||
4928 | queue->backlog.weight = weight_p; | 4925 | queue->backlog.weight = weight_p; |
4929 | } | 4926 | } |
4930 | 4927 | ||
4931 | netdev_dma_register(); | ||
4932 | |||
4933 | dev_boot_phase = 0; | 4928 | dev_boot_phase = 0; |
4934 | 4929 | ||
4930 | /* The loopback device is special if any other network devices | ||
4931 | * is present in a network namespace the loopback device must | ||
4932 | * be present. Since we now dynamically allocate and free the | ||
4933 | * loopback device ensure this invariant is maintained by | ||
4934 | * keeping the loopback device as the first device on the | ||
4935 | * list of network devices. Ensuring the loopback devices | ||
4936 | * is the first device that appears and the last network device | ||
4937 | * that disappears. | ||
4938 | */ | ||
4939 | if (register_pernet_device(&loopback_net_ops)) | ||
4940 | goto out; | ||
4941 | |||
4942 | if (register_pernet_device(&default_device_ops)) | ||
4943 | goto out; | ||
4944 | |||
4945 | netdev_dma_register(); | ||
4946 | |||
4935 | open_softirq(NET_TX_SOFTIRQ, net_tx_action); | 4947 | open_softirq(NET_TX_SOFTIRQ, net_tx_action); |
4936 | open_softirq(NET_RX_SOFTIRQ, net_rx_action); | 4948 | open_softirq(NET_RX_SOFTIRQ, net_rx_action); |
4937 | 4949 | ||