mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 23:32:14 +00:00
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:
parent
46e5da40ae
commit
25d8c0d55f
17 changed files with 121 additions and 88 deletions
|
@ -57,7 +57,7 @@ struct choke_sched_data {
|
|||
|
||||
/* Variables */
|
||||
struct red_vars vars;
|
||||
struct tcf_proto *filter_list;
|
||||
struct tcf_proto __rcu *filter_list;
|
||||
struct {
|
||||
u32 prob_drop; /* Early probability drops */
|
||||
u32 prob_mark; /* Early probability marks */
|
||||
|
@ -193,9 +193,11 @@ static bool choke_classify(struct sk_buff *skb,
|
|||
{
|
||||
struct choke_sched_data *q = qdisc_priv(sch);
|
||||
struct tcf_result res;
|
||||
struct tcf_proto *fl;
|
||||
int result;
|
||||
|
||||
result = tc_classify(skb, q->filter_list, &res);
|
||||
fl = rcu_dereference_bh(q->filter_list);
|
||||
result = tc_classify(skb, fl, &res);
|
||||
if (result >= 0) {
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
switch (result) {
|
||||
|
@ -249,7 +251,7 @@ static bool choke_match_random(const struct choke_sched_data *q,
|
|||
return false;
|
||||
|
||||
oskb = choke_peek_random(q, pidx);
|
||||
if (q->filter_list)
|
||||
if (rcu_access_pointer(q->filter_list))
|
||||
return choke_get_classid(nskb) == choke_get_classid(oskb);
|
||||
|
||||
return choke_match_flow(oskb, nskb);
|
||||
|
@ -257,11 +259,11 @@ static bool choke_match_random(const struct choke_sched_data *q,
|
|||
|
||||
static int choke_enqueue(struct sk_buff *skb, struct Qdisc *sch)
|
||||
{
|
||||
int ret = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||
struct choke_sched_data *q = qdisc_priv(sch);
|
||||
const struct red_parms *p = &q->parms;
|
||||
int ret = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||
|
||||
if (q->filter_list) {
|
||||
if (rcu_access_pointer(q->filter_list)) {
|
||||
/* If using external classifiers, get result and record it. */
|
||||
if (!choke_classify(skb, sch, &ret))
|
||||
goto other_drop; /* Packet was eaten by filter */
|
||||
|
@ -554,7 +556,8 @@ static unsigned long choke_bind(struct Qdisc *sch, unsigned long parent,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct tcf_proto **choke_find_tcf(struct Qdisc *sch, unsigned long cl)
|
||||
static struct tcf_proto __rcu **choke_find_tcf(struct Qdisc *sch,
|
||||
unsigned long cl)
|
||||
{
|
||||
struct choke_sched_data *q = qdisc_priv(sch);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue