net/sched: act_skbedit: don't use spinlock in the data path
use RCU instead of spin_{,un}lock_bh, to protect concurrent read/write on act_skbedit configuration. This reduces the effects of contention in the data path, in case multiple readers are present. Signed-off-by: Davide Caratti <dcaratti@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
6f3dfb0dc8
commit
c749cdda90
@@ -22,14 +22,19 @@
|
||||
#include <net/act_api.h>
|
||||
#include <linux/tc_act/tc_skbedit.h>
|
||||
|
||||
struct tcf_skbedit_params {
|
||||
u32 flags;
|
||||
u32 priority;
|
||||
u32 mark;
|
||||
u32 mask;
|
||||
u16 queue_mapping;
|
||||
u16 ptype;
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
|
||||
struct tcf_skbedit {
|
||||
struct tc_action common;
|
||||
u32 flags;
|
||||
u32 priority;
|
||||
u32 mark;
|
||||
u32 mask;
|
||||
u16 queue_mapping;
|
||||
u16 ptype;
|
||||
struct tc_action common;
|
||||
struct tcf_skbedit_params __rcu *params;
|
||||
};
|
||||
#define to_skbedit(a) ((struct tcf_skbedit *)a)
|
||||
|
||||
@@ -37,15 +42,27 @@ struct tcf_skbedit {
|
||||
static inline bool is_tcf_skbedit_mark(const struct tc_action *a)
|
||||
{
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
if (a->ops && a->ops->type == TCA_ACT_SKBEDIT)
|
||||
return to_skbedit(a)->flags == SKBEDIT_F_MARK;
|
||||
u32 flags;
|
||||
|
||||
if (a->ops && a->ops->type == TCA_ACT_SKBEDIT) {
|
||||
rcu_read_lock();
|
||||
flags = rcu_dereference(to_skbedit(a)->params)->flags;
|
||||
rcu_read_unlock();
|
||||
return flags == SKBEDIT_F_MARK;
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline u32 tcf_skbedit_mark(const struct tc_action *a)
|
||||
{
|
||||
return to_skbedit(a)->mark;
|
||||
u32 mark;
|
||||
|
||||
rcu_read_lock();
|
||||
mark = rcu_dereference(to_skbedit(a)->params)->mark;
|
||||
rcu_read_unlock();
|
||||
|
||||
return mark;
|
||||
}
|
||||
|
||||
#endif /* __NET_TC_SKBEDIT_H */
|
||||
|
Reference in New Issue
Block a user