• Jack Morgenstein's avatar
    net/mlx4_core: Don't fail reg/unreg vlan for older guests · 2c957ff2
    Jack Morgenstein authored
    In upstream kernels under SRIOV, the vlan register/unregister calls
    were NOPs (doing nothing and returning OK). We detect these old
    calls from guests (via the comm channel), since previously the
    port number in mlx4_register_vlan was passed (improperly) in the
    out_param. This has been corrected so that the port number is now
    passed in bits 8..15 of the in_modifier field.
    
    For old calls, these bits will be zero, so if the passed port
    number is zero, we can still look at the out_param field to see
    if it contains a valid port number. If yes, the VM is running
    an old driver.
    
    Since for old drivers, the register/unregister_vlan wrappers were
    NOPs, we continue this policy -- the reason being that upstream
    had an additional bug in eth driver running on guests (where
    procedure mlx4_en_vlan_rx_kill_vid() had the following code:
    
    if (!mlx4_find_cached_vlan(mdev->dev, priv->port, vid, &idx))
            mlx4_unregister_vlan(mdev->dev, priv->port, idx);
    else
            en_err(priv, "could not find vid %d in cache\n", vid);
    
    On a VM, mlx4_find_cached_vlan() will always fail, since the
    vlan cache is located on the Hypervisor; on guests it is empty.
    
    Therefore, if we allow upstream guests to register vlans, we will
    have vlan leakage since the unregister will never be performed.
    Leaving vlan reg/unreg for old guest drivers as a NOP is not a
    feature regression, since in upstream the register/unregister
    vlan wrapper is a NOP.
    Signed-off-by: default avatarJack Morgenstein <jackm@dev.mellanox.co.il>
    Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    2c957ff2
mlx4.h 34.6 KB