mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
487e9589cc
In order to remove rtnl lock dependency from flow_action representation translator, change rcu_dereference_bh_rtnl() to rcu_dereference_protected() in police action helpers that provide external access to rate and burst values. This is safe to do because the functions are not called from anywhere else outside flow_action infrastructure which was modified to obtain tcf_lock when accessing action data in one of previous patches in the series. Signed-off-by: Vlad Buslov <vladbu@mellanox.com> Acked-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
72 lines
1.6 KiB
C
72 lines
1.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __NET_TC_POLICE_H
|
|
#define __NET_TC_POLICE_H
|
|
|
|
#include <net/act_api.h>
|
|
|
|
struct tcf_police_params {
|
|
int tcfp_result;
|
|
u32 tcfp_ewma_rate;
|
|
s64 tcfp_burst;
|
|
u32 tcfp_mtu;
|
|
s64 tcfp_mtu_ptoks;
|
|
struct psched_ratecfg rate;
|
|
bool rate_present;
|
|
struct psched_ratecfg peak;
|
|
bool peak_present;
|
|
struct rcu_head rcu;
|
|
};
|
|
|
|
struct tcf_police {
|
|
struct tc_action common;
|
|
struct tcf_police_params __rcu *params;
|
|
|
|
spinlock_t tcfp_lock ____cacheline_aligned_in_smp;
|
|
s64 tcfp_toks;
|
|
s64 tcfp_ptoks;
|
|
s64 tcfp_t_c;
|
|
};
|
|
|
|
#define to_police(pc) ((struct tcf_police *)pc)
|
|
|
|
/* old policer structure from before tc actions */
|
|
struct tc_police_compat {
|
|
u32 index;
|
|
int action;
|
|
u32 limit;
|
|
u32 burst;
|
|
u32 mtu;
|
|
struct tc_ratespec rate;
|
|
struct tc_ratespec peakrate;
|
|
};
|
|
|
|
static inline bool is_tcf_police(const struct tc_action *act)
|
|
{
|
|
#ifdef CONFIG_NET_CLS_ACT
|
|
if (act->ops && act->ops->id == TCA_ID_POLICE)
|
|
return true;
|
|
#endif
|
|
return false;
|
|
}
|
|
|
|
static inline u64 tcf_police_rate_bytes_ps(const struct tc_action *act)
|
|
{
|
|
struct tcf_police *police = to_police(act);
|
|
struct tcf_police_params *params;
|
|
|
|
params = rcu_dereference_protected(police->params,
|
|
lockdep_is_held(&police->tcf_lock));
|
|
return params->rate.rate_bytes_ps;
|
|
}
|
|
|
|
static inline s64 tcf_police_tcfp_burst(const struct tc_action *act)
|
|
{
|
|
struct tcf_police *police = to_police(act);
|
|
struct tcf_police_params *params;
|
|
|
|
params = rcu_dereference_protected(police->params,
|
|
lockdep_is_held(&police->tcf_lock));
|
|
return params->tcfp_burst;
|
|
}
|
|
|
|
#endif /* __NET_TC_POLICE_H */
|