From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-qk1-f201.google.com (mail-qk1-f201.google.com [209.85.222.201]) (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 85D733C8724 for ; Mon, 27 Apr 2026 13:26:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777296366; cv=none; b=NXqz+OLMQSEHiCN772YqFLjkf1zUZevAT/yfwsnHWIXaJ0kchZNJVQ4LhcLurqZDLLHhmbiXRGaLCW1ptApAQ0fiFIQ5NwR9c2keEDVQ0Qq3r92NPizJqAucx4u4UrKdASzAJxqjOqhJTfDPf0iDFE+RfqJLaeZbmGG7HFKhqgI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777296366; c=relaxed/simple; bh=eO6BZaF8tID+HMHZwjDSJTW+C//Sv/VCQY6Y5kdBxc8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=CAqQmjKcZZLMzyFhFPnN0pgZucu0Ashv3OD1+z7/jsAOBvgoeZbBz19SPsKfBGvUhGDm+krrTAEvqkgwl+KROf+oK8VjCm+v6/zidiHsTk3a3P6KAGfudzMWRu2nNV1Lzz5WFsSBM65e+hwKWuXBbjVJlmk1AvuVevWDPBskwWM= 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=sPKG0Gbl; arc=none smtp.client-ip=209.85.222.201 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="sPKG0Gbl" Received: by mail-qk1-f201.google.com with SMTP id af79cd13be357-8eaaf673eb4so1809148985a.2 for ; Mon, 27 Apr 2026 06:26:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1777296363; x=1777901163; 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=osIWCfX1fd3cxwlHFPvebubj5N4ZDSqkRS5M1d8scBQ=; b=sPKG0GblWJtee3ieGe3QdV231dPP9EUnpSOuNFQnt4ZINGNMhHw213h6xI/Tdg3Buu 4wbn1kIafp/HPpOQumOwbrvdAslXrBbzZl5MzFOgU1cdJNiNgyRK9tJiTKxWko947lM1 S2yjC1XvoVHGw2/n1/OE4Wv+5d6819DoVUiL0gjBl98ejxKtzy3XzEa3Luz060g4auhD vKy8nTZPEL0NlGi5osqXjLknTRlPqsCmDQHGWuAuMxKnsFVqeWPcB/3TX+OJE5JHDQ+4 dI3lgs5C/Rft+2xzuwJ7qoKXQLK75v8ejGHQ+SYzI8ZJLpzAuzf9/cPaxp+KJ61G6fdL gLGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777296363; x=1777901163; 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=osIWCfX1fd3cxwlHFPvebubj5N4ZDSqkRS5M1d8scBQ=; b=pRDvk7WLw/upyeO3Y5sgU8QcvEI5Qzufettb1D5kVL0NJHKRExwX23kJpZpZZ2r+PA V+x6OQYRwNjaq6auSM7fff/sn6Mjittxaxdse1H3TyQ9fyVTXSEvXmfCzsu/27VruQ++ ONhuOP96C7/dgyX+/1gKs7b0B1L5U8JlJuZ2H9TMsLIIuiNW4cDFg/ZxtY7K/4RGbSOL g5YA8h0vLbhaR0Wo2HdiF/kP3jyKXuBaHy1LyT4R6d2ih1xwNy0RWyNdLBVfXakaYlIV vfBvcD+K8IB8PT/Iq3YqGlzwlveVxpKleVXvXyypqHJJStApZh1i6SavsogGWHlulT1O KzLg== X-Forwarded-Encrypted: i=1; AFNElJ9E0JvhNvQAq3GvUjlPa9NYoiXrye+AharptAahXDJJQNOaB17ckAV5rWg9/OzFNlWUdQMflBw=@vger.kernel.org X-Gm-Message-State: AOJu0YwlUP3b0TxXiQ/BF5htBgNVw5JPcfNGkdi/bIszmbvJw66MZteI CNE5WlvX0Jfl+4f11sJj77U901BzzcrmBlLr4XKmqFrzTr4f+E4IT5iFS5F6lS2NJLpvIe3Ftgv 4ezxfNX+PJDxf2w== X-Received: from qkaw3-n2.prod.google.com ([2002:a05:620a:a2c3:20b0:8cb:4a2d:574d]) (user=edumazet job=prod-delivery.src-stubby-dispatcher) by 2002:a05:620a:4456:b0:8cf:e1c9:b286 with SMTP id af79cd13be357-8e78ed5dd31mr5918306185a.2.1777296362655; Mon, 27 Apr 2026 06:26:02 -0700 (PDT) Date: Mon, 27 Apr 2026 13:25:54 +0000 In-Reply-To: <20260427132555.1791636-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260427132555.1791636-1-edumazet@google.com> X-Mailer: git-send-email 2.54.0.545.g6539524ca2-goog Message-ID: <20260427132555.1791636-4-edumazet@google.com> Subject: [PATCH 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 , Kuniyuki Iwashima , 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 netdevices 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 | 61 ++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 322eab3bd2b1327af323c44333318bdd52c7ee52..c4e8059acdd324441e0d069f6878bbfcab5a0cc7 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -1873,18 +1873,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, @@ -1892,42 +1892,41 @@ 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) + if (ctx->ifindex > s_ifindex) 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++; } + 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