Commit 6a56e199 authored by Baowen Zheng's avatar Baowen Zheng Committed by David S. Miller

flow_offload: reject configuration of packet-per-second policing in offload drivers

A follow-up patch will allow users to configures packet-per-second policing
in the software datapath. In preparation for this, teach all drivers that
support offload of the policer action to reject such configuration as
currently none of them support it.
Signed-off-by: default avatarBaowen Zheng <baowen.zheng@corigine.com>
Signed-off-by: default avatarSimon Horman <simon.horman@netronome.com>
Signed-off-by: default avatarLouis Peens <louis.peens@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 25660156
...@@ -322,6 +322,12 @@ int sja1105_cls_flower_add(struct dsa_switch *ds, int port, ...@@ -322,6 +322,12 @@ int sja1105_cls_flower_add(struct dsa_switch *ds, int port,
flow_action_for_each(i, act, &rule->action) { flow_action_for_each(i, act, &rule->action) {
switch (act->id) { switch (act->id) {
case FLOW_ACTION_POLICE: case FLOW_ACTION_POLICE:
if (act->police.rate_pkt_ps) {
NL_SET_ERR_MSG_MOD(extack,
"QoS offload not support packets per second");
goto out;
}
rc = sja1105_flower_policer(priv, port, extack, cookie, rc = sja1105_flower_policer(priv, port, extack, cookie,
&key, &key,
act->police.rate_bytes_ps, act->police.rate_bytes_ps,
......
...@@ -48,6 +48,11 @@ static int cxgb4_matchall_egress_validate(struct net_device *dev, ...@@ -48,6 +48,11 @@ static int cxgb4_matchall_egress_validate(struct net_device *dev,
flow_action_for_each(i, entry, actions) { flow_action_for_each(i, entry, actions) {
switch (entry->id) { switch (entry->id) {
case FLOW_ACTION_POLICE: case FLOW_ACTION_POLICE:
if (entry->police.rate_pkt_ps) {
NL_SET_ERR_MSG_MOD(extack,
"QoS offload not support packets per second");
return -EOPNOTSUPP;
}
/* Convert bytes per second to bits per second */ /* Convert bytes per second to bits per second */
if (entry->police.rate_bytes_ps * 8 > max_link_rate) { if (entry->police.rate_bytes_ps * 8 > max_link_rate) {
NL_SET_ERR_MSG_MOD(extack, NL_SET_ERR_MSG_MOD(extack,
...@@ -145,7 +150,11 @@ static int cxgb4_matchall_alloc_tc(struct net_device *dev, ...@@ -145,7 +150,11 @@ static int cxgb4_matchall_alloc_tc(struct net_device *dev,
flow_action_for_each(i, entry, &cls->rule->action) flow_action_for_each(i, entry, &cls->rule->action)
if (entry->id == FLOW_ACTION_POLICE) if (entry->id == FLOW_ACTION_POLICE)
break; break;
if (entry->police.rate_pkt_ps) {
NL_SET_ERR_MSG_MOD(extack,
"QoS offload not support packets per second");
return -EOPNOTSUPP;
}
/* Convert from bytes per second to Kbps */ /* Convert from bytes per second to Kbps */
p.u.params.maxrate = div_u64(entry->police.rate_bytes_ps * 8, 1000); p.u.params.maxrate = div_u64(entry->police.rate_bytes_ps * 8, 1000);
p.u.params.channel = pi->tx_chan; p.u.params.channel = pi->tx_chan;
......
...@@ -1221,6 +1221,11 @@ static int enetc_psfp_parse_clsflower(struct enetc_ndev_priv *priv, ...@@ -1221,6 +1221,11 @@ static int enetc_psfp_parse_clsflower(struct enetc_ndev_priv *priv,
/* Flow meter and max frame size */ /* Flow meter and max frame size */
if (entryp) { if (entryp) {
if (entryp->police.rate_pkt_ps) {
NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second");
err = -EOPNOTSUPP;
goto free_sfi;
}
if (entryp->police.burst) { if (entryp->police.burst) {
fmi = kzalloc(sizeof(*fmi), GFP_KERNEL); fmi = kzalloc(sizeof(*fmi), GFP_KERNEL);
if (!fmi) { if (!fmi) {
......
...@@ -4538,6 +4538,10 @@ static int scan_tc_matchall_fdb_actions(struct mlx5e_priv *priv, ...@@ -4538,6 +4538,10 @@ static int scan_tc_matchall_fdb_actions(struct mlx5e_priv *priv,
flow_action_for_each(i, act, flow_action) { flow_action_for_each(i, act, flow_action) {
switch (act->id) { switch (act->id) {
case FLOW_ACTION_POLICE: case FLOW_ACTION_POLICE:
if (act->police.rate_pkt_ps) {
NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second");
return -EOPNOTSUPP;
}
err = apply_police_params(priv, act->police.rate_bytes_ps, extack); err = apply_police_params(priv, act->police.rate_bytes_ps, extack);
if (err) if (err)
return err; return err;
......
...@@ -190,6 +190,11 @@ static int mlxsw_sp_flower_parse_actions(struct mlxsw_sp *mlxsw_sp, ...@@ -190,6 +190,11 @@ static int mlxsw_sp_flower_parse_actions(struct mlxsw_sp *mlxsw_sp,
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
if (act->police.rate_pkt_ps) {
NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second");
return -EOPNOTSUPP;
}
/* The kernel might adjust the requested burst size so /* The kernel might adjust the requested burst size so
* that it is not exactly a power of two. Re-adjust it * that it is not exactly a power of two. Re-adjust it
* here since the hardware only supports burst sizes * here since the hardware only supports burst sizes
......
...@@ -220,6 +220,11 @@ static int ocelot_flower_parse_action(struct ocelot *ocelot, int port, ...@@ -220,6 +220,11 @@ static int ocelot_flower_parse_action(struct ocelot *ocelot, int port,
"Last action must be GOTO"); "Last action must be GOTO");
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
if (a->police.rate_pkt_ps) {
NL_SET_ERR_MSG_MOD(extack,
"QoS offload not support packets per second");
return -EOPNOTSUPP;
}
filter->action.police_ena = true; filter->action.police_ena = true;
rate = a->police.rate_bytes_ps; rate = a->police.rate_bytes_ps;
filter->action.pol.rate = div_u64(rate, 1000) * 8; filter->action.pol.rate = div_u64(rate, 1000) * 8;
......
...@@ -251,6 +251,12 @@ static int ocelot_setup_tc_cls_matchall(struct ocelot_port_private *priv, ...@@ -251,6 +251,12 @@ static int ocelot_setup_tc_cls_matchall(struct ocelot_port_private *priv,
return -EEXIST; return -EEXIST;
} }
if (action->police.rate_pkt_ps) {
NL_SET_ERR_MSG_MOD(extack,
"QoS offload not support packets per second");
return -EOPNOTSUPP;
}
pol.rate = (u32)div_u64(action->police.rate_bytes_ps, 1000) * 8; pol.rate = (u32)div_u64(action->police.rate_bytes_ps, 1000) * 8;
pol.burst = action->police.burst; pol.burst = action->police.burst;
......
...@@ -104,6 +104,11 @@ nfp_flower_install_rate_limiter(struct nfp_app *app, struct net_device *netdev, ...@@ -104,6 +104,11 @@ nfp_flower_install_rate_limiter(struct nfp_app *app, struct net_device *netdev,
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
if (action->police.rate_pkt_ps) {
NL_SET_ERR_MSG_MOD(extack, "unsupported offload: qos rate limit offload not support packets per second");
return -EOPNOTSUPP;
}
rate = action->police.rate_bytes_ps; rate = action->police.rate_bytes_ps;
burst = action->police.burst; burst = action->police.burst;
netdev_port_id = nfp_repr_get_port_id(netdev); netdev_port_id = nfp_repr_get_port_id(netdev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment