All of lore.kernel.org
 help / color / mirror / Atom feed
From: Al Viro <viro@ZenIV.linux.org.uk>
To: David Miller <davem@davemloft.net>
Cc: jhs@mojatatu.com, jiri@resnulli.us, xiyou.wangcong@gmail.com,
	netdev@vger.kernel.org
Subject: Re: [PATCH net-next 00/11] net: sched: cls_u32 Various improvements
Date: Mon, 8 Oct 2018 06:45:15 +0100	[thread overview]
Message-ID: <20181008054515.GC32577@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20181007.212501.1606549212155525845.davem@davemloft.net>

On Sun, Oct 07, 2018 at 09:25:01PM -0700, David Miller wrote:
> From: Jamal Hadi Salim <jhs@mojatatu.com>
> Date: Sun,  7 Oct 2018 12:38:00 -0400
> 
> > Various improvements from Al.
> 
> Please submit changes that actually are compile tested:
> 
>   CC [M]  net/sched/cls_u32.o
> net/sched/cls_u32.c: In function ‘u32_delete’:
> net/sched/cls_u32.c:674:6: error: ‘root_ht’ undeclared (first use in this function); did you mean ‘root_user’?
>   if (root_ht == ht) {
>       ^~~~~~~
>       root_user
> net/sched/cls_u32.c:674:6: note: each undeclared identifier is reported only once for each function it appears in
> net/sched/cls_u32.c: In function ‘u32_set_parms’:
> net/sched/cls_u32.c:746:15: error: ‘struct tc_u_hnode’ has no member named ‘is_root’
>     if (ht_down->is_root) {
>                ^~

Er...  Both are due to missing in the very beginning of the series (well, on
top of "net: sched: cls_u32: fix hnode refcounting") commit

Author: Al Viro <viro@zeniv.linux.org.uk>
Date:   Mon Sep 3 14:39:02 2018 -0400

    net: sched: cls_u32: mark root hnode explicitly
    
    ... and produce consistent error on attempt to delete such.
    Existing check in u32_delete() is inconsistent - after
    
    tc qdisc add dev eth0 ingress
    tc filter add dev eth0 parent ffff: protocol ip prio 100 handle 1: u32 divisor 1
    tc filter add dev eth0 parent ffff: protocol ip prio 200 handle 2: u32 divisor 1
    
    both
    
    tc filter delete dev eth0 parent ffff: protocol ip prio 100 handle 801: u32
    
    and
    
    tc filter delete dev eth0 parent ffff: protocol ip prio 100 handle 800: u32
    
    will fail (at least with refcounting fixes), but the former will complain
    about an attempt to remove a busy table, while the latter will recognize
    it as root and yield "Not allowed to delete root node" instead.
    
    The problem with the existing check is that several tcf_proto instances might
    share the same tp->data and handle-to-hnode lookup will be the same for all
    of them.  So comparing an hnode to be deleted with tp->root won't catch the
    case when one tp is used to try deleting the root of another.  Solution is
    trivial - mark the root hnodes explicitly upon allocation and check for that.
    
    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
index b2c3406a2cf2..c4782aa808c7 100644
--- a/net/sched/cls_u32.c
+++ b/net/sched/cls_u32.c
@@ -84,6 +84,7 @@ struct tc_u_hnode {
 	int			refcnt;
 	unsigned int		divisor;
 	struct idr		handle_idr;
+	bool			is_root;
 	struct rcu_head		rcu;
 	u32			flags;
 	/* The 'ht' field MUST be the last field in structure to allow for
@@ -377,6 +378,7 @@ static int u32_init(struct tcf_proto *tp)
 	root_ht->refcnt++;
 	root_ht->handle = tp_c ? gen_new_htid(tp_c, root_ht) : 0x80000000;
 	root_ht->prio = tp->prio;
+	root_ht->is_root = true;
 	idr_init(&root_ht->handle_idr);
 
 	if (tp_c == NULL) {
@@ -693,7 +695,7 @@ static int u32_delete(struct tcf_proto *tp, void *arg, bool *last,
 		goto out;
 	}
 
-	if (root_ht == ht) {
+	if (ht->is_root) {
 		NL_SET_ERR_MSG_MOD(extack, "Not allowed to delete root node");
 		return -EINVAL;
 	}

  reply	other threads:[~2018-10-08 12:55 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-07 16:38 [PATCH net-next 00/11] net: sched: cls_u32 Various improvements Jamal Hadi Salim
2018-10-07 16:38 ` [PATCH net-next 01/11] net: sched: cls_u32: disallow linking to root hnode Jamal Hadi Salim
2018-10-07 16:38 ` [PATCH net-next 02/11] net: sched: cls_u32: make sure that divisor is a power of 2 Jamal Hadi Salim
2018-10-08  8:46   ` Sergei Shtylyov
2018-10-08  9:49     ` Jamal Hadi Salim
2018-10-07 16:38 ` [PATCH net-next 03/11] net: sched: cls_u32: get rid of unused argument of u32_destroy_key() Jamal Hadi Salim
2018-10-07 16:38 ` [PATCH net-next 04/11] net: sched: cls_u32: get rid of tc_u_knode ->tp Jamal Hadi Salim
2018-10-07 16:38 ` [PATCH net-next 05/11] net: sched: cls_u32: get rid of tc_u_common ->rcu Jamal Hadi Salim
2018-10-07 16:38 ` [PATCH net-next 06/11] net: sched: cls_u32: clean tc_u_common hashtable Jamal Hadi Salim
2018-10-07 16:38 ` [PATCH net-next 07/11] net: sched: cls_u32: pass tc_u_common to u32_set_parms() instead of tc_u_hnode Jamal Hadi Salim
2018-10-07 16:38 ` [PATCH net-next 08/11] net: sched: cls_u32: the tp_c argument of u32_set_parms() is always tp->data Jamal Hadi Salim
2018-10-07 16:38 ` [PATCH net-next 09/11] net: sched: cls_u32: get rid of tp_c Jamal Hadi Salim
2018-10-07 16:38 ` [PATCH net-next 10/11] net: sched: cls_u32: keep track of knodes count in tc_u_common Jamal Hadi Salim
2018-10-07 16:38 ` [PATCH net-next 11/11] net: sched: cls_u32: simplify the hell out u32_delete() emptiness check Jamal Hadi Salim
2018-10-08  4:25 ` [PATCH net-next 00/11] net: sched: cls_u32 Various improvements David Miller
2018-10-08  5:45   ` Al Viro [this message]
2018-10-08  5:55     ` David Miller
2018-10-08  6:11       ` Al Viro
2018-10-08  9:47         ` Jamal Hadi Salim

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181008054515.GC32577@ZenIV.linux.org.uk \
    --to=viro@zeniv.linux.org.uk \
    --cc=davem@davemloft.net \
    --cc=jhs@mojatatu.com \
    --cc=jiri@resnulli.us \
    --cc=netdev@vger.kernel.org \
    --cc=xiyou.wangcong@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.