diff options
author | Davide Caratti <dcaratti@redhat.com> | 2018-01-22 20:14:32 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-01-24 03:51:46 +0300 |
commit | 9c5f69bbd75a7db80578782b037629c5f1e59dce (patch) | |
tree | d2c862565b212a36ce9629f328958a4fbbbc956c /include/net/tc_act | |
parent | f6052cf2fc51772ea51e54c795b9ea234834ad9a (diff) | |
download | linux-9c5f69bbd75a7db80578782b037629c5f1e59dce.tar.xz |
net/sched: act_csum: don't use spinlock in the fast path
use RCU instead of spin_{,unlock}_bh() to protect concurrent read/write on
act_csum configuration, to reduce the effects of contention in the data
path when multiple readers are present.
Signed-off-by: Davide Caratti <dcaratti@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/tc_act')
-rw-r--r-- | include/net/tc_act/tc_csum.h | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/include/net/tc_act/tc_csum.h b/include/net/tc_act/tc_csum.h index 781f3433a0be..9470fd7e4350 100644 --- a/include/net/tc_act/tc_csum.h +++ b/include/net/tc_act/tc_csum.h @@ -6,10 +6,16 @@ #include <net/act_api.h> #include <linux/tc_act/tc_csum.h> +struct tcf_csum_params { + int action; + u32 update_flags; + struct rcu_head rcu; +}; + struct tcf_csum { struct tc_action common; - u32 update_flags; + struct tcf_csum_params __rcu *params; }; #define to_tcf_csum(a) ((struct tcf_csum *)a) @@ -24,7 +30,13 @@ static inline bool is_tcf_csum(const struct tc_action *a) static inline u32 tcf_csum_update_flags(const struct tc_action *a) { - return to_tcf_csum(a)->update_flags; + u32 update_flags; + + rcu_read_lock(); + update_flags = rcu_dereference(to_tcf_csum(a)->params)->update_flags; + rcu_read_unlock(); + + return update_flags; } #endif /* __NET_TC_CSUM_H */ |