Re: [PATCH v2 3/4] alloc_tag: Extend allocinfo_filter to support tracing queries

From: Abhishek Bapat

Date: Mon Oct 19 2026 - 14:59:48 EST


On Sat, Oct 17, 2026 at 9:52 PM Suren Baghdasaryan <surenb@xxxxxxxxxx> wrote:
>
> On Thu, Oct 8, 2026 at 2:40 AM Abhishek Bapat <abhishekbapat@xxxxxxxxxx> wrote:
> >
> > Extend the allocinfo filtering mechanism to allow users to filter tags
> > based on their trace state.
> >
> > Signed-off-by: Abhishek Bapat <abhishekbapat@xxxxxxxxxx>
>
> Acked-by: Suren Baghdasaryan <surenb@xxxxxxxxxx>
>
> > ---
> > include/uapi/linux/alloc_tag.h | 8 ++++++--
> > mm/alloc_tag.c | 8 ++++++++
> > 2 files changed, 14 insertions(+), 2 deletions(-)
> >
> > diff --git a/include/uapi/linux/alloc_tag.h b/include/uapi/linux/alloc_tag.h
> > index dafcba2f7e2c..a96054ac2237 100644
> > --- a/include/uapi/linux/alloc_tag.h
> > +++ b/include/uapi/linux/alloc_tag.h
> > @@ -38,7 +38,8 @@ struct allocinfo_counter {
> > __u64 bytes;
> > __u64 calls;
> > __u8 accurate;
> > - __u8 pad[7];
> > + __u8 trace_on;
> > + __u8 pad[6];
> > } __attribute__((aligned(8)));
> >
> > struct allocinfo_tag_data {
> > @@ -54,7 +55,8 @@ enum {
> > ALLOCINFO_FILTER_INACCURATE,
> > ALLOCINFO_FILTER_MIN_SIZE,
> > ALLOCINFO_FILTER_MAX_SIZE,
> > - __ALLOCINFO_FILTER_LAST = ALLOCINFO_FILTER_MAX_SIZE
> > + ALLOCINFO_FILTER_TRACE_ON,
> > + __ALLOCINFO_FILTER_LAST = ALLOCINFO_FILTER_TRACE_ON
> > };
> >
> > #define ALLOCINFO_FILTER_MASK_MODNAME (1 << ALLOCINFO_FILTER_MODNAME)
> > @@ -64,6 +66,7 @@ enum {
> > #define ALLOCINFO_FILTER_MASK_INACCURATE (1 << ALLOCINFO_FILTER_INACCURATE)
> > #define ALLOCINFO_FILTER_MASK_MIN_SIZE (1 << ALLOCINFO_FILTER_MIN_SIZE)
> > #define ALLOCINFO_FILTER_MASK_MAX_SIZE (1 << ALLOCINFO_FILTER_MAX_SIZE)
> > +#define ALLOCINFO_FILTER_MASK_TRACE_ON (1 << ALLOCINFO_FILTER_TRACE_ON)
> >
> > #define ALLOCINFO_FILTER_MASKS \
> > ((1 << (__ALLOCINFO_FILTER_LAST + 1)) - 1)
> > @@ -75,6 +78,7 @@ struct allocinfo_filter {
> > __u64 max_size;
> > /* filter criteria only; see allocinfo_counter.accurate for actual accuracy */
> > __u64 inaccurate;
> > + __u64 tracing;
> > };
> >
> > struct allocinfo_get_at {
> > diff --git a/mm/alloc_tag.c b/mm/alloc_tag.c
> > index 262f00f2bba9..8e63f347657b 100644
> > --- a/mm/alloc_tag.c
> > +++ b/mm/alloc_tag.c
> > @@ -250,6 +250,7 @@ static void allocinfo_to_params(struct codetag *ct,
> > data->counter.bytes = counters->bytes;
> > data->counter.calls = counters->calls;
> > data->counter.accurate = !alloc_tag_is_inaccurate(ct_to_alloc_tag(ct));
> > + data->counter.trace_on = alloc_tag_is_traced(ct_to_alloc_tag(ct));
> > }
> >
> > /*
> > @@ -323,6 +324,13 @@ static bool matches_filter(struct codetag *ct, struct allocinfo_filter *filter,
> > return false;
> > }
> >
> > + if (filter->mask & ALLOCINFO_FILTER_MASK_TRACE_ON) {
> > + bool tracing = alloc_tag_is_traced(ct_to_alloc_tag(ct));
> > +
> > + if (tracing != !!(filter->tracing))
>
> nit: Compilers are smart enough nowadays to convert u8 to bool without !!
>

There's a similar check right above it that checks "inaccurate !=
!!(filter->inaccurate)".

I just want to be consistent and less ambiguous. Also strictly
speaking, compilers convert a bool to an int implicitly, so if
filter->tracing is > 1, the if condition without the !! will result in
false.

> > + return false;
> > + }
> > +
> > return true;
> > }
> >
> > --
> > 2.56.0.385.gd3acb90ef8-goog
> >