[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1472795840-31901-3-git-send-email-xiyou.wangcong@gmail.com>
Date: Thu, 1 Sep 2016 22:57:16 -0700
From: Cong Wang <xiyou.wangcong@...il.com>
To: netdev@...r.kernel.org
Cc: jhs@...atatu.com, Cong Wang <xiyou.wangcong@...il.com>
Subject: [RFC Patch net-next 2/6] net_sched: introduce tcf_hash_replace()
This API is used to replace the old action in hash table
with the new one. It is used by the following patch.
Cc: Jamal Hadi Salim <jhs@...atatu.com>
Signed-off-by: Cong Wang <xiyou.wangcong@...il.com>
---
include/net/act_api.h | 2 ++
net/sched/act_api.c | 20 ++++++++++++++++++++
2 files changed, 22 insertions(+)
diff --git a/include/net/act_api.h b/include/net/act_api.h
index 82f3c91..a374bab 100644
--- a/include/net/act_api.h
+++ b/include/net/act_api.h
@@ -164,6 +164,8 @@ int tcf_hash_create(struct tc_action_net *tn, u32 index, struct nlattr *est,
bool cpustats);
void tcf_hash_cleanup(struct tc_action *a, struct nlattr *est);
void tcf_hash_insert(struct tc_action_net *tn, struct tc_action *a);
+void tcf_hash_replace(struct tc_action_net *tn, struct tc_action **old,
+ struct tc_action *new, int bind);
int __tcf_hash_release(struct tc_action *a, bool bind, bool strict);
diff --git a/net/sched/act_api.c b/net/sched/act_api.c
index 06111aa..db907e5 100644
--- a/net/sched/act_api.c
+++ b/net/sched/act_api.c
@@ -306,6 +306,26 @@ void tcf_hash_insert(struct tc_action_net *tn, struct tc_action *a)
}
EXPORT_SYMBOL(tcf_hash_insert);
+void tcf_hash_replace(struct tc_action_net *tn, struct tc_action **old,
+ struct tc_action *new, int bind)
+{
+ struct tcf_hashinfo *hinfo = tn->hinfo;
+ unsigned int h = tcf_hash(new->tcfa_index, hinfo->hmask);
+
+ spin_lock_bh(&hinfo->lock);
+ if (*old)
+ hlist_replace_rcu(&(*old)->tcfa_head, &new->tcfa_head);
+ else
+ hlist_add_head_rcu(&new->tcfa_head, &hinfo->htab[h]);
+ spin_unlock_bh(&hinfo->lock);
+
+ if (*old)
+ tcf_hash_release(*old, bind);
+
+ rcu_assign_pointer(*old, new);
+}
+EXPORT_SYMBOL(tcf_hash_replace);
+
void tcf_hashinfo_destroy(const struct tc_action_ops *ops,
struct tcf_hashinfo *hinfo)
{
--
2.1.0
Powered by blists - more mailing lists