• Kirill Tkhai's avatar
    net: Convert caif_net_ops · d2174724
    Kirill Tkhai authored
    Init method just allocates memory for new cfg, and
    assigns net_generic(net, caif_net_id). Despite there is
    synchronize_rcu() on error path in cfcnfg_create(),
    in real this function does not use global lists,
    so it looks like this synchronize_rcu() is some legacy
    inheritance. Exit method removes caif devices under
    rtnl_lock().
    
    There could be a problem, if someone from foreign net
    pernet_operations dereference caif_net_id of this net.
    It's dereferenced in get_cfcnfg() and caif_device_list().
    
    get_cfcnfg() is used from netdevice notifiers, where
    they are called under rtnl_lock(). The notifiers can't
    be called from foreign nets pernet_operations. Also,
    it's used from caif_disconnect_client() and from
    caif_connect_client(). The both of the functions work
    with caif socket, and there is the only possibility
    to have a socket, when the net is dead. This may happen
    only of the socket was created as kern using sk_alloc().
    Grep by PF_CAIF shows we do not create kern caif sockets,
    so get_cfcnfg() is safe.
    
    caif_device_list() is used in netdevice notifiers and exit
    method under rtnl lock. Also, from caif_get() used in
    the netdev notifiers and in caif_flow_cb(). The last item
    is skb destructor. Since there are no kernel caif sockets
    nobody can send net a packet in parallel with init/exit,
    so this is also safe.
    
    So, these pernet_operations are safe to be async.
    Signed-off-by: default avatarKirill Tkhai <ktkhai@virtuozzo.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    d2174724
caif_dev.c 12.8 KB