]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
nfp: abm: don't set negative threshold
authorJakub Kicinski <jakub.kicinski@netronome.com>
Fri, 9 Nov 2018 03:50:37 +0000 (19:50 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 9 Nov 2018 04:48:01 +0000 (20:48 -0800)
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>
drivers/net/ethernet/netronome/nfp/abm/main.h
drivers/net/ethernet/netronome/nfp/abm/qdisc.c

index c617d213e406a7209cc6149e74151ff516f0e2ce..3774c063e4196e31df111ebc5a22f290927154bb 100644 (file)
@@ -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;
 
index 04b91cc12434a3348d33a145142cf9ca86c8f1c0..979afb3ea8555c1715aa0a41d6ebda6ed1e0bd8d 100644 (file)
@@ -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;
 }