net: rcu-ify tcf_proto
rcu'ify tcf_proto this allows calling tc_classify() without holding any locks. Updaters are protected by RTNL. This patch prepares the core net_sched infrastracture for running the classifier/action chains without holding the qdisc lock however it does nothing to ensure cls_xxx and act_xxx types also work without locking. Additional patches are required to address the fall out. Signed-off-by: John Fastabend <john.r.fastabend@intel.com> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
46e5da40ae
commit
25d8c0d55f
@@ -143,7 +143,7 @@ struct Qdisc_class_ops {
|
||||
void (*walk)(struct Qdisc *, struct qdisc_walker * arg);
|
||||
|
||||
/* Filter manipulation */
|
||||
struct tcf_proto ** (*tcf_chain)(struct Qdisc *, unsigned long);
|
||||
struct tcf_proto __rcu ** (*tcf_chain)(struct Qdisc *, unsigned long);
|
||||
unsigned long (*bind_tcf)(struct Qdisc *, unsigned long,
|
||||
u32 classid);
|
||||
void (*unbind_tcf)(struct Qdisc *, unsigned long);
|
||||
@@ -212,8 +212,8 @@ struct tcf_proto_ops {
|
||||
|
||||
struct tcf_proto {
|
||||
/* Fast access part */
|
||||
struct tcf_proto *next;
|
||||
void *root;
|
||||
struct tcf_proto __rcu *next;
|
||||
void __rcu *root;
|
||||
int (*classify)(struct sk_buff *,
|
||||
const struct tcf_proto *,
|
||||
struct tcf_result *);
|
||||
@@ -225,6 +225,7 @@ struct tcf_proto {
|
||||
struct Qdisc *q;
|
||||
void *data;
|
||||
const struct tcf_proto_ops *ops;
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
|
||||
struct qdisc_skb_cb {
|
||||
@@ -378,7 +379,7 @@ struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue,
|
||||
void __qdisc_calculate_pkt_len(struct sk_buff *skb,
|
||||
const struct qdisc_size_table *stab);
|
||||
void tcf_destroy(struct tcf_proto *tp);
|
||||
void tcf_destroy_chain(struct tcf_proto **fl);
|
||||
void tcf_destroy_chain(struct tcf_proto __rcu **fl);
|
||||
|
||||
/* Reset all TX qdiscs greater then index of a device. */
|
||||
static inline void qdisc_reset_all_tx_gt(struct net_device *dev, unsigned int i)
|
||||
|
Reference in New Issue
Block a user