Adjust kernel module for RPi3
authorKonrad Kuchciak <k.kuchciak@samsung.com>
Tue, 20 Aug 2019 11:22:42 +0000 (13:22 +0200)
committerKonrad Kuchciak <k.kuchciak@samsung.com>
Thu, 22 Aug 2019 07:25:41 +0000 (09:25 +0200)
Change-Id: I1a14a25832514097b18f98e3dae4d6866e18ea24

kernel/Makefile
kernel/proc-tsm.c
packaging/stability-monitor.spec

index 2060cda..cc87354 100644 (file)
@@ -1,4 +1,4 @@
-KERNELDIR = /boot/kernel_header/debug/linux/
+KERNELDIR = /boot/kernel/devel/kernel-devel-arm-rpi3/
 PWD := $(shell pwd)
 LD = ld
 
index 8f61d51..cd22d0c 100644 (file)
@@ -24,6 +24,8 @@
 #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>
@@ -45,19 +47,51 @@ static u64 time_now(void)
     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 */
@@ -67,8 +101,8 @@ static int stability_monitor_show(struct seq_file *m, void *v)
     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) {
@@ -93,27 +127,28 @@ static int stability_monitor_show(struct seq_file *m, void *v)
         /* 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");
     }
 
index d7c1a55..6f4b5e1 100644 (file)
@@ -10,7 +10,7 @@ BuildRequires: pkgconfig(aul)
 BuildRequires: pkgconfig(glib-2.0)
 BuildRequires: pkgconfig(gio-2.0)
 BuildRequires: pkgconfig(pkgmgr-info)
-BuildRequires: linux-kantm-devel
+BuildRequires: arm-rpi3-linux-kernel-devel
 
 %description
 This package provides stability monitoring daemon.