@@ -2394,12 +2394,13 @@ static int __init xfrm_statistics_init(void)
23942394}
23952395#endif
23962396
2397- static void __init xfrm_policy_init (void )
2397+ static int __net_init xfrm_policy_init (struct net * net )
23982398{
23992399 unsigned int hmask , sz ;
24002400 int dir ;
24012401
2402- xfrm_dst_cache = kmem_cache_create ("xfrm_dst_cache" ,
2402+ if (net_eq (net , & init_net ))
2403+ xfrm_dst_cache = kmem_cache_create ("xfrm_dst_cache" ,
24032404 sizeof (struct xfrm_dst ),
24042405 0 , SLAB_HWCACHE_ALIGN |SLAB_PANIC ,
24052406 NULL );
@@ -2425,16 +2426,50 @@ static void __init xfrm_policy_init(void)
24252426 }
24262427
24272428 INIT_LIST_HEAD (& xfrm_policy_all );
2428- register_netdevice_notifier (& xfrm_dev_notifier );
2429+ if (net_eq (net , & init_net ))
2430+ register_netdevice_notifier (& xfrm_dev_notifier );
2431+ return 0 ;
2432+ }
2433+
2434+ static void xfrm_policy_fini (struct net * net )
2435+ {
24292436}
24302437
2438+ static int __net_init xfrm_net_init (struct net * net )
2439+ {
2440+ int rv ;
2441+
2442+ rv = xfrm_state_init (net );
2443+ if (rv < 0 )
2444+ goto out_state ;
2445+ rv = xfrm_policy_init (net );
2446+ if (rv < 0 )
2447+ goto out_policy ;
2448+ return 0 ;
2449+
2450+ out_policy :
2451+ xfrm_state_fini (net );
2452+ out_state :
2453+ return rv ;
2454+ }
2455+
2456+ static void __net_exit xfrm_net_exit (struct net * net )
2457+ {
2458+ xfrm_policy_fini (net );
2459+ xfrm_state_fini (net );
2460+ }
2461+
2462+ static struct pernet_operations __net_initdata xfrm_net_ops = {
2463+ .init = xfrm_net_init ,
2464+ .exit = xfrm_net_exit ,
2465+ };
2466+
24312467void __init xfrm_init (void )
24322468{
2469+ register_pernet_subsys (& xfrm_net_ops );
24332470#ifdef CONFIG_XFRM_STATISTICS
24342471 xfrm_statistics_init ();
24352472#endif
2436- xfrm_state_init ();
2437- xfrm_policy_init ();
24382473 xfrm_input_init ();
24392474#ifdef CONFIG_XFRM_STATISTICS
24402475 xfrm_proc_init ();
0 commit comments