From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-qv1-f74.google.com (mail-qv1-f74.google.com [209.85.219.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A81553B2FC8 for ; Tue, 28 Apr 2026 17:04:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.74 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777395864; cv=none; b=kwHoUK6OcqFh0lC//ld07h1gKf7UWb+IdqM1x/6HV+G5naCD9Nt2KmIVl/n0RxiCE0WQ/HzaLGRgr7OsU4TeIYuYjkZU5ypv+4H7EXEyv4vwft/3QBGoNau2ppjCAo44+7CWQAal0kbJbA8mebnfBXADTFiEeubwwIC9DJ4NenU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777395864; c=relaxed/simple; bh=avy4Npj6hGl/syx9dm8nIcEDDdLLgrp899VzhfMt4bU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=mAaYjgLfrptXTbqsIeV+fv622CQrbLOgERwBUgcD8pPIz2LTRqXR5rpWor+jtHsKUYgh+UzxAIzMUaW0D3NzMuenNb5x4Vq/d1zagsnASDIASLVbtWW6SZhSXv4MWSiKKGlelWgV/iH2OyGa5JqqBjPsxuFXtvWEWLGEAdhEU8A= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=rz2L0er+; arc=none smtp.client-ip=209.85.219.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="rz2L0er+" Received: by mail-qv1-f74.google.com with SMTP id 6a1803df08f44-8a275472d89so184870036d6.1 for ; Tue, 28 Apr 2026 10:04:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1777395862; x=1778000662; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=E1C/7/R1PkydHET+4UJzU2q+hhlxjTP+Gc0Qf3MP1cY=; b=rz2L0er+lqti+PSmIJLumnVoL6oqw4WzeQQdHHqcja6AyUxVhoN/kufAp8OYoorMQF /f5R74TzQ2tcuVlV5C9dTaGSDoymnGOIVA/Ak5oxtVHEdq6wsan9+qeLSnA0Mk9R7P/k MjZDpcxm8WhXosCnkLpXn19UNdsQzKkzWJw1fOmm4f3Whhlpe/13xmesZ6+LAST+ly0Y mjhsNWfkI9e1po1IwnXZFlSBWN0OoEnVZIxufkTObdzDIGOdY3bSKrtCiXj9shaFD/RT N0QImBk7z4CP0jFLew4F4h7f180Zo/oUYB59DVHvPLeyShoGP/8aVYHSrgn9zVH/sYK8 6B8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777395862; x=1778000662; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=E1C/7/R1PkydHET+4UJzU2q+hhlxjTP+Gc0Qf3MP1cY=; b=MOqYrhUR7042Z9VJ9UjN/9RwJk42iRfzwOt5NE9m8sWH7F/gnN6d+FaxR1OAbYdM8/ dwK05N9qYyeML227xGkPagGtsLuu2ON7H2zdBUKadXbuCnmGy99ahXA7PirbNWGlRBB2 Y+mQEKqkb9IuhGS/BTY5v80cK1Qe2zUJhtYN9kj4t6pQQJkPAtuqkLUGBm7MyjSrvs9k ApLZdBlfW9qy9Q3Zwa8RW7GBfZCcY/Tj5zDztR2qhGWQzP9tDMjz/pJ0ee82a415MfXL lt4s8ifI5Ct29NBCZ/nzvmWLjPM7VvRzBKo7KkSmNHkrboDUmxSPk8n+gszw2qrtK44U 0kWg== X-Forwarded-Encrypted: i=1; AFNElJ/Qlcx6Zwcot6hg5BucNgV0F54ZrHBCyO5ZsLUrunnZl9jBoYD4p6yB1jhlthL+nYkgxNaHODc=@vger.kernel.org X-Gm-Message-State: AOJu0YztiNhIOiE89VUlXP9GnN4o7zYg3XmfqjYDzUAIZYf0F74Ou53v Vx/9pqYFJMxwzdwZNdCq2b5IbDeW0ovW0FzrBw6wSS1aI00jYarfNueOxI/7KYUe4TUuJGR+VKl 1IpfkIbziSGMhLg== X-Received: from qvhd14.prod.google.com ([2002:a05:6214:21ce:b0:89c:87f9:550e]) (user=edumazet job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6214:21e1:b0:8ac:a87b:c81c with SMTP id 6a1803df08f44-8b3ede02945mr4228626d6.44.1777395861242; Tue, 28 Apr 2026 10:04:21 -0700 (PDT) Date: Tue, 28 Apr 2026 17:04:13 +0000 In-Reply-To: <20260428170414.250566-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260428170414.250566-1-edumazet@google.com> X-Mailer: git-send-email 2.54.0.545.g6539524ca2-goog Message-ID: <20260428170414.250566-4-edumazet@google.com> Subject: [PATCH v2 net-next 3/4] net/sched: switch tc_dump_qdisc() to for_each_netdev_dump() From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: Simon Horman , Jamal Hadi Salim , Jiri Pirko , netdev@vger.kernel.org, eric.dumazet@gmail.com, Eric Dumazet Content-Type: text/plain; charset="UTF-8" Use for_each_netdev_dump() instead of for_each_netdev(). This is more scalable, and will ease RCU conversion. This also offer better behavior when other threads are adding or deleting netevices concurrently. This enables dumping qdiscs for a single device at user space request in the following patch. Signed-off-by: Eric Dumazet --- net/sched/sch_api.c | 62 ++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 029e0f87ea9c61cc757432a07a6af92c90c551ef..641f5a01aca167dd230173078f2db5801dca58da 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -1877,18 +1877,18 @@ static int tc_dump_qdisc_root(struct Qdisc *root, struct sk_buff *skb, static int tc_dump_qdisc(struct sk_buff *skb, struct netlink_callback *cb) { - struct net *net = sock_net(skb->sk); - int idx, q_idx; - int s_idx, s_q_idx; - struct net_device *dev; const struct nlmsghdr *nlh = cb->nlh; + struct net *net = sock_net(skb->sk); struct nlattr *tca[TCA_MAX + 1]; + struct { + unsigned long ifindex; + int q_idx; + } *ctx = (void *)cb->ctx; + unsigned long s_ifindex; + struct net_device *dev; + int s_q_idx, q_idx; int err; - s_idx = cb->args[0]; - s_q_idx = q_idx = cb->args[1]; - - idx = 0; ASSERT_RTNL(); err = nlmsg_parse_deprecated(nlh, sizeof(struct tcmsg), tca, TCA_MAX, @@ -1896,42 +1896,40 @@ static int tc_dump_qdisc(struct sk_buff *skb, struct netlink_callback *cb) if (err < 0) return err; - for_each_netdev(net, dev) { + s_ifindex = ctx->ifindex; + s_q_idx = ctx->q_idx; + + for_each_netdev_dump(net, dev, ctx->ifindex) { struct netdev_queue *dev_queue; + struct Qdisc *q; - if (idx < s_idx) - goto cont; - if (idx > s_idx) - s_q_idx = 0; q_idx = 0; netdev_lock_ops(dev); - if (tc_dump_qdisc_root(rtnl_dereference(dev->qdisc), - skb, cb, &q_idx, s_q_idx, - true, tca[TCA_DUMP_INVISIBLE]) < 0) { - netdev_unlock_ops(dev); - goto done; - } + q = rtnl_dereference(dev->qdisc); + err = tc_dump_qdisc_root(q, skb, cb, &q_idx, s_q_idx, + true, tca[TCA_DUMP_INVISIBLE]); + if (err < 0) + goto error_unlock; dev_queue = dev_ingress_queue(dev); - if (dev_queue && - tc_dump_qdisc_root(rtnl_dereference(dev_queue->qdisc_sleeping), - skb, cb, &q_idx, s_q_idx, false, - tca[TCA_DUMP_INVISIBLE]) < 0) { - netdev_unlock_ops(dev); - goto done; + if (dev_queue) { + q = rtnl_dereference(dev_queue->qdisc_sleeping); + err = tc_dump_qdisc_root(q, skb, cb, &q_idx, s_q_idx, + false, tca[TCA_DUMP_INVISIBLE]); + if (err < 0) + goto error_unlock; } netdev_unlock_ops(dev); - -cont: - idx++; + s_q_idx = 0; } + return skb->len; -done: - cb->args[0] = idx; - cb->args[1] = q_idx; +error_unlock: + netdev_unlock_ops(dev); + ctx->q_idx = q_idx; - return skb->len; + return err; } -- 2.54.0.545.g6539524ca2-goog