]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/sched/act_mirred.c
Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux.git] / net / sched / act_mirred.c
index 08923b21e56607f4b163dafa4e2f97d348a34061..1e3eb3a975324a2630f1b66f08655ea6de8d331c 100644 (file)
@@ -93,7 +93,7 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla,
                           struct nlattr *est, struct tc_action **a,
                           int ovr, int bind, bool rtnl_held,
                           struct tcf_proto *tp,
-                          struct netlink_ext_ack *extack)
+                          u32 flags, struct netlink_ext_ack *extack)
 {
        struct tc_action_net *tn = net_generic(net, mirred_net_id);
        struct nlattr *tb[TCA_MIRRED_MAX + 1];
@@ -148,8 +148,8 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla,
                        NL_SET_ERR_MSG_MOD(extack, "Specified device does not exist");
                        return -EINVAL;
                }
-               ret = tcf_idr_create(tn, index, est, a,
-                                    &act_mirred_ops, bind, true);
+               ret = tcf_idr_create_from_flags(tn, index, est, a,
+                                               &act_mirred_ops, bind, flags);
                if (ret) {
                        tcf_idr_cleanup(tn, index);
                        return ret;
@@ -178,8 +178,8 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla,
                        goto put_chain;
                }
                mac_header_xmit = dev_is_mac_header_xmit(dev);
-               rcu_swap_protected(m->tcfm_dev, dev,
-                                  lockdep_is_held(&m->tcf_lock));
+               dev = rcu_replace_pointer(m->tcfm_dev, dev,
+                                         lockdep_is_held(&m->tcf_lock));
                if (dev)
                        dev_put(dev);
                m->tcfm_mac_header_xmit = mac_header_xmit;
@@ -231,7 +231,7 @@ static int tcf_mirred_act(struct sk_buff *skb, const struct tc_action *a,
        }
 
        tcf_lastuse_update(&m->tcf_tm);
-       bstats_cpu_update(this_cpu_ptr(m->common.cpu_bstats), skb);
+       tcf_action_update_bstats(&m->common, skb);
 
        m_mac_header_xmit = READ_ONCE(m->tcfm_mac_header_xmit);
        m_eaction = READ_ONCE(m->tcfm_eaction);
@@ -289,8 +289,8 @@ static int tcf_mirred_act(struct sk_buff *skb, const struct tc_action *a,
                /* let's the caller reinsert the packet, if possible */
                if (use_reinsert) {
                        res->ingress = want_ingress;
-                       res->qstats = this_cpu_ptr(m->common.cpu_qstats);
-                       skb_tc_reinsert(skb, res);
+                       if (skb_tc_reinsert(skb, res))
+                               tcf_action_inc_overlimit_qstats(&m->common);
                        __this_cpu_dec(mirred_rec_level);
                        return TC_ACT_CONSUMED;
                }
@@ -303,7 +303,7 @@ static int tcf_mirred_act(struct sk_buff *skb, const struct tc_action *a,
 
        if (err) {
 out:
-               qstats_overlimit_inc(this_cpu_ptr(m->common.cpu_qstats));
+               tcf_action_inc_overlimit_qstats(&m->common);
                if (tcf_mirred_is_act_redirect(m_eaction))
                        retval = TC_ACT_SHOT;
        }
@@ -318,10 +318,7 @@ static void tcf_stats_update(struct tc_action *a, u64 bytes, u32 packets,
        struct tcf_mirred *m = to_mirred(a);
        struct tcf_t *tm = &m->tcf_tm;
 
-       _bstats_cpu_update(this_cpu_ptr(a->cpu_bstats), bytes, packets);
-       if (hw)
-               _bstats_cpu_update(this_cpu_ptr(a->cpu_bstats_hw),
-                                  bytes, packets);
+       tcf_action_update_stats(a, bytes, packets, false, hw);
        tm->lastuse = max_t(u64, tm->lastuse, lastuse);
 }