Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 610a63fc authored by John Fastabend's avatar John Fastabend Committed by Jeff Kirsher
Browse files

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: default avatarJohn Fastabend <john.r.fastabend@intel.com>
Tested-by: default avatarPhil Schmitt <phillip.j.schmitt@intel.com>
Tested-by: default avatarMarcus Dennis <marcusx.e.dennis@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 1ad759d8
Loading
Loading
Loading
Loading
+39 −1
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@
#include <linux/dcbnl.h>
#include <linux/dcbnl.h>
#include "ixgbe_dcb_82598.h"
#include "ixgbe_dcb_82598.h"
#include "ixgbe_dcb_82599.h"
#include "ixgbe_dcb_82599.h"
#include "ixgbe_sriov.h"


/* Callbacks for DCB netlink in the kernel */
/* Callbacks for DCB netlink in the kernel */
#define BIT_DCB_MODE	0x01
#define BIT_DCB_MODE	0x01
@@ -643,9 +644,11 @@ static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev,
		return err;
		return err;


	err = dcb_ieee_setapp(dev, app);
	err = dcb_ieee_setapp(dev, app);
	if (err)
		return err;


#ifdef IXGBE_FCOE
#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) {
	    app->protocol == ETH_P_FCOE) {
		u8 app_mask = dcb_ieee_getapp_mask(dev, app);
		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);
		ixgbe_dcbnl_devreset(dev);
	}
	}
#endif
#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;
	return 0;
}
}


@@ -683,6 +703,24 @@ static int ixgbe_dcbnl_ieee_delapp(struct net_device *dev,
		ixgbe_dcbnl_devreset(dev);
		ixgbe_dcbnl_devreset(dev);
	}
	}
#endif
#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;
	return err;
}
}


+0 −9
Original line number Original line Diff line number Diff line
@@ -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);
	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)
static void ixgbe_clear_vmvir(struct ixgbe_adapter *adapter, u32 vf)
{
{
	struct ixgbe_hw *hw = &adapter->hw;
	struct ixgbe_hw *hw = &adapter->hw;
+8 −0
Original line number Original line Diff line number Diff line
@@ -47,6 +47,14 @@ void ixgbe_enable_sriov(struct ixgbe_adapter *adapter,
			const struct ixgbe_info *ii);
			const struct ixgbe_info *ii);
#endif
#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_ */
#endif /* _IXGBE_SRIOV_H_ */