• Kirill Tkhai's avatar
    net: Convert loopback_net_ops · 9a4d105d
    Kirill Tkhai authored
    These pernet_operations have only init() method. It allocates
    memory for net_device, calls register_netdev() and assigns
    net::loopback_dev.
    
    register_netdev() is allowed be used without additional locks,
    as it's synchronized on rtnl_lock(). There are many examples
    of using this functon directly from ioctl().
    
    The only difference, compared to ioctl(), is that net is not
    completely alive at this moment. But it looks like, there is
    no way for parallel pernet_operations to dereference
    the net_device, as the most of struct net_device lists,
    where it's linked, are related to net, and the net is not liked.
    
    The exceptions are net_device::unreg_list, close_list, todo_list,
    used for unregistration, and ::link_watch_list, where net_device
    may be linked to global lists.
    
    Unregistration of loopback_dev obviously can't happen, when
    loopback_net_init() is executing, as the net as alive. It occurs
    in default_device_ops, which currently requires net_mutex,
    and it behaves as a barrier at the moment. It will be considered
    in next patch.
    
    Speaking about link_watch_list, it seems, there is no way
    for loopback_dev at time of registration to be linked in lweventlist
    and be available for another pernet_operations.
    Signed-off-by: default avatarKirill Tkhai <ktkhai@virtuozzo.com>
    Acked-by: default avatarAndrei Vagin <avagin@virtuozzo.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    9a4d105d
loopback.c 5.94 KB