misc: tegra-profiler: add /proc/quadd/status
Igor Nabirushkin [Tue, 24 Sep 2013 14:22:09 +0000 (18:22 +0400)]
Add /proc/quadd/status
It allows users to see current status of the Tegra Profiler.

Bug 1374376

Change-Id: I6b770b38c31b5a46ce287ad5107707adb39bd253
Signed-off-by: Igor Nabirushkin <inabirushkin@nvidia.com>
Reviewed-on: http://git-master/r/298733
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Daniel Horowitz <dhorowitz@nvidia.com>
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
GVS: Gerrit_Virtual_Submit
Tested-by: Maxim Morin <mmorin@nvidia.com>

drivers/misc/tegra-profiler/auth.c
drivers/misc/tegra-profiler/auth.h
drivers/misc/tegra-profiler/comm.c
drivers/misc/tegra-profiler/comm.h
drivers/misc/tegra-profiler/main.c
drivers/misc/tegra-profiler/quadd.h
drivers/misc/tegra-profiler/quadd_proc.c
drivers/misc/tegra-profiler/version.h
include/linux/tegra_profiler.h

index 654f401..f443e45 100644 (file)
@@ -296,6 +296,11 @@ int quadd_auth_check_debug_flag(const char *package_name)
        }
 }
 
+int quadd_auth_is_auth_open(void)
+{
+       return atomic_read(&auth_ctx.opened) != 0;
+}
+
 int quadd_auth_init(struct quadd_ctx *quadd_ctx)
 {
        int err;
index aa810f2..42d6d85 100644 (file)
@@ -20,6 +20,7 @@
 struct quadd_ctx;
 
 int quadd_auth_check_debug_flag(const char *package_name);
+int quadd_auth_is_auth_open(void);
 
 int quadd_auth_init(struct quadd_ctx *quadd_ctx);
 void quadd_auth_deinit(void);
index 51a4abe..35a4a8e 100644 (file)
@@ -366,9 +366,15 @@ static void comm_reset(void)
        spin_unlock_irqrestore(&comm_ctx.rb.lock, flags);
 }
 
+static int is_active(void)
+{
+       return atomic_read(&comm_ctx.active) != 0;
+}
+
 static struct quadd_comm_data_interface comm_data = {
        .put_sample = put_sample,
        .reset = comm_reset,
+       .is_active = is_active,
 };
 
 static int check_access_permission(void)
index 956e44b..a19319d 100644 (file)
@@ -50,6 +50,7 @@ struct quadd_comm_data_interface {
        void (*put_sample)(struct quadd_record_data *data, char *extra_data,
                           unsigned int extra_length);
        void (*reset)(void);
+       int (*is_active)(void);
 };
 
 struct quadd_comm_ctx {
index 96e364c..c8a741e 100644 (file)
@@ -359,9 +359,19 @@ static void get_capabilities(struct quadd_comm_cap *cap)
        cap->blocked_read = 1;
 }
 
