From nobody Mon Jun 8 08:29:03 2026 Received: from mail-pj1-f50.google.com (mail-pj1-f50.google.com [209.85.216.50]) (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 7824733EB01 for ; Sun, 31 May 2026 12:54:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780232099; cv=none; b=UGQeY3U/syw8Pews6D0NfBab/ZzSg2dwbcsE7SeN3o01t9rxUvnZCM6GOaAOJzxlHqSid3wJgzLcgXMhnt0D8bbwAhIoWpGbE7vWmZLBEl6WaHzETpdWZjTx3Y79WgPibmAockG/d2vi9NUDXhp0DDi/AzHol5oDoE0SDUdCobk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780232099; c=relaxed/simple; bh=5u2KQOnVNqKU1wLF24UtPobTeUEHvbN0LEXNqkKlJZ0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=R65mclYx3SIyeZUILqJgbvziVmfUsJmMPbTl281sJ5KGrYYEAdfmnMygeOowQYYpV6Z5LmJqnoX0IbwgZ2sthbKj9bBdIVacRMnA3xL03Q87ROwcD/rvw3/r7X4qCpALnvS2U52wyFmcOrrPmGd/mMyTLdgNzIF8pUTpvdWAnW0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=KdAroEUE; arc=none smtp.client-ip=209.85.216.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KdAroEUE" Received: by mail-pj1-f50.google.com with SMTP id 98e67ed59e1d1-36d98b68d68so292935a91.2 for ; Sun, 31 May 2026 05:54:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780232098; x=1780836898; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MXAHqU9DQEEVu5mSHXQiOzAqz+bMJsahwn6RWh9p8Ic=; b=KdAroEUEpZ7GiqR9XFJhZVFX6zAgbU083pbVmzz1Mmou+9XeAZJziqL7aFQgAXH6gw d57gsCddxGYLzD0oNaOH5mD+RU4MIexLYMNTgTD7TLD27lmBw9s88htGSAEUc7vlK9P7 wbBg1jFvyuLDCAN19ayCB9mQ4l91k0O4JxVkVhxpb/H5iHs3tA3YWh+8a6QgwTdO5HaT ijSexjF5KYhmPMVSNUQo82+2IGmDMc/hOJ1BQLtrT2zFUlTWTi9byEb2jPgP10ARxxXf i2cGOydictIEF6Zp2sUzAb4/tfXcMFzitAuTUVtxK4/juxgnQRbKiTVbTJCxuErUSseG JW3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780232098; x=1780836898; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=MXAHqU9DQEEVu5mSHXQiOzAqz+bMJsahwn6RWh9p8Ic=; b=ALA2UFFNoFOhj/BHCLA78pBGN6Xw+1PL8t0uAfcVgkUPayovbS4oTH92cgJ3hdRsGc xd9JTyq5+mj7XzGEw1ZP/28NbTT2kOVeCO5YoKlN7n5EFmT8WBmV9FxsApn/LvbZ2awD 2A7Xoh6pn8kLFVDni8aRFL2Vt+Qq5Km7vkgNENmMfs6VEbu13DWbLU7Sf5nwSE34Wjut zcwZ95OnLVa5HDZzZIyvrfI6EHNYA6FQ78sWy5N+nJ+bLeqwDJ//uftTPpf4dd5H7Z8M AmNjMESfYCYUKvrQHezKiOLUZZ2Kl6C6CldET6Jq450SVQKeRHc4JAhTVW08mVSmQAIb GmyQ== X-Forwarded-Encrypted: i=1; AFNElJ/bOaUa/Ox41BWTO40khl971DAf9vjOWAgJ9tDxeuOtmApkyq09EhB1UbtUeGu+AFhgnmKWTCg1OQE72EE=@vger.kernel.org X-Gm-Message-State: AOJu0YybPo37evGKEfFNqVWhP5Xp+33J2jyte9a0qqyo1cy9oOPHEtZL R/LVFI9tlPDmIYpzy4K5fUeoc5CIq5oGUUg2pane8arhrWCmC8pXZaVL X-Gm-Gg: Acq92OHq6+XPHtNPKl2SAJ014HC9GPW3DsVxL9tCo34L5WkRVJlVUlzxE9Jh2xfBkn1 ZDu1sreFX8o5fRAaxoaziOSrGC+TOa2fuDbIRlGStVgrvkUKi+Ai9miPJmqfASNd3x5V9iDioVg rant1a9aq3DKzZPZLWslciOTBNYsj/1GEi/zuhHRT8uw1HuIcco/+f8uioG7+aSBjts9j0r7U+P 6FRiX4jqfLYd+7nUh75Fz9s4xiM78ttk8quxM9XjtebV3MrA7uO+gtlEuxMqu6UZZcG07cZXZjX UfbZ643wULkxNCeDDV54jaM+pF+t3/MnKo4h/A5FR5CYA4c1FGD2VpG9x8T9LeZUBrAZ9L4+Sff NCQjHWE4isluKIQ5WswYSd6GnSQZnT5oa6Kl7fVllpn6dgivQ07tSKFaV8TrwV6iPP6WzEJVN1C 6qumnBg3S0CfMOs6JwHBpE0gjkdGpG6cH6wzcFjR9k6hvGcvPiNA== X-Received: by 2002:a17:90b:1a91:b0:368:f179:ba07 with SMTP id 98e67ed59e1d1-36c4ff708d8mr6836628a91.9.1780232097721; Sun, 31 May 2026 05:54:57 -0700 (PDT) Received: from Inspiron-14-5420.. ([2402:e280:21c6:671:7f12:602a:a4c6:2b38]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-36bbfec391bsm7766670a91.2.2026.05.31.05.54.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 May 2026 05:54:57 -0700 (PDT) From: "Hemendra M. Naik" To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, jiri@resnulli.us, jhs@mojatatu.com, shuah@kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, vishy0777@gmail.com, tahiliani@nitk.edu.in, "Hemendra M. Naik" Subject: [PATCH net-next 1/2] net/sched: sch_fq_pie: add per-flow statistics via class ops Date: Sun, 31 May 2026 18:23:13 +0530 Message-Id: <20260531125314.22492-2-hemendranaik@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260531125314.22492-1-hemendranaik@gmail.com> References: <20260531125314.22492-1-hemendranaik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" FQ-PIE schedules independent PIE controllers per flow but exposes no per-flow AQM state. Without class-level statistics there is no way to observe the per-flow drop probability, queue delay, deficit or=20 dequeue rate from userspace. Extend tc_fq_pie_xstats with a discriminated union, following the same pattern established by FQ-CoDel (TCA_FQ_CODEL_XSTATS_CLASS): - Rename the existing flat struct to tc_fq_pie_qd_stats. - Add tc_fq_pie_cl_stats with per-flow prob, delay, deficit, avg_dq_rate, and dq_rate_estimating fields. - Wrap both in tc_fq_pie_xstats with a type discriminator (TCA_FQ_PIE_XSTATS_QDISC / TCA_FQ_PIE_XSTATS_CLASS). Wire up fq_pie_class_ops (.walk, .dump, .dump_stats) so that 'tc -s class show' against an fq_pie qdisc reports per-flow state: prob per-flow PIE drop probability delay per-flow queue sojourn time (microseconds) deficit remaining DRR byte credits (signed integer) avg_dq_rate dequeue rate estimate in bytes/second (dq_rate_estimator mode only) dq_rate_estimating flag indicating active delay estimation mode Note: this changes the on-wire layout of tc_fq_pie_xstats. The type field now occupies the first four bytes, displacing the former packets_in field. Userspace must be updated concurrently; the companion iproute2 patch handles this. Fix the 'delay' field comment in struct tc_pie_xstats from "in ms" to "in microseconds" to match the kernel's PSCHED_TICKS2NS / NSEC_PER_USEC conversion. Also correct the avg_dq_rate comment in tc_pie_xstats from "bits/pie_time" to "bytes/second" to match the actual kernel conversion (avg_dq_rate * PSCHED_TICKS_PER_SEC >> PIE_SCALE). Signed-off-by: Hemendra M. Naik Signed-off-by: Vishal Kamath Signed-off-by: Mohit P. Tahiliani --- include/uapi/linux/pkt_sched.h | 29 +++++- net/sched/sch_fq_pie.c | 131 ++++++++++++++++++++++++--- tools/include/uapi/linux/pkt_sched.h | 4 +- 3 files changed, 146 insertions(+), 18 deletions(-) diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h index 66e8072f44df..0ad895edcb07 100644 --- a/include/uapi/linux/pkt_sched.h +++ b/include/uapi/linux/pkt_sched.h @@ -910,9 +910,9 @@ enum { =20 struct tc_pie_xstats { __u64 prob; /* current probability */ - __u32 delay; /* current delay in ms */ + __u32 delay; /* current delay in microseconds */ __u32 avg_dq_rate; /* current average dq_rate in - * bits/pie_time + * bytes/second */ __u32 dq_rate_estimating; /* is avg_dq_rate being calculated? */ __u32 packets_in; /* total number of packets enqueued */ @@ -943,7 +943,12 @@ enum { }; #define TCA_FQ_PIE_MAX (__TCA_FQ_PIE_MAX - 1) =20 -struct tc_fq_pie_xstats { +enum { + TCA_FQ_PIE_XSTATS_QDISC, + TCA_FQ_PIE_XSTATS_CLASS, +}; + +struct tc_fq_pie_qd_stats { __u32 packets_in; /* total number of packets enqueued */ __u32 dropped; /* packets dropped due to fq_pie_action */ __u32 overlimit; /* dropped due to lack of space in queue */ @@ -955,6 +960,24 @@ struct tc_fq_pie_xstats { __u32 memory_usage; /* total memory across all queues */ }; =20 +struct tc_fq_pie_cl_stats { + __u64 prob; /* current probability */ + __u32 delay; /* current delay in microseconds */ + __s32 deficit; /* number of remaining byte credits */ + __u32 avg_dq_rate; /* current average dq_rate in + * bytes/second + */ + __u32 dq_rate_estimating; /* is avg_dq_rate being calculated? */ +}; + +struct tc_fq_pie_xstats { + __u32 type; + union { + struct tc_fq_pie_qd_stats qdisc_stats; + struct tc_fq_pie_cl_stats class_stats; + }; +}; + /* CBS */ struct tc_cbs_qopt { __u8 offload; diff --git a/net/sched/sch_fq_pie.c b/net/sched/sch_fq_pie.c index 7becbf5362b3..d22c4e02d2d9 100644 --- a/net/sched/sch_fq_pie.c +++ b/net/sched/sch_fq_pie.c @@ -330,7 +330,7 @@ static int fq_pie_change(struct Qdisc *sch, struct nlat= tr *opt, /* tupdate is in jiffies */ if (tb[TCA_FQ_PIE_TUPDATE]) WRITE_ONCE(q->p_params.tupdate, - usecs_to_jiffies(nla_get_u32(tb[TCA_FQ_PIE_TUPDATE]))); + usecs_to_jiffies(nla_get_u32(tb[TCA_FQ_PIE_TUPDATE]))); =20 if (tb[TCA_FQ_PIE_ALPHA]) WRITE_ONCE(q->p_params.alpha, @@ -509,24 +509,25 @@ static int fq_pie_dump(struct Qdisc *sch, struct sk_b= uff *skb) static int fq_pie_dump_stats(struct Qdisc *sch, struct gnet_dump *d) { struct fq_pie_sched_data *q =3D qdisc_priv(sch); - struct tc_fq_pie_xstats st =3D { 0 }; + struct tc_fq_pie_xstats st =3D { + .type =3D TCA_FQ_PIE_XSTATS_QDISC, + }; struct list_head *pos; =20 - sch_tree_lock(sch); - - st.packets_in =3D q->stats.packets_in; - st.overlimit =3D q->stats.overlimit; - st.overmemory =3D q->overmemory; - st.dropped =3D q->stats.dropped; - st.ecn_mark =3D q->stats.ecn_mark; - st.new_flow_count =3D q->new_flow_count; - st.memory_usage =3D q->memory_usage; + st.qdisc_stats.packets_in =3D q->stats.packets_in; + st.qdisc_stats.overlimit =3D q->stats.overlimit; + st.qdisc_stats.overmemory =3D q->overmemory; + st.qdisc_stats.dropped =3D q->stats.dropped; + st.qdisc_stats.ecn_mark =3D q->stats.ecn_mark; + st.qdisc_stats.new_flow_count =3D q->new_flow_count; + st.qdisc_stats.memory_usage =3D q->memory_usage; =20 + sch_tree_lock(sch); list_for_each(pos, &q->new_flows) - st.new_flows_len++; + st.qdisc_stats.new_flows_len++; =20 list_for_each(pos, &q->old_flows) - st.old_flows_len++; + st.qdisc_stats.old_flows_len++; sch_tree_unlock(sch); =20 return gnet_stats_copy_app(d, &st, sizeof(st)); @@ -561,7 +562,111 @@ static void fq_pie_destroy(struct Qdisc *sch) kvfree(q->flows); } =20 +static struct Qdisc *fq_pie_leaf(struct Qdisc *sch, unsigned long arg) +{ + return NULL; +} + +static unsigned long fq_pie_find(struct Qdisc *sch, u32 classid) +{ + return 0; +} + +static unsigned long fq_pie_bind(struct Qdisc *sch, unsigned long parent, + u32 classid) +{ + return 0; +} + +static void fq_pie_unbind(struct Qdisc *q, unsigned long cl) +{ +} + +static struct tcf_block *fq_pie_tcf_block(struct Qdisc *sch, unsigned long= cl, + struct netlink_ext_ack *extack) +{ + struct fq_pie_sched_data *q =3D qdisc_priv(sch); + + if (cl) + return NULL; + return q->block; +} + +static int fq_pie_dump_class(struct Qdisc *sch, unsigned long cl, + struct sk_buff *skb, struct tcmsg *tcm) +{ + tcm->tcm_handle |=3D TC_H_MIN(cl); + return 0; +} + +static int fq_pie_dump_class_stats(struct Qdisc *sch, unsigned long cl, + struct gnet_dump *d) +{ + struct fq_pie_sched_data *q =3D qdisc_priv(sch); + struct gnet_stats_queue qs =3D { 0 }; + struct tc_fq_pie_xstats xstats; + u32 idx =3D cl - 1; + + if (idx < q->flows_cnt) { + const struct fq_pie_flow *flow =3D &q->flows[idx]; + + memset(&xstats, 0, sizeof(xstats)); + xstats.type =3D TCA_FQ_PIE_XSTATS_CLASS; + xstats.class_stats.prob =3D READ_ONCE(flow->vars.prob) << BITS_PER_BYTE; + xstats.class_stats.delay =3D + ((u32)PSCHED_TICKS2NS(READ_ONCE(flow->vars.qdelay))) / + NSEC_PER_USEC; + xstats.class_stats.deficit =3D READ_ONCE(flow->deficit); + xstats.class_stats.dq_rate_estimating =3D + READ_ONCE(q->p_params.dq_rate_estimator); + + if (xstats.class_stats.dq_rate_estimating) { + xstats.class_stats.avg_dq_rate =3D + READ_ONCE(flow->vars.avg_dq_rate) * + (PSCHED_TICKS_PER_SEC) >> PIE_SCALE; + } + + qs.qlen =3D READ_ONCE(flow->qlen); + qs.backlog =3D READ_ONCE(flow->backlog); + } + if (gnet_stats_copy_queue(d, NULL, &qs, qs.qlen) < 0) + return -1; + if (idx < q->flows_cnt) + return gnet_stats_copy_app(d, &xstats, sizeof(xstats)); + return 0; +} + +static void fq_pie_walk(struct Qdisc *sch, struct qdisc_walker *arg) +{ + struct fq_pie_sched_data *q =3D qdisc_priv(sch); + unsigned int i; + + if (arg->stop) + return; + + for (i =3D 0; i < q->flows_cnt; i++) { + if (list_empty(&q->flows[i].flowchain)) { + arg->count++; + continue; + } + if (!tc_qdisc_stats_dump(sch, i + 1, arg)) + break; + } +} + +static const struct Qdisc_class_ops fq_pie_class_ops =3D { + .leaf =3D fq_pie_leaf, + .find =3D fq_pie_find, + .tcf_block =3D fq_pie_tcf_block, + .bind_tcf =3D fq_pie_bind, + .unbind_tcf =3D fq_pie_unbind, + .dump =3D fq_pie_dump_class, + .dump_stats =3D fq_pie_dump_class_stats, + .walk =3D fq_pie_walk, +}; + static struct Qdisc_ops fq_pie_qdisc_ops __read_mostly =3D { + .cl_ops =3D &fq_pie_class_ops, .id =3D "fq_pie", .priv_size =3D sizeof(struct fq_pie_sched_data), .enqueue =3D fq_pie_qdisc_enqueue, diff --git a/tools/include/uapi/linux/pkt_sched.h b/tools/include/uapi/linu= x/pkt_sched.h index 587481a19433..9bc190f0b3cf 100644 --- a/tools/include/uapi/linux/pkt_sched.h +++ b/tools/include/uapi/linux/pkt_sched.h @@ -847,8 +847,8 @@ enum { =20 struct tc_pie_xstats { __u32 prob; /* current probability */ - __u32 delay; /* current delay in ms */ - __u32 avg_dq_rate; /* current average dq_rate in bits/pie_time */ + __u32 delay; /* current delay in microseconds */ + __u32 avg_dq_rate; /* current average dq_rate in bytes/second */ __u32 packets_in; /* total number of packets enqueued */ __u32 dropped; /* packets dropped due to pie_action */ __u32 overlimit; /* dropped due to lack of space in queue */ --=20 2.34.1 From nobody Mon Jun 8 08:29:03 2026 Received: from mail-pj1-f51.google.com (mail-pj1-f51.google.com [209.85.216.51]) (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 5F7A61F3BAC for ; Sun, 31 May 2026 12:55:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780232113; cv=none; b=AFx53zWfoL20Mms6bPfBu0gxAQNGGau5kDbk8lgNnFGHAcZXCj52imFd4nCtSIifV5TziilpIe74AyFKmlEa/FOjMp6kF3ISy6WvmmxNsPCFavghf5zvcN8nVV6juVSyfXf5WeIIx0vZGQ/l8tNUtab+JqXKCsnzorhHd6Ouj7U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780232113; c=relaxed/simple; bh=8k0HUUGrKQdbm2dXES9LOTuJCiHdtOvz6RVV14YqWAM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=KdlGXTeoKPx/l96lq02w6sffGwz9PzWWQgpxEXv+vi4Kgdcwxd3pSM3yySFzxZfCNlzdhZKCAnI2CV7nL0iRes6RwJlqbkxk6jxFgI545INhnrIufdH6STXwrOdjavniLT7tcjoGprOZh9U5GNQVI+SWdlfoOtI0UHOx7qrnSmQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=fKtgVfW9; arc=none smtp.client-ip=209.85.216.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="fKtgVfW9" Received: by mail-pj1-f51.google.com with SMTP id 98e67ed59e1d1-36da8439078so172504a91.2 for ; Sun, 31 May 2026 05:55:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780232112; x=1780836912; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9jvjYYorspJJuCQZSL29dgMwijPlrOWsuologm7lz9E=; b=fKtgVfW9i+MlSfvJRHfHTgJEPEM+j3X7T75A4dt4fnwoBHTA/3BXxs7F8RmckvjNZm 5tOcMeT5UtJcgI/hD3Iww+2KAglh1Xqqy0II9bq1n1GMXv9vx4d9Akd01vfSj9+Flvqk a5q6P1RI+r+27wazP3EUMWQY8PozZsgvWC9iP5nQaKVEIjyrVcEanGzYcsWkunvWeUQG jJR0DulX1/vXwm+D3hFD75hJ3AOR+Z4rKTVJHZwpNCPkN0rwEvFIapzIZ7LiPWkJ6ON+ ZlEswBVSkswPOb9+e9VOWvJcVxU7PQm/rRk6fcLkXEPK0oJD8jYcpN/aj0DDaEhFULqZ of8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780232112; x=1780836912; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=9jvjYYorspJJuCQZSL29dgMwijPlrOWsuologm7lz9E=; b=BS8PXQtOwqz6veDXu5Rfp/F745A1gyH0Dr9167VcR43XWUkk8LRVkKZgzIO1FqkUtn q2ht6XJ4F++vhYq710uz+G0MUaPakTvFER38wNVXfKZRSKhDVVHkXl5MZ/BfeY5PqeyN nYP9ijqDuBTth47UvzGUNIoo2la4dO8jxzQMCbyrEfOHm+vEZL3krMOdxAIqZaGQmhr3 bNqlXzwhf560WQXYC+WiWPlF7oNC4sdeLC9m5XOxe5FfcKCfNK+V9gbOzcNrT5D94hhl AKRtx1r9M59Wnf1hIVznJBQ2fWdwW+Z/Lc25yGhHQdRQfXmJeRL8YVKGPKVX+SY3s+B1 U30g== X-Forwarded-Encrypted: i=1; AFNElJ+3v3B1yKRuwyKzZG/Avcuo36ZbhNjGjvRtNkRoQykYf9VuQsdAXAQZpq8nz5IA0FB83U9AbiMdKtVGD0A=@vger.kernel.org X-Gm-Message-State: AOJu0Yx1HHhBz0NXhEKuKA+kVrN6NuGL11sDIg8NaiUbZETUKjP4PrBL qDSkxfAf+ZCvr/lxnDe7dVtTA8MbLRJMiqosI03uQ+hUjzdDBtNitiSm X-Gm-Gg: Acq92OETA1Ii+9g16+RwxrVm+TifCETJEwMD2Mb0P02+fFSVcITLiOGQ185lB21/EIB Kgnpm8rsCESym2+Mo6NumYRx6mNeJSlLsSNlmmNOW9djcdFrcUPWV5l7X3vxHZYsSSMHqLGnzwV 7F1eHU9Gy8iccccXKtWI9J4J8a3rgZ/m2IacmY+E/HEA/lDVBg0DMQSRbJ1JL0eBmx4dWRwW4w8 XKqdDSeSivFNeAD+Ah/DVSHHi0crGrayiSkm/K3hrRtQFgLZl6Jjpci4i6riS+BRdbxhC1DpIsb m3D8OClWthARaWK4BCIGXFWIXm1beFox92ElgydnwO3hPeuXEA4zeDjTrQYoMEFVS8avl1M/pgC esOqRqZvN3nUSp/MWovo1OZ22tXlUEdOR8MnEIgU0nJEnzz3SeVIgC2ZIKJupo/x47SXz27GfZi SjMGOXmqT7PPv9Ai0pV90W6Na8byuswMKRvEJkidL4Zkl+p14olejRcFkqfI3B X-Received: by 2002:a17:90b:57e7:b0:36d:70c8:3a3 with SMTP id 98e67ed59e1d1-36d70c80687mr5091181a91.15.1780232111729; Sun, 31 May 2026 05:55:11 -0700 (PDT) Received: from Inspiron-14-5420.. ([2402:e280:21c6:671:7f12:602a:a4c6:2b38]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-36bbfec391bsm7766670a91.2.2026.05.31.05.55.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 31 May 2026 05:55:11 -0700 (PDT) From: "Hemendra M. Naik" To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, jiri@resnulli.us, jhs@mojatatu.com, shuah@kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, vishy0777@gmail.com, tahiliani@nitk.edu.in, "Hemendra M. Naik" Subject: [PATCH net-next 2/2] selftests: tc-testing: add fq_pie per-flow class stats test Date: Sun, 31 May 2026 18:23:14 +0530 Message-Id: <20260531125314.22492-3-hemendranaik@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260531125314.22492-1-hemendranaik@gmail.com> References: <20260531125314.22492-1-hemendranaik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a tc-testing entry (id: 83c0) to verify the fq_pie class ops wired up in the previous patch do not crash and integrate cleanly with the tc class show path. The test creates an fq_pie root qdisc on a dummy interface and runs 'tc -s class show'. Signed-off-by: Hemendra M. Naik Signed-off-by: Vishal Kamath Signed-off-by: Mohit P. Tahiliani --- .../tc-testing/tc-tests/qdiscs/fq_pie.json | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tools/testing/selftests/tc-testing/tc-tests/qdiscs/fq_pie.json= b/tools/testing/selftests/tc-testing/tc-tests/qdiscs/fq_pie.json index 229fe1bf4a90..3ef2fafa52b8 100644 --- a/tools/testing/selftests/tc-testing/tc-tests/qdiscs/fq_pie.json +++ b/tools/testing/selftests/tc-testing/tc-tests/qdiscs/fq_pie.json @@ -40,5 +40,27 @@ "matchPattern": "qdisc fq_pie 1: root refcnt [0-9]+ limit 1p", "matchCount": "1", "teardown": ["$TC qdisc del dev $DEV1 handle 1: root"] + }, + { + "id": "83c0", + "name": "FQ-PIE class stats accessible via tc class show", + "category": [ + "qdisc", + "fq_pie" + ], + "plugins": { + "requires": "nsPlugin" + }, + "setup": [ + "$TC qdisc add dev $DUMMY handle 1: root fq_pie" + ], + "cmdUnderTest": "$TC -s class show dev $DUMMY", + "expExitCode": "0", + "verifyCmd": "$TC -s class show dev $DUMMY", + "matchPattern": "class fq_pie", + "matchCount": "0", + "teardown": [ + "$TC qdisc del dev $DUMMY handle 1: root" + ] } ] --=20 2.34.1