• Pavel Emelyanov's avatar
    [NETNS]: The generic per-net pointers. · dec827d1
    Pavel Emelyanov authored
    Add the elastic array of void * pointer to the struct net.
    The access rules are simple:
    
     1. register the ops with register_pernet_gen_device to get
        the id of your private pointer
     2. call net_assign_generic() to put the private data on the
        struct net (most preferably this should be done in the
        ->init callback of the ops registered)
     3. do not store any private reference on the net_generic array;
     4. do not change this pointer while the net is alive;
     5. use the net_generic() to get the pointer.
    
    When adding a new pointer, I copy the old array, replace it
    with a new one and schedule the old for kfree after an RCU
    grace period.
    
    Since the net_generic explores the net->gen array inside rcu
    read section and once set the net->gen->ptr[x] pointer never 
    changes, this grants us a safe access to generic pointers.
    
    Quoting Paul: "... RCU is protecting -only- the net_generic 
    structure that net_generic() is traversing, and the [pointer]
    returned by net_generic() is protected by a reference counter 
    in the upper-level struct net."
    Signed-off-by: default avatarPavel Emelyanov <xemul@openvz.org>
    Acked-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    dec827d1
net_namespace.c 10.3 KB