• Veaceslav Falico's avatar
    net: add lower_dev_list to net_device and make a full mesh · 5d261913
    Veaceslav Falico authored
    This patch adds lower_dev_list list_head to net_device, which is the same
    as upper_dev_list, only for lower devices, and begins to use it in the same
    way as the upper list.
    
    It also changes the way the whole adjacent device lists work - now they
    contain *all* of upper/lower devices, not only the first level. The first
    level devices are distinguished by the bool neighbour field in
    netdev_adjacent, also added by this patch.
    
    There are cases when a device can be added several times to the adjacent
    list, the simplest would be:
    
         /---- eth0.10 ---\
    eth0-		       --- bond0
         \---- eth0.20 ---/
    
    where both bond0 and eth0 'see' each other in the adjacent lists two times.
    To avoid duplication of netdev_adjacent structures ref_nr is being kept as
    the number of times the device was added to the list.
    
    The 'full view' is achieved by adding, on link creation, all of the
    upper_dev's upper_dev_list devices as upper devices to all of the
    lower_dev's lower_dev_list devices (and to the lower_dev itself), and vice
    versa. On unlink they are removed using the same logic.
    
    I've tested it with thousands vlans/bonds/bridges, everything works ok and
    no observable lags even on a huge number of interfaces.
    
    Memory footprint for 128 devices interconnected with each other via both
    upper and lower (which is impossible, but for the comparison) lists would be:
    
    128*128*2*sizeof(netdev_adjacent) = 1.5MB
    
    but in the real world we usualy have at most several devices with slaves
    and a lot of vlans, so the footprint will be much lower.
    
    CC: "David S. Miller" <davem@davemloft.net>
    CC: Eric Dumazet <edumazet@google.com>
    CC: Jiri Pirko <jiri@resnulli.us>
    CC: Alexander Duyck <alexander.h.duyck@intel.com>
    CC: Cong Wang <amwang@redhat.com>
    Signed-off-by: default avatarVeaceslav Falico <vfalico@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    5d261913
dev.c 166 KB