ice: enable ndo_setup_tc support for mqprio_qdisc
Add support in driver for TC_QDISC_SETUP_MQPRIO. This support enables instantiation of channels in HW using existing MQPRIO infrastructure which is extended to be offloadable. This provides a mechanism to configure dedicated set of queues for each TC. Configuring channels using "tc mqprio": -------------------------------------- tc qdisc add dev <ethX> root mqprio num_tc 3 map 0 1 2 \ queues 4@0 4@4 4@8 hw 1 mode channel Above command configures 3 TCs having 4 queues each. "hw 1 mode channel" implies offload of channel configuration to HW. When driver processes configuration received via "ndo_setup_tc: QDISC_SETUP_MQPRIO", each TC maps to HW VSI with specified queues. User can optionally specify bandwidth min and max rate limit per TC (see example below). If shaper params like min and/or max bandwidth rate limit are specified, driver configures VSI specific rate limiter in HW. Configuring channels and bandwidth shaper parameters using "tc mqprio": ---------------------------------------------------------------- tc qdisc add dev <ethX> root mqprio \ num_tc 4 map 0 1 2 3 queues 4@0 4@4 4@8 4@12 hw 1 mode channel \ shaper bw_rlimit min_rate 1Gbit 2Gbit 3Gbit 4Gbit \ max_rate 4Gbit 5Gbit 6Gbit 7Gbit Command to view configured TCs: ----------------------------- tc qdisc show dev <ethX> Deleting TCs: ------------ tc qdisc del dev <ethX> root mqprio Signed-off-by: Kiran Patil <kiran.patil@intel.com> Signed-off-by: Amritha Nambiar <amritha.nambiar@intel.com> Signed-off-by: Sudheer Mogilappagari <sudheer.mogilappagari@intel.com> Tested-by: Bharathi Sreenivas <bharathi.sreenivas@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
Родитель
0754d65bd4
Коммит
fbc7b27af0
|
@ -56,6 +56,7 @@
|
|||
#include "ice_dcb.h"
|
||||
#include "ice_switch.h"
|
||||
#include "ice_common.h"
|
||||
#include "ice_flow.h"
|
||||
#include "ice_sched.h"
|
||||
#include "ice_idc_int.h"
|
||||
#include "ice_virtchnl_pf.h"
|
||||
|
@ -126,6 +127,13 @@
|
|||
#define ICE_TX_CTX_DESC(R, i) (&(((struct ice_tx_ctx_desc *)((R)->desc))[i]))
|
||||
#define ICE_TX_FDIRDESC(R, i) (&(((struct ice_fltr_desc *)((R)->desc))[i]))
|
||||
|
||||
/* Minimum BW limit is 500 Kbps for any scheduler node */
|
||||
#define ICE_MIN_BW_LIMIT 500
|
||||
/* User can specify BW in either Kbit/Mbit/Gbit and OS converts it in bytes.
|
||||
* use it to convert user specified BW limit into Kbps
|
||||
*/
|
||||
#define ICE_BW_KBPS_DIVISOR 125
|
||||
|
||||
/* Macro for each VSI in a PF */
|
||||
#define ice_for_each_vsi(pf, i) \
|
||||
for ((i) = 0; (i) < (pf)->num_alloc_vsi; (i)++)
|
||||
|
@ -440,6 +448,8 @@ struct ice_q_vector {
|
|||
cpumask_t affinity_mask;
|
||||
struct irq_affinity_notify affinity_notify;
|
||||
|
||||
struct ice_channel *ch;
|
||||
|
||||
char name[ICE_INT_NAME_STR_LEN];
|
||||
|
||||
u16 total_events; /* net_dim(): number of interrupts processed */
|
||||
|
@ -595,6 +605,17 @@ struct ice_netdev_priv {
|
|||
struct ice_repr *repr;
|
||||
};
|
||||
|
||||
/**
|
||||
* ice_vector_ch_enabled
|
||||
* @qv: pointer to q_vector, can be NULL
|
||||
*
|
||||
* This function returns true if vector is channel enabled otherwise false
|
||||
*/
|
||||
static inline bool ice_vector_ch_enabled(struct ice_q_vector *qv)
|
||||
{
|
||||
return !!qv->ch; /* Enable it to run with TC */
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_irq_dynamic_ena - Enable default interrupt generation settings
|
||||
* @hw: pointer to HW struct
|
||||
|
|
|
@ -3194,6 +3194,11 @@ ice_set_rxfh(struct net_device *netdev, const u32 *indir, const u8 *key,
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
if (ice_is_adq_active(pf)) {
|
||||
netdev_err(netdev, "Cannot change RSS params with ADQ configured.\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (key) {
|
||||
if (!vsi->rss_hkey_user) {
|
||||
vsi->rss_hkey_user =
|
||||
|
@ -3404,6 +3409,11 @@ static int ice_set_channels(struct net_device *dev, struct ethtool_channels *ch)
|
|||
if (ch->other_count != (test_bit(ICE_FLAG_FD_ENA, pf->flags) ? 1U : 0U))
|
||||
return -EINVAL;
|
||||
|
||||
if (ice_is_adq_active(pf)) {
|
||||
netdev_err(dev, "Cannot set channels with ADQ configured.\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (test_bit(ICE_FLAG_FD_ENA, pf->flags) && pf->hw.fdir_active_fltr) {
|
||||
netdev_err(dev, "Cannot set channels when Flow Director filters are active\n");
|
||||
return -EOPNOTSUPP;
|
||||
|
|
|
@ -3954,7 +3954,7 @@ int ice_get_link_speed_mbps(struct ice_vsi *vsi)
|
|||
*
|
||||
* Return current VSI link speed and 0 if the speed is unknown.
|
||||
*/
|
||||
static int ice_get_link_speed_kbps(struct ice_vsi *vsi)
|
||||
int ice_get_link_speed_kbps(struct ice_vsi *vsi)
|
||||
{
|
||||
int speed_mbps;
|
||||
|
||||
|
|
|
@ -124,6 +124,7 @@ int ice_set_dflt_vsi(struct ice_sw *sw, struct ice_vsi *vsi);
|
|||
int ice_clear_dflt_vsi(struct ice_sw *sw);
|
||||
int ice_set_min_bw_limit(struct ice_vsi *vsi, u64 min_tx_rate);
|
||||
int ice_set_max_bw_limit(struct ice_vsi *vsi, u64 max_tx_rate);
|
||||
int ice_get_link_speed_kbps(struct ice_vsi *vsi);
|
||||
int ice_get_link_speed_mbps(struct ice_vsi *vsi);
|
||||
int
|
||||
ice_vsi_update_security(struct ice_vsi *vsi, void (*fill)(struct ice_vsi_ctx *));
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Загрузка…
Ссылка в новой задаче