> void free_net_ns(struct kref *kref) > { > struct net_namespace *ns; > + unsigned long flags; > > + /* taking lock after atomic_dec_and_test is racy */ > + spin_lock_irqsave(&net_ns_list_lock, flags); > ns = container_of(kref, struct net_namespace, kref); > + if (atomic_read(&ns->kref.refcount) || > + list_empty(&ns->sibling_list)) { > + spin_unlock_irqrestore(&net_ns_list_lock, flags); > + return; what about the cleanup ? is it skipped ? > + } > + list_del_init(&ns->sibling_list); > + spin_unlock_irqrestore(&net_ns_list_lock, flags); > + put_net_ns(ns->parent); > + > unregister_netdev(ns->loopback_dev_p); > if (ns->dev_base_p != NULL) { > printk("NET_NS: BUG: namespace %p has devices! ref %d\n", > @@ -104,8 +128,10 @@ void free_net_ns(struct kref *kref) > return; > } > ip_fib_struct_cleanup(); > + printk(KERN_DEBUG "NET_NS: net namespace %p (%u) destroyed\n", > + ns, ns->id); > kfree(ns); > } > +/* because of put_net_ns() */ > EXPORT_SYMBOL(free_net_ns); > - > #endif /* CONFIG_NET_NS */