Skip to content

Commit

Permalink
net:qos: police action offloading parameter 'burst' change to the ori…
Browse files Browse the repository at this point in the history
…ginal value

Since 'tcfp_burst' with TICK factor, driver side always need to recover
it to the original value, this patch moves the generic calculation and
recover to the 'burst' original value before offloading to device driver.

Signed-off-by: Po Liu <po.liu@nxp.com>
Acked-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Po Liu authored and David S. Miller committed Jun 30, 2020
1 parent 13f1555 commit 5f035af
Show file tree
Hide file tree
Showing 11 changed files with 48 additions and 36 deletions.
4 changes: 1 addition & 3 deletions drivers/net/dsa/ocelot/felix.c
Original file line number Diff line number Diff line change
Expand Up @@ -746,9 +746,7 @@ static int felix_port_policer_add(struct dsa_switch *ds, int port,
struct ocelot *ocelot = ds->priv;
struct ocelot_policer pol = {
.rate = div_u64(policer->rate_bytes_per_sec, 1000) * 8,
.burst = div_u64(policer->rate_bytes_per_sec *
PSCHED_NS2TICKS(policer->burst),
PSCHED_TICKS_PER_SEC),
.burst = policer->burst,
};

return ocelot_port_policer_add(ocelot, port, &pol);
Expand Down
16 changes: 7 additions & 9 deletions drivers/net/dsa/sja1105/sja1105_flower.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ static int sja1105_setup_bcast_policer(struct sja1105_private *priv,
struct netlink_ext_ack *extack,
unsigned long cookie, int port,
u64 rate_bytes_per_sec,
s64 burst)
u32 burst)
{
struct sja1105_rule *rule = sja1105_rule_find(priv, cookie);
struct sja1105_l2_policing_entry *policing;
Expand Down Expand Up @@ -79,9 +79,8 @@ static int sja1105_setup_bcast_policer(struct sja1105_private *priv,

policing[rule->bcast_pol.sharindx].rate = div_u64(rate_bytes_per_sec *
512, 1000000);
policing[rule->bcast_pol.sharindx].smax = div_u64(rate_bytes_per_sec *
PSCHED_NS2TICKS(burst),
PSCHED_TICKS_PER_SEC);
policing[rule->bcast_pol.sharindx].smax = burst;

/* TODO: support per-flow MTU */
policing[rule->bcast_pol.sharindx].maxlen = VLAN_ETH_FRAME_LEN +
ETH_FCS_LEN;
Expand All @@ -103,7 +102,7 @@ static int sja1105_setup_tc_policer(struct sja1105_private *priv,
struct netlink_ext_ack *extack,
unsigned long cookie, int port, int tc,
u64 rate_bytes_per_sec,
s64 burst)
u32 burst)
{
struct sja1105_rule *rule = sja1105_rule_find(priv, cookie);
struct sja1105_l2_policing_entry *policing;
Expand Down Expand Up @@ -152,9 +151,8 @@ static int sja1105_setup_tc_policer(struct sja1105_private *priv,

policing[rule->tc_pol.sharindx].rate = div_u64(rate_bytes_per_sec *
512, 1000000);
policing[rule->tc_pol.sharindx].smax = div_u64(rate_bytes_per_sec *
PSCHED_NS2TICKS(burst),
PSCHED_TICKS_PER_SEC);
policing[rule->tc_pol.sharindx].smax = burst;

/* TODO: support per-flow MTU */
policing[rule->tc_pol.sharindx].maxlen = VLAN_ETH_FRAME_LEN +
ETH_FCS_LEN;
Expand All @@ -177,7 +175,7 @@ static int sja1105_flower_policer(struct sja1105_private *priv, int port,
unsigned long cookie,
struct sja1105_key *key,
u64 rate_bytes_per_sec,
s64 burst)
u32 burst)
{
switch (key->type) {
case SJA1105_KEY_BCAST:
Expand Down
4 changes: 1 addition & 3 deletions drivers/net/dsa/sja1105/sja1105_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -3324,9 +3324,7 @@ static int sja1105_port_policer_add(struct dsa_switch *ds, int port,
*/
policing[port].rate = div_u64(512 * policer->rate_bytes_per_sec,
1000000);
policing[port].smax = div_u64(policer->rate_bytes_per_sec *
PSCHED_NS2TICKS(policer->burst),
PSCHED_TICKS_PER_SEC);
policing[port].smax = policer->burst;

return sja1105_static_config_reload(priv, SJA1105_BEST_EFFORT_POLICING);
}
Expand Down
8 changes: 1 addition & 7 deletions drivers/net/ethernet/freescale/enetc/enetc_qos.c
Original file line number Diff line number Diff line change
Expand Up @@ -1241,20 +1241,14 @@ static int enetc_psfp_parse_clsflower(struct enetc_ndev_priv *priv,
/* Flow meter and max frame size */
if (entryp) {
if (entryp->police.burst) {
u64 temp;

fmi = kzalloc(sizeof(*fmi), GFP_KERNEL);
if (!fmi) {
err = -ENOMEM;
goto free_sfi;
}
refcount_set(&fmi->refcount, 1);
fmi->cir = entryp->police.rate_bytes_ps;
/* Convert to original burst value */
temp = entryp->police.burst * fmi->cir;
temp = div_u64(temp, 1000000000ULL);

fmi->cbs = temp;
fmi->cbs = entryp->police.burst;
fmi->index = entryp->police.index;
filter->flags |= ENETC_PSFP_FLAGS_FMI;
filter->fmi_index = fmi->index;
Expand Down
4 changes: 1 addition & 3 deletions drivers/net/ethernet/mscc/ocelot_flower.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ static int ocelot_flower_parse_action(struct flow_cls_offload *f,
struct ocelot_vcap_filter *filter)
{
const struct flow_action_entry *a;
s64 burst;
u64 rate;
int i;

Expand All @@ -35,8 +34,7 @@ static int ocelot_flower_parse_action(struct flow_cls_offload *f,
filter->action = OCELOT_VCAP_ACTION_POLICE;
rate = a->police.rate_bytes_ps;
filter->pol.rate = div_u64(rate, 1000) * 8;
burst = rate * PSCHED_NS2TICKS(a->police.burst);
filter->pol.burst = div_u64(burst, PSCHED_TICKS_PER_SEC);
filter->pol.burst = a->police.burst;
break;
default:
return -EOPNOTSUPP;
Expand Down
4 changes: 1 addition & 3 deletions drivers/net/ethernet/mscc/ocelot_net.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,7 @@ static int ocelot_setup_tc_cls_matchall(struct ocelot_port_private *priv,
}

pol.rate = (u32)div_u64(action->police.rate_bytes_ps, 1000) * 8;
pol.burst = (u32)div_u64(action->police.rate_bytes_ps *
PSCHED_NS2TICKS(action->police.burst),
PSCHED_TICKS_PER_SEC);
pol.burst = action->police.burst;

err = ocelot_port_policer_add(ocelot, port, &pol);
if (err) {
Expand Down
6 changes: 3 additions & 3 deletions drivers/net/ethernet/netronome/nfp/flower/qos_conf.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ nfp_flower_install_rate_limiter(struct nfp_app *app, struct net_device *netdev,
struct nfp_repr *repr;
struct sk_buff *skb;
u32 netdev_port_id;
u64 burst, rate;
u32 burst;
u64 rate;

if (!nfp_netdev_is_nfp_repr(netdev)) {
NL_SET_ERR_MSG_MOD(extack, "unsupported offload: qos rate limit offload not supported on higher level port");
Expand Down Expand Up @@ -104,8 +105,7 @@ nfp_flower_install_rate_limiter(struct nfp_app *app, struct net_device *netdev,
}

rate = action->police.rate_bytes_ps;
burst = div_u64(rate * PSCHED_NS2TICKS(action->police.burst),
PSCHED_TICKS_PER_SEC);
burst = action->police.burst;
netdev_port_id = nfp_repr_get_port_id(netdev);

skb = nfp_flower_cmsg_alloc(repr->app, sizeof(struct nfp_police_config),
Expand Down
2 changes: 1 addition & 1 deletion include/net/dsa.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ struct dsa_mall_mirror_tc_entry {

/* TC port policer entry */
struct dsa_mall_policer_tc_entry {
s64 burst;
u32 burst;
u64 rate_bytes_per_sec;
};

Expand Down
2 changes: 1 addition & 1 deletion include/net/flow_offload.h
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ struct flow_action_entry {
} sample;
struct { /* FLOW_ACTION_POLICE */
u32 index;
s64 burst;
u32 burst;
u64 rate_bytes_ps;
u32 mtu;
} police;
Expand Down
32 changes: 30 additions & 2 deletions include/net/tc_act/tc_police.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,42 @@ static inline u64 tcf_police_rate_bytes_ps(const struct tc_action *act)
return params->rate.rate_bytes_ps;
}

static inline s64 tcf_police_tcfp_burst(const struct tc_action *act)
static inline u32 tcf_police_burst(const struct tc_action *act)
{
struct tcf_police *police = to_police(act);
struct tcf_police_params *params;
u32 burst;

params = rcu_dereference_protected(police->params,
lockdep_is_held(&police->tcf_lock));
return params->tcfp_burst;

/*
* "rate" bytes "burst" nanoseconds
* ------------ * -------------------
* 1 second 2^6 ticks
*
* ------------------------------------
* NSEC_PER_SEC nanoseconds
* ------------------------
* 2^6 ticks
*
* "rate" bytes "burst" nanoseconds 2^6 ticks
* = ------------ * ------------------- * ------------------------
* 1 second 2^6 ticks NSEC_PER_SEC nanoseconds
*
* "rate" * "burst"
* = ---------------- bytes/nanosecond
* NSEC_PER_SEC^2
*
*
* "rate" * "burst"
* = ---------------- bytes/second
* NSEC_PER_SEC
*/
burst = div_u64(params->tcfp_burst * params->rate.rate_bytes_ps,
NSEC_PER_SEC);

return burst;
}

static inline u32 tcf_police_tcfp_mtu(const struct tc_action *act)
Expand Down
2 changes: 1 addition & 1 deletion net/sched/cls_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -3660,7 +3660,7 @@ int tc_setup_flow_action(struct flow_action *flow_action,
tcf_sample_get_group(entry, act);
} else if (is_tcf_police(act)) {
entry->id = FLOW_ACTION_POLICE;
entry->police.burst = tcf_police_tcfp_burst(act);
entry->police.burst = tcf_police_burst(act);
entry->police.rate_bytes_ps =
tcf_police_rate_bytes_ps(act);
entry->police.mtu = tcf_police_tcfp_mtu(act);
Expand Down

0 comments on commit 5f035af

Please sign in to comment.