Thread (11 messages) flat view 11 messages, 3 authors, 2016-02-25

Re: [Patch net-next v2 2/2] net_sched: add network namespace support for tc actions

From: Jamal Hadi Salim <jhs@mojatatu.com>
Date: 2016-02-23 13:14:32

On 16-02-22 06:57 PM, Cong Wang wrote:

[..]
quoted hunk ↗ jump to hunk
diff --git a/include/net/act_api.h b/include/net/act_api.h
index 8c4e3ff..342be6c 100644
--- a/include/net/act_api.h
+++ b/include/net/act_api.h
@@ -7,6 +7,8 @@

  #include <net/sch_generic.h>
  #include <net/pkt_sched.h>
+#include <net/net_namespace.h>
+#include <net/netns/generic.h>

  struct tcf_common {
  	struct hlist_node		tcfc_head;
@@ -87,31 +89,65 @@ struct tc_action {
  	__u32			type; /* for backward compat(TCA_OLD_COMPAT) */
  	__u32			order;
  	struct list_head	list;
+	struct tcf_hashinfo	*hinfo;
  };
It doesnt seem neccessary to have hinfo in tc_action. Quick scan:
__tcf_hash_release() seems to be the only other place that uses it.
And the callers to that appear capable of passing the struct
net or tn  which eventually propagates up...
  struct tc_action_ops {
  	struct list_head head;
-	struct tcf_hashinfo *hinfo;
  	char    kind[IFNAMSIZ];
  	__u32   type; /* TBD to match kind */
  	struct module		*owner;
  	int     (*act)(struct sk_buff *, const struct tc_action *, struct tcf_result *);
  	int     (*dump)(struct sk_buff *, struct tc_action *, int, int);
  	void	(*cleanup)(struct tc_action *, int bind);
-	int     (*lookup)(struct tc_action *, u32);
+	int     (*lookup)(struct net *, struct tc_action *, u32);
  	int     (*init)(struct net *net, struct nlattr *nla,
  			struct nlattr *est, struct tc_action *act, int ovr,
  			int bind);
-	int     (*walk)(struct sk_buff *, struct netlink_callback *, int, struct tc_action *);
+	int     (*walk)(struct net *, struct sk_buff *,
+			struct netlink_callback *, int, struct tc_action *);
+};
+
Do you really need to pass struct net to walk(); is deriving from skb
not sufficient?

+	int err = 0;
quoted hunk ↗ jump to hunk
diff --git a/net/sched/act_api.c b/net/sched/act_api.c
index acafaf7..9606666 100644
--- a/net/sched/act_api.c
+++ b/net/sched/act_api.c
@@ -36,10 +36,9 @@ static void free_tcf(struct rcu_head *head)
  	kfree(p);
  }

-static void tcf_hash_destroy(struct tc_action *a)
+static void tcf_hash_destroy(struct tcf_hashinfo *hinfo, struct tc_action *a)
  {
  	struct tcf_common *p = a->priv;
-	struct tcf_hashinfo *hinfo = a->ops->hinfo;

  	spin_lock_bh(&hinfo->lock);
  	hlist_del(&p->tcfc_head);
@@ -68,7 +67,7 @@ int __tcf_hash_release(struct tc_action *a, bool bind, bool strict)
  		if (p->tcfc_bindcnt <= 0 && p->tcfc_refcnt <= 0) {
  			if (a->ops->cleanup)
  				a->ops->cleanup(a, bind);
-			tcf_hash_destroy(a);
+			tcf_hash_destroy(a->hinfo, a);

So this seems to be the only place where a->hinfo is read from. The
rest seems to just set a->hinfo.
I took a quick look at __tcf_hash_release() and all calling sites
are net/tn aware already.
-u32 tcf_hash_new_index(struct tcf_hashinfo *hinfo)
+u32 tcf_hash_new_index(struct tc_action_net *tn)
  {
+	struct tcf_hashinfo *hinfo = tn->hinfo;
  	u32 val = hinfo->index;

That also seemed unneeded. You could have derived hinfo
from tn.

Otherwise looks reasonable. I was hoping we could get rid of the per
action pernet ops but that could come later.

cheers,
jamal
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help