+/* Per-namespace Phonet devices handling */
+static int phonet_init_net(struct net *net)
+{
+ struct phonet_net *pnn = kmalloc(sizeof(*pnn), GFP_KERNEL);
+ if (!pnn)
+ return -ENOMEM;
+
+ INIT_LIST_HEAD(&pnn->pndevs.list);
+ spin_lock_init(&pnn->pndevs.lock);
+ net_assign_generic(net, phonet_net_id, pnn);
+ return 0;
+}
+
+static void phonet_exit_net(struct net *net)
+{
+ struct phonet_net *pnn = net_generic(net, phonet_net_id);
+ struct phonet_device *pnd, *n;
+
+ list_for_each_entry_safe(pnd, n, &pnn->pndevs.list, list)
+ __phonet_device_free(pnd);
+
+ kfree(pnn);
+}
+
+static struct pernet_operations phonet_net_ops = {
+ .init = phonet_init_net,
+ .exit = phonet_exit_net,
+};
+