Commit 3dfdd2f9 authored by Lu Jialin's avatar Lu Jialin Committed by yanhaitao
Browse files

sched/psi: introduce tracepoints for psi_memstall_{enter, leave}

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I8QUNW



--------------------------------

Two tracepoints are added we can easily use other tools
such as ebpf, ftrace, perf to monitor the memstall data
and do some analysis.

The output of these tracepoints is,
      kcompactd0-58      [001] ....   902.709565: psi_memstall_enter: kcompactd
         kswapd0-132     [003] ....   902.709569: psi_memstall_leave: balance_pgdat
      kcompactd0-58      [001] ....   902.775230: psi_memstall_leave: kcompactd
         kswapd0-132     [003] ....  1337.754598: psi_memstall_enter: balance_pgdat
         kswapd0-132     [003] ....  1337.756076: psi_memstall_leave: balance_pgdat
      kcompactd0-58      [003] ....  1337.756213: psi_memstall_enter: kcompactd
      kcompactd0-58      [003] ....  1337.893188: psi_memstall_leave: kcompactd

Signed-off-by: default avatarLu Jialin <lujialin4@huawei.com>
parent 5516338c
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -790,6 +790,33 @@ DECLARE_TRACE(sched_update_nr_running_tp,
	TP_PROTO(struct rq *rq, int change),
	TP_ARGS(rq, change));

DECLARE_EVENT_CLASS(psi_memstall_template,

	TP_PROTO(unsigned long function),

	TP_ARGS(function),

	TP_STRUCT__entry(
		__field(unsigned long, function)
	),

	TP_fast_assign(
		__entry->function = function;
	),

	TP_printk("%ps", (void *)__entry->function)
);

DEFINE_EVENT(psi_memstall_template, psi_memstall_enter,
	TP_PROTO(unsigned long function),
	TP_ARGS(function)
);

DEFINE_EVENT(psi_memstall_template, psi_memstall_leave,
	TP_PROTO(unsigned long function),
	TP_ARGS(function)
);

#endif /* _TRACE_SCHED_H */

/* This part must be outside protection */
+6 −0
Original line number Diff line number Diff line
@@ -137,6 +137,8 @@
 * sampling of the aggregate task states would be.
 */

#include <trace/events/sched.h>

static int psi_bug __read_mostly;

DEFINE_STATIC_KEY_FALSE(psi_disabled);
@@ -1080,6 +1082,8 @@ void psi_memstall_enter(unsigned long *flags)
	*flags = current->in_memstall;
	if (*flags)
		return;

	trace_psi_memstall_enter(_RET_IP_);
	/*
	 * in_memstall setting & accounting needs to be atomic wrt
	 * changes to the task's scheduling state, otherwise we can
@@ -1110,6 +1114,8 @@ void psi_memstall_leave(unsigned long *flags)

	if (*flags)
		return;

	trace_psi_memstall_leave(_RET_IP_);
	/*
	 * in_memstall clearing & accounting needs to be atomic wrt
	 * changes to the task's scheduling state, otherwise we could