blob: 8468baee951d2951ad349fb452adb0027f7f91e3 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001// SPDX-License-Identifier: GPL-2.0
Alexey Dobriyan5b3acc82008-10-03 02:21:47 +04002#include <linux/fs.h>
3#include <linux/init.h>
4#include <linux/pid_namespace.h>
5#include <linux/proc_fs.h>
6#include <linux/sched.h>
Ingo Molnar4f177222017-02-08 08:45:17 +01007#include <linux/sched/loadavg.h>
Ingo Molnar03441a32017-02-08 18:51:35 +01008#include <linux/sched/stat.h>
Alexey Dobriyan5b3acc82008-10-03 02:21:47 +04009#include <linux/seq_file.h>
10#include <linux/seqlock.h>
11#include <linux/time.h>
12
Alexey Dobriyan5b3acc82008-10-03 02:21:47 +040013static int loadavg_proc_show(struct seq_file *m, void *v)
14{
Thomas Gleixner2d024942009-05-02 20:08:52 +020015 unsigned long avnrun[3];
Alexey Dobriyan5b3acc82008-10-03 02:21:47 +040016
Thomas Gleixner2d024942009-05-02 20:08:52 +020017 get_avenrun(avnrun, FIXED_1/200, 0);
Alexey Dobriyan5b3acc82008-10-03 02:21:47 +040018
Thomas Gleixner2d024942009-05-02 20:08:52 +020019 seq_printf(m, "%lu.%02lu %lu.%02lu %lu.%02lu %ld/%d %d\n",
20 LOAD_INT(avnrun[0]), LOAD_FRAC(avnrun[0]),
21 LOAD_INT(avnrun[1]), LOAD_FRAC(avnrun[1]),
22 LOAD_INT(avnrun[2]), LOAD_FRAC(avnrun[2]),
Alexey Dobriyan5b3acc82008-10-03 02:21:47 +040023 nr_running(), nr_threads,
Alexey Dobriyan9a1015b2018-04-20 14:56:06 -070024 idr_get_cursor(&task_active_pid_ns(current)->idr) - 1);
Alexey Dobriyan5b3acc82008-10-03 02:21:47 +040025 return 0;
26}
27
Alexey Dobriyan5b3acc82008-10-03 02:21:47 +040028static int __init proc_loadavg_init(void)
29{
Christoph Hellwig3f3942a2018-05-15 15:57:23 +020030 proc_create_single("loadavg", 0, NULL, loadavg_proc_show);
Alexey Dobriyan5b3acc82008-10-03 02:21:47 +040031 return 0;
32}
Paul Gortmakerabaf3782014-01-23 15:55:45 -080033fs_initcall(proc_loadavg_init);