[Devel] [PATCH RH7 v2] mm: high order allocation detector

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Thu Sep 2 13:15:29 MSK 2021



On 01.09.2021 14:36, Nikita Yushchenko wrote:
> High order allocation detector monitors allocations of order greater
> than zero, and generates an uevent if a configured number of allocations
> happen within configured time.
> 
> In return to this uevent, userspace can enable event tracing. If a
> stream of high-order allocations continues, the trace could help to
> detect the code path causing them.
> 
> HOAD has a sysfs control interface, at /sys/kernel/mm/hoad/control:
> - "enable ORDER COUNT MSECS"
>    Sets up monitoring allocations of order ORDER: if COUNT such
>    allocations are detected within MSECS, uevent is sent. Then further
>    uevents is suspended, to avoid userspace races.
> - "disable ORDER"
>    Stops monitoring allocations of order ORDER.
> - "resume [delay-msecs]"
>    Allow sending a new uevent, either immediately or after the given
>    delay.
> 
> The uevent is generated with ACTION="change", SUBSYSTEM="hoad", ORDER
> set to the order of the allocation that has caused the uevent.
> 
> Also HOAD provides a tracepoint named "hoad", under kmem/ group, that
> could be used for tracing. This tracepoint hits on every allocation of
> order greater or equal to minimal order for which monitoring is enabled.
> 
> https://jira.sw.ru/browse/PSBM-92088
> Signed-off-by: Nikita Yushchenko <nikita.yushchenko at virtuozzo.com>
> ---
>   include/trace/events/kmem.h |  12 ++
>   mm/page_alloc.c             | 266 ++++++++++++++++++++++++++++++++++++
>   2 files changed, 278 insertions(+)
> 
> diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h
> index 9cb647609df3..b425c6856bfd 100644
> --- a/include/trace/events/kmem.h
> +++ b/include/trace/events/kmem.h
> @@ -305,6 +305,18 @@ TRACE_EVENT(mm_page_alloc_extfrag,
>   		__entry->alloc_migratetype == __entry->fallback_migratetype)
>   );
>   
> +TRACE_EVENT(hoad,
> +	TP_PROTO(int order),
> +	TP_ARGS(order),
> +	TP_STRUCT__entry(
> +		__field(int, order)
> +	),
> +	TP_fast_assign(
> +		__entry->order = order;
> +	),
> +	TP_printk("order=%d", __entry->order)
> +);
> +
>   #endif /* _TRACE_KMEM_H */
>   
>   /* This part must be outside protection */
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 1ae193b26a1d..959b1bfbafef 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -3533,6 +3533,270 @@ static __always_inline void warn_high_order(int order, gfp_t gfp_mask)
>   	}
>   }
>   
> +struct hoad_order_info {
> +	unsigned long interval;
> +	int max_allocs;
> +	atomic_t counter;
> +	unsigned long since_jiffies;
> +	struct timer_list reset_counter_timer;
> +};
> +
> +static struct hoad_order_info *hoad_table[MAX_ORDER];
> +static DEFINE_MUTEX(hoad_mutex);
> +static struct kobject *hoad_kobj;
> +static int hoad_uevent_order;
> +static unsigned long hoad_resume_jiffies;
> +static int hoad_trace_min_order;
> +
> +#define MSEC_PER_MINUTE		(60 * MSEC_PER_SEC)
> +#define MSEC_PER_HOUR		(60 * MSEC_PER_MINUTE)
> +#define MSEC_PER_DAY		(60 * MSEC_PER_HOUR)

Missprint?

-- 
Best regards, Tikhomirov Pavel
Software Developer, Virtuozzo.


More information about the Devel mailing list