All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiri Pirko <jiri@resnulli.us>
To: renmingshuai <renmingshuai@huawei.com>
Cc: jhs@mojatatu.com, xiyou.wangcong@gmail.com, davem@davemloft.net,
	vladbu@nvidia.com, netdev@vger.kernel.org, yanan@huawei.com,
	liaichun@huawei.com, caowangbao@huawei.com
Subject: Re: [PATCH] net/sched: Forbid assigning mirred action to a filter attached to the egress
Date: Thu, 14 Mar 2024 12:43:19 +0100	[thread overview]
Message-ID: <ZfLi17TuJpcd6KFb@nanopsycho> (raw)
In-Reply-To: <20240314111713.5979-1-renmingshuai@huawei.com>

Thu, Mar 14, 2024 at 12:17:13PM CET, renmingshuai@huawei.com wrote:
>As we all know the mirred action is used to mirroring or redirecting the
>packet it receives. Howerver, add mirred action to a filter attached to
>a egress qdisc might cause a deadlock. To reproduce the problem, perform
>the following steps:
>(1)tc qdisc add dev eth0 root handle 1: htb default 30 \n
>(2)tc filter add dev eth2 protocol ip prio 2 flower verbose \
>     action police rate 100mbit burst 12m conform-exceed jump 1 \
>     / pipe mirred egress redirect dev eth2 action drop
>
>The stack is show as below:
>[28848.883915]  _raw_spin_lock+0x1e/0x30
>[28848.884367]  __dev_queue_xmit+0x160/0x850
>[28848.884851]  ? 0xffffffffc031906a
>[28848.885279]  tcf_mirred_act+0x3ab/0x596 [act_mirred]
>[28848.885863]  tcf_action_exec.part.0+0x88/0x130
>[28848.886401]  fl_classify+0x1ca/0x1e0 [cls_flower]
>[28848.886970]  ? dequeue_entity+0x145/0x9e0
>[28848.887464]  ? newidle_balance+0x23f/0x2f0
>[28848.887973]  ? nft_lookup_eval+0x57/0x170 [nf_tables]
>[28848.888566]  ? nft_do_chain+0xef/0x430 [nf_tables]
>[28848.889137]  ? __flush_work.isra.0+0x35/0x80
>[28848.889657]  ? nf_ct_get_tuple+0x1cf/0x210 [nf_conntrack]
>[28848.890293]  ? do_select+0x637/0x870
>[28848.890735]  tcf_classify+0x52/0xf0
>[28848.891177]  htb_classify+0x9d/0x1c0 [sch_htb]
>[28848.891722]  htb_enqueue+0x3a/0x1c0 [sch_htb]
>[28848.892251]  __dev_queue_xmit+0x2d8/0x850
>[28848.892738]  ? nf_hook_slow+0x3c/0xb0
>[28848.893198]  ip_finish_output2+0x272/0x580
>[28848.893692]  __ip_queue_xmit+0x193/0x420
>[28848.894179]  __tcp_transmit_skb+0x8cc/0x970
>
>In this case, the process has hold the qdisc spin lock in __dev_queue_xmit
>before the egress packets are mirred, and it will attempt to obtain the
>spin lock again after packets are mirred, which cause a deadlock.
>
>Fix the issue by forbidding assigning mirred action to a filter attached
>to the egress.
>
>Signed-off-by: Mingshuai Ren <renmingshuai@huawei.com>

You are missing "Fixes" tag.


