[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