[IMPROVE] Us_manager: implement tasks list in debugfs 20/15720/9
authorAlexander Aksenov <a.aksenov@samsung.com>
Mon, 27 Jan 2014 14:03:02 +0000 (18:03 +0400)
committerAlexander Aksenov <a.aksenov@samsung.com>
Thu, 27 Feb 2014 13:17:37 +0000 (17:17 +0400)
Change-Id: I656fb0e42009f3f6877bceb2b4f907dc15c6b914
Signed-off-by: Alexander Aksenov <a.aksenov@samsung.com>
us_manager/Kbuild
us_manager/debugfs_us_manager.c [new file with mode: 0644]
us_manager/debugfs_us_manager.h [new file with mode: 0644]
us_manager/us_manager.c

index 3019f30..d8ee9eb 100644 (file)
@@ -4,7 +4,7 @@ KBUILD_EXTRA_SYMBOLS = $(src)/../writer/Module.symvers \
                        $(src)/../uprobe/Module.symvers
 
 obj-m := swap_us_manager.o
-swap_us_manager-y := us_manager.o us_slot_manager.o helper.o \
+swap_us_manager-y := us_manager.o us_slot_manager.o helper.o debugfs_us_manager.o \
                      sspt/ip.o sspt/sspt_page.o sspt/sspt_file.o sspt/sspt_proc.o \
                      sspt/sspt_feature.o \
                      pf/proc_filters.o pf/pf_group.o \
diff --git a/us_manager/debugfs_us_manager.c b/us_manager/debugfs_us_manager.c
new file mode 100644 (file)
index 0000000..4f682a0
--- /dev/null
@@ -0,0 +1,108 @@
+#include <linux/debugfs.h>
+#include <linux/module.h>
+
+#include <driver/swap_debugfs.h>
+#include <us_manager/sspt/sspt_proc.h>
+
+#include "debugfs_us_manager.h"
+
+#define MAX_APPS_COUNT  8   /* According to daemon defenitions */
+#define PID_STRING      21  /* Maximum pid string = 20 (max digits count in
+                             * unsigned int on 64-bit arch) + 1 (for \n) */
+
+/* ============================================================================
+ * =                          FOPS_TASKS                                      =
+ * ============================================================================
+ */
+
+struct read_buf {
+       char *begin;
+       char *ptr;
+       char *end;
+};
+
+static void on_each_proc_callback(struct sspt_proc *proc, void *data)
+{
+       struct read_buf *rbuf = (struct read_buf *)data;
+       char pid_str[PID_STRING];
+       int len;
+
+       sprintf(pid_str, "%d", proc->tgid);
+
+       len = strlen(pid_str);
+
+       if (rbuf->end - rbuf->ptr < len + 2)
+               return;
+
+       if (rbuf->ptr != rbuf->begin) {
+               *rbuf->ptr = ' ';
+               ++rbuf->ptr;
+       }
+
+       memcpy(rbuf->ptr, pid_str, len);
+       rbuf->ptr += len;
+}
+
+static ssize_t read_tasks(struct file *file, char __user *user_buf,
+                         size_t count, loff_t *ppos)
+{
+       char buf[PID_STRING * MAX_APPS_COUNT];
+       struct read_buf rbuf = {
+               .begin = buf,
+               .ptr = buf,
+               .end = buf + sizeof(buf)
+       };
+
+       on_each_proc_no_lock(on_each_proc_callback, (void *)&rbuf);
+
+       if (rbuf.ptr < rbuf.end)
+               ++rbuf.ptr;
+       *rbuf.ptr = '\n';
+
+       return simple_read_from_buffer(user_buf, count, ppos, rbuf.begin,
+                                  rbuf.ptr - rbuf.begin);
+}
+
+static const struct file_operations fops_tasks = {
+       .owner = THIS_MODULE,
+       .read = read_tasks
+};
+
+/* ============================================================================
+ * =                          INIT/EXIT                                       =
+ * ============================================================================
+ */
+
+static struct dentry *us_manager_dir = NULL;
+
+void exit_debugfs_us_manager(void)
+{
+       if (us_manager_dir)
+               debugfs_remove_recursive(us_manager_dir);
+
+       us_manager_dir = NULL;
+}
+
+int init_debugfs_us_manager(void)
+{
+       struct dentry *swap_dir, *dentry;
+
+       swap_dir = get_swap_debugfs_dir();
+       if (swap_dir == NULL)
+               return -ENOENT;
+
+       us_manager_dir = debugfs_create_dir(US_MANAGER_DFS_DIR, swap_dir);
+       if (us_manager_dir == NULL)
+               return -ENOMEM;
+
+       dentry = debugfs_create_file(US_MANAGER_TASKS, 0600, us_manager_dir, NULL,
+                                &fops_tasks);
+       if (dentry == NULL)
+               goto fail;
+
+       return 0;
+
+fail:
+       exit_debugfs_us_manager();
+       return -ENOMEM;
+}
diff --git a/us_manager/debugfs_us_manager.h b/us_manager/debugfs_us_manager.h
new file mode 100644 (file)
index 0000000..52a5bda
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef __DEBUGFS_US_MANAGER_H__
+#define __DEBUGFS_US_MANAGER_H__
+
+#define US_MANAGER_DFS_DIR "us_manager"
+#define US_MANAGER_TASKS   "tasks"
+
+int init_debugfs_us_manager(void);
+void exit_debugfs_us_manager(void);
+
+#endif /* __DEBUGFS_US_MANAGER_H__ */
index a59a05c..5fe353e 100644 (file)
@@ -28,6 +28,8 @@
 #include "sspt/sspt_proc.h"
 #include "helper.h"
 #include "us_manager.h"
+#include "debugfs_us_manager.h"
+
 #include <writer/event_filter.h>
 
 /* FIXME: move /un/init_msg() elsewhere and remove this include  */
@@ -180,15 +182,29 @@ static int __init init_us_manager(void)
 
        ret = init_us_filter();
        if (ret)
-               return ret;
+               goto us_filter_init_fail;
 
        init_msg(32*1024);
 
        ret = init_helper();
        if (ret)
-               return ret;
+               goto helper_init_fail;
+
+       ret = init_debugfs_us_manager();
+       if (ret)
+               goto debugfs_init_fail;
 
        return 0;
+
+debugfs_init_fail:
+       uninit_helper();
+
+helper_init_fail:
+       uninit_msg();
+       exit_us_filter();
+
+us_filter_init_fail:
+       return ret;
 }
 
 static void __exit exit_us_manager(void)
@@ -196,6 +212,7 @@ static void __exit exit_us_manager(void)
        if (status == ST_ON)
                do_usm_stop();
 
+       exit_debugfs_us_manager();
        uninit_msg();
        uninit_helper();
        exit_us_filter();