Extend the allocinfo filtering mechanism to allow users to filter tags
based on their trace state.

Signed-off-by: Abhishek Bapat <[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 069ab8341e87..e65c32afceee 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 fb179321a2a1..50632b627d92 100644
--- a/mm/alloc_tag.c
+++ b/mm/alloc_tag.c
@@ -251,6 +251,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));
 }
 
 /*
@@ -324,6 +325,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))
+                       return false;
+       }
+
        return true;
 }
 
-- 
2.55.0.1082.g2b9226bbc0-goog


Reply via email to