18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci#include <linux/fs.h>
38c2ecf20Sopenharmony_ci#include <linux/init.h>
48c2ecf20Sopenharmony_ci#include <linux/pid_namespace.h>
58c2ecf20Sopenharmony_ci#include <linux/proc_fs.h>
68c2ecf20Sopenharmony_ci#include <linux/sched.h>
78c2ecf20Sopenharmony_ci#include <linux/sched/loadavg.h>
88c2ecf20Sopenharmony_ci#include <linux/sched/stat.h>
98c2ecf20Sopenharmony_ci#include <linux/seq_file.h>
108c2ecf20Sopenharmony_ci#include <linux/seqlock.h>
118c2ecf20Sopenharmony_ci#include <linux/time.h>
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_cistatic int loadavg_proc_show(struct seq_file *m, void *v)
148c2ecf20Sopenharmony_ci{
158c2ecf20Sopenharmony_ci	unsigned long avnrun[3];
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci	get_avenrun(avnrun, FIXED_1/200, 0);
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci	seq_printf(m, "%lu.%02lu %lu.%02lu %lu.%02lu %ld/%d %d\n",
208c2ecf20Sopenharmony_ci		LOAD_INT(avnrun[0]), LOAD_FRAC(avnrun[0]),
218c2ecf20Sopenharmony_ci		LOAD_INT(avnrun[1]), LOAD_FRAC(avnrun[1]),
228c2ecf20Sopenharmony_ci		LOAD_INT(avnrun[2]), LOAD_FRAC(avnrun[2]),
238c2ecf20Sopenharmony_ci		nr_running(), nr_threads,
248c2ecf20Sopenharmony_ci		idr_get_cursor(&task_active_pid_ns(current)->idr) - 1);
258c2ecf20Sopenharmony_ci	return 0;
268c2ecf20Sopenharmony_ci}
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_cistatic int __init proc_loadavg_init(void)
298c2ecf20Sopenharmony_ci{
308c2ecf20Sopenharmony_ci	proc_create_single("loadavg", 0, NULL, loadavg_proc_show);
318c2ecf20Sopenharmony_ci	return 0;
328c2ecf20Sopenharmony_ci}
338c2ecf20Sopenharmony_cifs_initcall(proc_loadavg_init);
34