static void __netdev_name_node_alt_destroy(struct netdev_name_node *name_node)
 {
        list_del(&name_node->list);
-       netdev_name_node_del(name_node);
        kfree(name_node->name);
        netdev_name_node_free(name_node);
 }
        if (name_node == dev->name_node || name_node->dev != dev)
                return -EINVAL;
 
+       netdev_name_node_del(name_node);
+       synchronize_rcu();
        __netdev_name_node_alt_destroy(name_node);
 
        return 0;
        synchronize_net();
 
        list_for_each_entry(dev, head, unreg_list) {
+               struct netdev_name_node *name_node;
                struct sk_buff *skb = NULL;
 
                /* Shutdown queueing discipline. */
                dev_uc_flush(dev);
                dev_mc_flush(dev);
 
+               netdev_for_each_altname(dev, name_node)
+                       netdev_name_node_del(name_node);
+               synchronize_rcu();
                netdev_name_node_alt_flush(dev);
                netdev_name_node_free(dev->name_node);