-static void get_state(struct quadd_module_state *state)
+void quadd_get_state(struct quadd_module_state *state)
 {
+       unsigned int status = 0;
+
        quadd_hrt_get_state(state);
+
+       if (ctx.comm->is_active())
+               status |= QUADD_MOD_STATE_STATUS_IS_ACTIVE;
+
+       if (quadd_auth_is_auth_open())
+               status |= QUADD_MOD_STATE_STATUS_IS_AUTH_OPEN;
+
+       state->reserved[QUADD_MOD_STATE_IDX_STATUS] = status;
 }
 
 static struct quadd_comm_control_interface control = {
@@ -369,7 +379,7 @@ static struct quadd_comm_control_interface control = {
        .stop                   = stop,
        .set_parameters         = set_parameters,
        .get_capabilities       = get_capabilities,
-       .get_state              = get_state,
+       .get_state              = quadd_get_state,
 };
 
 static int __init quadd_module_init(void)
index 75b145f..41367c3 100644 (file)
@@ -25,6 +25,7 @@ struct event_data;
 struct quadd_comm_data_interface;
 struct quadd_hrt_ctx;
 struct quadd_mmap_ctx;
+struct quadd_module_state;
 
 struct quadd_event_source_interface {
        int (*enable)(void);
@@ -62,4 +63,6 @@ struct quadd_ctx {
        int collect_kernel_ips;
 };
 
+void quadd_get_state(struct quadd_module_state *state);
+
 #endif /* __QUADD_H */
index 02b4cb0..dbde704 100644 (file)
@@ -74,8 +74,8 @@ static int show_capabilities(struct seq_file *f, void *offset)
        seq_printf(f, "support polling mode:   %s\n",
                   YES_NO(cap->blocked_read));
 
-       seq_printf(f, "\n");
-       seq_printf(f, "Supported events:\n");
+       seq_puts(f, "\n");
+       seq_puts(f, "Supported events:\n");
        seq_printf(f, "cpu_cycles:             %s\n",
                   YES_NO(event->cpu_cycles));
        seq_printf(f, "instructions:           %s\n",
@@ -114,6 +114,38 @@ static const struct file_operations capabilities_proc_fops = {
        .release        = single_release,
 };
 
+static int show_status(struct seq_file *f, void *offset)
+{
+       unsigned int status;
+       unsigned int is_auth_open, active;
+       struct quadd_module_state s;
+
+       quadd_get_state(&s);
+       status = s.reserved[QUADD_MOD_STATE_IDX_STATUS];
+
+       active = status & QUADD_MOD_STATE_STATUS_IS_ACTIVE;
+       is_auth_open = status & QUADD_MOD_STATE_STATUS_IS_AUTH_OPEN;
+
+       seq_printf(f, "status:          %s\n", active ? "active" : "waiting");
+       seq_printf(f, "auth:            %s\n", YES_NO(is_auth_open));
+       seq_printf(f, "all samples:     %llu\n", s.nr_all_samples);
+       seq_printf(f, "skipped samples: %llu\n", s.nr_skipped_samples);
+
+       return 0;
+}
+
+static int show_status_proc_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, show_status, NULL);
+}
+
+static const struct file_operations status_proc_fops = {
+       .open           = show_status_proc_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
 void quadd_proc_init(struct quadd_ctx *context)
 {
        ctx = context;
@@ -121,12 +153,14 @@ void quadd_proc_init(struct quadd_ctx *context)
        proc_mkdir("quadd", NULL);
        proc_create("quadd/version", 0, NULL, &version_proc_fops);
        proc_create("quadd/capabilities", 0, NULL, &capabilities_proc_fops);
+       proc_create("quadd/status", 0, NULL, &status_proc_fops);
 }
 
 void quadd_proc_deinit(void)
 {
        remove_proc_entry("quadd/version", NULL);
        remove_proc_entry("quadd/capabilities", NULL);
+       remove_proc_entry("quadd/status", NULL);
        remove_proc_entry("quadd", NULL);
 }
 
index 6b0f795..b494054 100644 (file)
@@ -18,7 +18,7 @@
 #ifndef __QUADD_VERSION_H
 #define __QUADD_VERSION_H
 
-#define QUADD_MODULE_VERSION           "1.34"
+#define QUADD_MODULE_VERSION           "1.35"
 #define QUADD_MODULE_BRANCH            "Dev"
 
 #endif /* __QUADD_VERSION_H */
index 823b05e..1fda959 100644 (file)
 #include <linux/ioctl.h>
 
 #define QUADD_SAMPLES_VERSION  17
-#define QUADD_IO_VERSION       6
+#define QUADD_IO_VERSION       7
 
 #define QUADD_IO_VERSION_DYNAMIC_RB            5
 #define QUADD_IO_VERSION_RB_MAX_FILL_COUNT     6
+#define QUADD_IO_VERSION_MOD_STATE_STATUS_FIELD        7
 
 #define QUADD_SAMPLE_VERSION_THUMB_MODE_FLAG   17
 
@@ -289,8 +290,12 @@ struct quadd_comm_cap {
 
 enum {
        QUADD_MOD_STATE_IDX_RB_MAX_FILL_COUNT = 0,
+       QUADD_MOD_STATE_IDX_STATUS,
 };
 
+#define QUADD_MOD_STATE_STATUS_IS_ACTIVE       (1 << 0)
+#define QUADD_MOD_STATE_STATUS_IS_AUTH_OPEN    (1 << 1)
+
 struct quadd_module_state {
        u64 nr_all_samples;
        u64 nr_skipped_samples;