>---
> net/sched/act_mirred.c                        |  4 +++
> .../tc-testing/tc-tests/actions/mirred.json   | 32 +++++++++++++++++++
> 2 files changed, 36 insertions(+)
>
>diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c
>index 5b3814365924..fc96705285fb 100644
>--- a/net/sched/act_mirred.c
>+++ b/net/sched/act_mirred.c
>@@ -120,6 +120,10 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla,
> 		NL_SET_ERR_MSG_MOD(extack, "Mirred requires attributes to be passed");
> 		return -EINVAL;
> 	}
>+	if (tp->chain->block->q->parent != TC_H_INGRESS) {
>+		NL_SET_ERR_MSG_MOD(extack, "Mirred can only be assigned to the filter attached to ingress");

Hmm, that is quite restrictive. I'm pretty sure you would break some
valid usecases.


>+		return -EINVAL;
>+	}
> 	ret = nla_parse_nested_deprecated(tb, TCA_MIRRED_MAX, nla,
> 					  mirred_policy, extack);
> 	if (ret < 0)
>diff --git a/tools/testing/selftests/tc-testing/tc-tests/actions/mirred.json b/tools/testing/selftests/tc-testing/tc-tests/actions/mirred.json
>index b73bd255ea36..50c6153bf34c 100644
>--- a/tools/testing/selftests/tc-testing/tc-tests/actions/mirred.json
>+++ b/tools/testing/selftests/tc-testing/tc-tests/actions/mirred.json
>@@ -1052,5 +1052,37 @@
>             "$TC qdisc del dev $DEV1 ingress_block 21 clsact",
>             "$TC actions flush action mirred"
>         ]
>+    },
>+    {
>+        "id": "fdda",
>+        "name": "Add mirred mirror to the filter which attached to engress",
>+        "category": [
>+            "actions",
>+            "mirred"
>+        ],
>+        "plugins": {
>+            "requires": "nsPlugin"
>+        },
>+        "setup": [
>+            [
>+                "$TC actions flush action mirred",
>+                0,
>+                1,
>+                255
>+            ],
>+            [
>+                "$TC qdisc add dev $DEV1 root handle 1: htb default 1",
>+                0
>+            ]
>+        ],
>+        "cmdUnderTest": "$TC filter add dev $DEV1 protocol ip u32 match ip protocol 1 0xff action mirred egress mirror dev $DEV1",
>+        "expExitCode": "2",
>+        "verifyCmd": "$TC action list action mirred",
>+        "matchPattern": "^[ \t]+index [0-9]+ ref",
>+        "matchCount": "0",
>+        "teardown": [
>+            "$TC qdisc del dev $DEV1 root handle 1: htb default 1",
>+            "$TC actions flush action mirred"
>+        ]
>     }
> ]
>-- 
>2.33.0
>
>

  reply	other threads:[~2024-03-14 11:43 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-14 11:17 [PATCH] net/sched: Forbid assigning mirred action to a filter attached to the egress renmingshuai
2024-03-14 11:43 ` Jiri Pirko [this message]
2024-03-14 14:04   ` renmingshuai
2024-03-14 14:47     ` Pedro Tammela
2024-03-14 17:14 ` Jamal Hadi Salim
2024-03-15  1:56   ` renmingshuai
2024-03-15 22:34     ` Jamal Hadi Salim
2024-03-17 16:10   ` Jamal Hadi Salim
2024-03-18 14:27     ` Jamal Hadi Salim
2024-03-18 15:46       ` Eric Dumazet
2024-03-18 17:36         ` Jamal Hadi Salim
2024-03-18 19:11           ` Eric Dumazet
2024-03-18 22:05             ` Jamal Hadi Salim
2024-03-19  9:38               ` Eric Dumazet
2024-03-19 20:54                 ` Jamal Hadi Salim
2024-03-20 16:46                   ` Jamal Hadi Salim
2024-03-20 16:57                   ` Eric Dumazet
2024-03-20 17:31                     ` Jamal Hadi Salim
2024-03-20 17:50                       ` Jamal Hadi Salim
2024-03-20 18:13                         ` Eric Dumazet
2024-03-20 18:25                           ` Eric Dumazet
2024-03-20 19:34                             ` Jamal Hadi Salim
2024-03-24 15:27                               ` Jamal Hadi Salim
2024-03-26 23:18                                 ` 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=ZfLi17TuJpcd6KFb@nanopsycho \
    --to=jiri@resnulli.us \
    --cc=caowangbao@huawei.com \
    --cc=davem@davemloft.net \
    --cc=jhs@mojatatu.com \
    --cc=liaichun@huawei.com \
    --cc=netdev@vger.kernel.org \
    --cc=renmingshuai@huawei.com \
    --cc=vladbu@nvidia.com \
    --cc=xiyou.wangcong@gmail.com \
    --cc=yanan@huawei.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.