mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-18 22:19:30 +02:00
alloc_tag: add accuracy based filtering to ioctl
Extend the allocinfo filtering mechanism to allow users to filter tags based on their accuracy. [abhishekbapat@google.com: move `inaccurate` filtering criteria from `struct allocinfo_tag` to `struct allocinfo_filter`] Link: https://lore.kernel.org/e4e49ec4a5960292aeeb9e196526c18dc95228a2.1785867739.git.abhishekbapat@google.com Link: https://lore.kernel.org/396a5e4bc3b2990223ab355f2cd3ceb6aa15499e.1783532853.git.abhishekbapat@google.com Signed-off-by: Abhishek Bapat <abhishekbapat@google.com> Acked-by: Hao Ge <hao.ge@linux.dev> Acked-by: Suren Baghdasaryan <surenb@google.com> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Kent Overstreet <kent.overstreet@linux.dev> Cc: Sourav Panda <souravpanda@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
6f6769ea88
commit
33588e0b81
@@ -50,6 +50,7 @@ enum {
|
||||
ALLOCINFO_FILTER_FUNCTION,
|
||||
ALLOCINFO_FILTER_FILENAME,
|
||||
ALLOCINFO_FILTER_LINENO,
|
||||
ALLOCINFO_FILTER_INACCURATE,
|
||||
ALLOCINFO_FILTER_MIN_SIZE,
|
||||
ALLOCINFO_FILTER_MAX_SIZE,
|
||||
__ALLOCINFO_FILTER_LAST = ALLOCINFO_FILTER_MAX_SIZE
|
||||
@@ -59,6 +60,7 @@ enum {
|
||||
#define ALLOCINFO_FILTER_MASK_FUNCTION (1 << ALLOCINFO_FILTER_FUNCTION)
|
||||
#define ALLOCINFO_FILTER_MASK_FILENAME (1 << ALLOCINFO_FILTER_FILENAME)
|
||||
#define ALLOCINFO_FILTER_MASK_LINENO (1 << ALLOCINFO_FILTER_LINENO)
|
||||
#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)
|
||||
|
||||
@@ -70,6 +72,8 @@ struct allocinfo_filter {
|
||||
struct allocinfo_tag fields;
|
||||
__u64 min_size;
|
||||
__u64 max_size;
|
||||
/* filter criteria only; see allocinfo_counter.accurate for actual accuracy */
|
||||
__u64 inaccurate;
|
||||
};
|
||||
|
||||
struct allocinfo_get_at {
|
||||
|
||||
@@ -262,6 +262,8 @@ static bool matches_filter(struct codetag *ct, struct allocinfo_filter *filter,
|
||||
struct alloc_tag_counters *counters,
|
||||
bool *fetched_counters)
|
||||
{
|
||||
bool inaccurate;
|
||||
|
||||
if (!filter || !filter->mask)
|
||||
return true;
|
||||
|
||||
@@ -287,6 +289,12 @@ static bool matches_filter(struct codetag *ct, struct allocinfo_filter *filter,
|
||||
ct->lineno != filter->fields.lineno)
|
||||
return false;
|
||||
|
||||
if (filter->mask & ALLOCINFO_FILTER_MASK_INACCURATE) {
|
||||
inaccurate = !!(ct->flags & CODETAG_FLAG_INACCURATE);
|
||||
if (inaccurate != !!(filter->inaccurate))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (filter->mask & (ALLOCINFO_FILTER_MASK_MIN_SIZE | ALLOCINFO_FILTER_MASK_MAX_SIZE)) {
|
||||
if (!*fetched_counters) {
|
||||
*counters = allocinfo_prefetch_counters(ct);
|
||||
|
||||
Reference in New Issue
Block a user