diff options
author | Jakub Kicinski <jakub.kicinski@netronome.com> | 2018-11-09 06:50:37 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-11-09 07:48:01 +0300 |
commit | cae5f48e3234dda5bab6f7f361b5eff6d4cc77b2 (patch) | |
tree | f37f52161e365168d6ee8f8663deb6f4baeb9e69 /drivers/net/ethernet/netronome/nfp/abm | |
parent | 032748acf616c250aa195c92715ba89e136c61fe (diff) | |
download | linux-cae5f48e3234dda5bab6f7f361b5eff6d4cc77b2.tar.xz |
nfp: abm: don't set negative threshold
Turns out the threshold value is used in signed compares in the FW,
so we should avoid setting the top bit.
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: John Hurley <john.hurley@netronome.com>
Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/netronome/nfp/abm')
-rw-r--r-- | drivers/net/ethernet/netronome/nfp/abm/main.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/netronome/nfp/abm/qdisc.c | 10 |
2 files changed, 11 insertions, 2 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.h b/drivers/net/ethernet/netronome/nfp/abm/main.h index c617d213e406..3774c063e419 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.h +++ b/drivers/net/ethernet/netronome/nfp/abm/main.h @@ -4,9 +4,12 @@ #ifndef __NFP_ABM_H__ #define __NFP_ABM_H__ 1 +#include <linux/bits.h> #include <net/devlink.h> #include <net/pkt_cls.h> +#define NFP_ABM_LVL_INFINITY S32_MAX + struct nfp_app; struct nfp_net; diff --git a/drivers/net/ethernet/netronome/nfp/abm/qdisc.c b/drivers/net/ethernet/netronome/nfp/abm/qdisc.c index 04b91cc12434..979afb3ea855 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/qdisc.c +++ b/drivers/net/ethernet/netronome/nfp/abm/qdisc.c @@ -31,7 +31,7 @@ static void nfp_abm_reset_root(struct net_device *netdev, struct nfp_abm_link *alink, u32 handle, unsigned int qs) { - __nfp_abm_reset_root(netdev, alink, handle, qs, ~0); + __nfp_abm_reset_root(netdev, alink, handle, qs, NFP_ABM_LVL_INFINITY); } static int @@ -67,7 +67,7 @@ nfp_abm_red_destroy(struct net_device *netdev, struct nfp_abm_link *alink, if (alink->parent == TC_H_ROOT) { nfp_abm_reset_root(netdev, alink, TC_H_ROOT, 0); } else { - nfp_abm_ctrl_set_q_lvl(alink, i, ~0); + nfp_abm_ctrl_set_q_lvl(alink, i, NFP_ABM_LVL_INFINITY); memset(&alink->qdiscs[i], 0, sizeof(*alink->qdiscs)); } } @@ -88,6 +88,12 @@ nfp_abm_red_check_params(struct nfp_abm_link *alink, opt->parent, opt->handle); return false; } + if (opt->set.min > NFP_ABM_LVL_INFINITY) { + nfp_warn(cpp, "RED offload failed - threshold too large %d > %d (p:%08x h:%08x)\n", + opt->set.min, NFP_ABM_LVL_INFINITY, opt->parent, + opt->handle); + return false; + } return true; } |