ixgbe: SR-IOV: dynamic IEEE DCBx default priority changes
IEEE DCBx has a mechanism to change the default user priority. In the normal case the OS can handle this via cgroups, iptables, socket, options etc. With SR-IOV and direct assigned VF devices the default priority needs to be set by the PF device so the inserted VLAN tag is correct. Signed-off-by: John Fastabend <john.r.fastabend@intel.com> Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com> Tested-by: Marcus Dennis <marcusx.e.dennis@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
Родитель
1ad759d847
Коммит
610a63fc8e
|
@ -30,6 +30,7 @@
|
|||
#include <linux/dcbnl.h>
|
||||
#include "ixgbe_dcb_82598.h"
|
||||
#include "ixgbe_dcb_82599.h"
|
||||
#include "ixgbe_sriov.h"
|
||||
|
||||
/* Callbacks for DCB netlink in the kernel */
|
||||
#define BIT_DCB_MODE 0x01
|
||||
|
@ -643,9 +644,11 @@ static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev,
|
|||
return err;
|
||||
|
||||
err = dcb_ieee_setapp(dev, app);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
#ifdef IXGBE_FCOE
|
||||
if (!err && app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE &&
|
||||
if (app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE &&
|
||||
app->protocol == ETH_P_FCOE) {
|
||||
u8 app_mask = dcb_ieee_getapp_mask(dev, app);
|
||||
|
||||
|
@ -656,6 +659,23 @@ static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev,
|
|||
ixgbe_dcbnl_devreset(dev);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* VF devices should use default UP when available */
|
||||
if (app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE &&
|
||||
app->protocol == 0) {
|
||||
int vf;
|
||||
|
||||
adapter->default_up = app->priority;
|
||||
|
||||
for (vf = 0; vf < adapter->num_vfs; vf++) {
|
||||
struct vf_data_storage *vfinfo = &adapter->vfinfo[vf];
|
||||
|
||||
if (!vfinfo->pf_qos)
|
||||
ixgbe_set_vmvir(adapter, vfinfo->pf_vlan,
|
||||
app->priority, vf);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -683,6 +703,24 @@ static int ixgbe_dcbnl_ieee_delapp(struct net_device *dev,
|
|||
ixgbe_dcbnl_devreset(dev);
|
||||
}
|
||||
#endif
|
||||
/* IF default priority is being removed clear VF default UP */
|
||||
if (app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE &&
|
||||
app->protocol == 0 && adapter->default_up == app->priority) {
|
||||
int vf;
|
||||
long unsigned int app_mask = dcb_ieee_getapp_mask(dev, app);
|
||||
int qos = app_mask ? find_first_bit(&app_mask, 8) : 0;
|
||||
|
||||
adapter->default_up = qos;
|
||||
|
||||
for (vf = 0; vf < adapter->num_vfs; vf++) {
|
||||
struct vf_data_storage *vfinfo = &adapter->vfinfo[vf];
|
||||
|
||||
if (!vfinfo->pf_qos)
|
||||
ixgbe_set_vmvir(adapter, vfinfo->pf_vlan,
|
||||
qos, vf);
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -447,15 +447,6 @@ static void ixgbe_set_vmolr(struct ixgbe_hw *hw, u32 vf, bool aupe)
|
|||
IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr);
|
||||
}
|
||||
|
||||
static void ixgbe_set_vmvir(struct ixgbe_adapter *adapter,
|
||||
u16 vid, u16 qos, u32 vf)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
u32 vmvir = vid | (qos << VLAN_PRIO_SHIFT) | IXGBE_VMVIR_VLANA_DEFAULT;
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_VMVIR(vf), vmvir);
|
||||
}
|
||||
|
||||
static void ixgbe_clear_vmvir(struct ixgbe_adapter *adapter, u32 vf)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
|
|
|
@ -47,6 +47,14 @@ void ixgbe_enable_sriov(struct ixgbe_adapter *adapter,
|
|||
const struct ixgbe_info *ii);
|
||||
#endif
|
||||
|
||||
static inline void ixgbe_set_vmvir(struct ixgbe_adapter *adapter,
|
||||
u16 vid, u16 qos, u32 vf)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
u32 vmvir = vid | (qos << VLAN_PRIO_SHIFT) | IXGBE_VMVIR_VLANA_DEFAULT;
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_VMVIR(vf), vmvir);
|
||||
}
|
||||
|
||||
#endif /* _IXGBE_SRIOV_H_ */
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче