On Thu, Oct 8, 2026 at 2:40 AM Abhishek Bapat <[email protected]> wrote: > > Extend the allocinfo filtering mechanism to allow users to filter tags > based on their trace state. > > Signed-off-by: Abhishek Bapat <[email protected]>
Acked-by: Suren Baghdasaryan <[email protected]> > --- > 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 !! > + return false; > + } > + > return true; > } > > -- > 2.56.0.385.gd3acb90ef8-goog >
