mlxsw: spectrum: Fix compilation error when CLS_ACT isn't set
authorIdo Schimmel <idosch@mellanox.com>
Mon, 25 Jul 2016 10:12:33 +0000 (13:12 +0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 26 Jul 2016 00:57:33 +0000 (17:57 -0700)
When CONFIG_NET_CLS_ACT isn't set 'struct tcf_exts' has no member named
'actions' and we therefore must not access it. Otherwise compilation
fails.

Fix this by introducing a new macro similar to tc_no_actions(), which
always returns 'false' if CONFIG_NET_CLS_ACT isn't set.

Fixes: 763b4b70afcd ("mlxsw: spectrum: Add support in matchall mirror TC offloading")
Reported-by: kbuild test robot <fengguang.wu@intel.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
include/net/act_api.h

index 552636b73416772ae2e50222ec38e4a9c4a92faa..c3e61500819d00c9d1c4d61448f99c51057d3cbb 100644 (file)
@@ -1148,23 +1148,22 @@ static int mlxsw_sp_port_add_cls_matchall(struct mlxsw_sp_port *mlxsw_sp_port,
                                          struct tc_cls_matchall_offload *cls,
                                          bool ingress)
 {
-       struct tcf_exts *exts = cls->exts;
        const struct tc_action *a;
        int err;
 
-       if (!list_is_singular(&exts->actions)) {
+       if (!tc_single_action(cls->exts)) {
                netdev_err(mlxsw_sp_port->dev, "only singular actions are supported\n");
                return -ENOTSUPP;
        }
 
-       a = list_first_entry(&exts->actions, struct tc_action, list);
-       if (is_tcf_mirred_mirror(a) && protocol == htons(ETH_P_ALL)) {
+       tc_for_each_action(a, cls->exts) {
+               if (!is_tcf_mirred_mirror(a) || protocol != htons(ETH_P_ALL))
+                       return -ENOTSUPP;
+
                err = mlxsw_sp_port_add_cls_matchall_mirror(mlxsw_sp_port, cls,
                                                            a, ingress);
                if (err)
                        return err;
-       } else {
-               return -ENOTSUPP;
        }
 
        return 0;
index fb82b5b5d9e7923078ed012810fed70319fc2d99..0bb210635e5f23c1d5de74b8f8c200909f7c6911 100644 (file)
@@ -192,6 +192,9 @@ int tcf_action_copy_stats(struct sk_buff *, struct tc_action *, int);
 #define tc_for_each_action(_a, _exts) \
        list_for_each_entry(a, &(_exts)->actions, list)
 
+#define tc_single_action(_exts) \
+       (list_is_singular(&(_exts)->actions))
+
 static inline void tcf_action_stats_update(struct tc_action *a, u64 bytes,
                                           u64 packets, u64 lastuse)
 {
@@ -205,6 +208,7 @@ static inline void tcf_action_stats_update(struct tc_action *a, u64 bytes,
 
 #define tc_no_actions(_exts) true
 #define tc_for_each_action(_a, _exts) while ((void)(_a), 0)
+#define tc_single_action(_exts) false
 #define tcf_action_stats_update(a, bytes, packets, lastuse)
 
 #endif /* CONFIG_NET_CLS_ACT */