#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/sched.h>
+#include <linux/sched/signal.h>
+#include <linux/sched/cputime.h>
#include <linux/mm.h>
#include <linux/pid_namespace.h>
#include <asm/uaccess.h>
return div64_ul(ktime_get_boot_ns(), NSEC_PER_USEC);
}
+static inline u64 cputime_to_usecs(const u64 cputime)
+{
+ // return cputime >> 12;
+ return div64_ul(cputime, NSEC_PER_USEC);
+}
+
+static unsigned int count_open_files(struct files_struct *files)
+{
+ unsigned int open_files = 0;
+ int i;
+ struct fdtable *fdt;
+
+ if (!files)
+ return 0;
+
+ spin_lock(&files->file_lock);
+ fdt = files_fdtable(files);
+
+ /* Find the last non zero cell in open fds array */
+ for (i = fdt->max_fds / BITS_PER_LONG - 1; i >= 0; i--) {
+ if (fdt->open_fds[i])
+ break;
+ }
+
+ /* Count set bits */
+ for (i = (i + 1) * BITS_PER_LONG - 1; i >= 0; i--) {
+ if(test_bit(i, fdt->open_fds))
+ open_files++;
+ }
+
+ spin_unlock(&files->file_lock);
+ return open_files;
+}
+
static int stability_monitor_show(struct seq_file *m, void *v)
{
struct sysinfo info;
struct task_struct *task, *t;
struct pid *pid = NULL;
pid_t ppid = 0;
- u64 uptime;
- cputime_t utime, stime;
+ u64 uptime, utime, stime, ut, st;
unsigned long long vm_rss, total_ram;
struct task_io_accounting task_ioac;
unsigned int open_fds;
-
rcu_read_lock();
/* Uptime in us */
si_meminfo(&info);
total_ram = PAGE_TO_KB(info.totalram);
- seq_put_decimal_ull(m, 0, uptime);
- seq_put_decimal_ull(m, ' ', total_ram);
+ seq_put_decimal_ull(m, "", uptime);
+ seq_put_decimal_ull(m, " ", total_ram);
seq_printf(m, "\n");
for_each_process(task) {
/* Memory */
vm_rss = get_mm_rss(task->mm);
- /* Open FDs - this needs CONFIG_KDEBUGD_FD_DEBUG */
- open_fds = task->files ? files_fdtable(task->files)->cur_fdn : 0;
-
- /* CPU time */
- thread_group_cputime_adjusted(task, &utime, &stime);
+ /* Open FDs */
+ open_fds = count_open_files(task->files);
- /* IO */
+ /* CPU time + IO accounting */
+ task_cputime_adjusted(task, &utime, &stime);
task_ioac = task->ioac;
t = task;
- while_each_thread(task, t)
+ while_each_thread(task, t) {
+ task_cputime_adjusted(t, &ut, &st);
+ utime += ut;
+ stime += st;
task_io_accounting_add(&task_ioac, &t->ioac);
-
+ }
task_unlock(task);
- seq_put_decimal_ll(m, 0, task->pid);
- seq_put_decimal_ll(m, ' ', ppid);
- seq_put_decimal_ull(m, ' ', cputime_to_usecs(utime + stime));
- seq_put_decimal_ull(m, ' ', PAGE_TO_KB(vm_rss)); // kB
- seq_put_decimal_ll(m, ' ', open_fds);
- seq_put_decimal_ull(m, ' ', task_ioac.read_bytes + task_ioac.write_bytes);
+ seq_put_decimal_ll(m, "", task->pid);
+ seq_put_decimal_ll(m, " ", ppid);
+ seq_put_decimal_ull(m, " ", cputime_to_usecs(utime + stime));
+ seq_put_decimal_ull(m, " ", PAGE_TO_KB(vm_rss));
+ seq_put_decimal_ll(m, " ", open_fds);
+ seq_put_decimal_ull(m, " ", task_ioac.read_bytes + task_ioac.write_bytes);
seq_printf(m, "\n");
}