summaryrefslogtreecommitdiff
path: root/SOURCE/module/kernel/load.c
diff options
context:
space:
mode:
authorgit-baoyou <[email protected]>2021-10-28 10:01:59 +0800
committerGitHub <[email protected]>2021-10-28 10:01:59 +0800
commit19c8cbdf483bb14b4dae02cee41bc657bf98909c (patch)
tree914318f9124cc6c9c7aea71ca0c1b5f50315b698 /SOURCE/module/kernel/load.c
parent4d837374491b06f2e5f5681b1b7b504da0e19ab0 (diff)
parente285bc4626a7d207eabd4a69cb276e1a3b1b7c76 (diff)
Merge pull request #145 from albinyang/master
load-monitor: 新增输出各CPU上正在运行进程的内核态和用户态堆栈功能
Diffstat (limited to 'SOURCE/module/kernel/load.c')
-rwxr-xr-xSOURCE/module/kernel/load.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/SOURCE/module/kernel/load.c b/SOURCE/module/kernel/load.c
index 9b4af2f..09f4f42 100755
--- a/SOURCE/module/kernel/load.c
+++ b/SOURCE/module/kernel/load.c
@@ -40,7 +40,7 @@
static atomic64_t diag_nr_running = ATOMIC64_INIT(0);
-struct diag_load_monitor_settings load_monitor_settings;
+static struct diag_load_monitor_settings load_monitor_settings;
static unsigned int load_monitor_alloced;
@@ -49,6 +49,7 @@ static struct mm_tree mm_tree;
unsigned long *orig_avenrun_r;
unsigned long *orig_avenrun;
+static struct load_monitor_cpu_run ld_mon_cpu_run[NR_CPUS];
static struct diag_variant_buffer load_monitor_variant_buffer;
static ktime_t last_dump;
@@ -77,6 +78,38 @@ void diag_load_timer(struct diag_percpu_context *context)
return;
}
#else
+
+static void load_monitor_ipi(void *ignore)
+{
+ struct load_monitor_cpu_run *cpu_run;
+ struct task_struct *tsk;
+ unsigned long flags;
+ int cpu;
+
+ tsk = current;
+ cpu = smp_processor_id();
+ if (cpu >= NR_CPUS)
+ return;
+
+ cpu_run = &ld_mon_cpu_run[cpu];
+
+ cpu_run->id = get_cycles();
+ cpu_run->et_type = et_load_monitor_cpu_run;
+ cpu_run->cpu = cpu;
+ do_gettimeofday(&cpu_run->tv);
+
+ diag_task_brief(tsk, &cpu_run->task);
+ diag_task_kern_stack(tsk, &cpu_run->kern_stack);
+ diag_task_user_stack(tsk, &cpu_run->user_stack);
+
+ diag_variant_buffer_spin_lock(&load_monitor_variant_buffer, flags);
+ diag_variant_buffer_reserve(&load_monitor_variant_buffer, sizeof(struct load_monitor_cpu_run));
+ diag_variant_buffer_write_nolock(&load_monitor_variant_buffer,
+ cpu_run, sizeof(struct load_monitor_cpu_run));
+ diag_variant_buffer_seal(&load_monitor_variant_buffer);
+ diag_variant_buffer_spin_unlock(&load_monitor_variant_buffer, flags);
+}
+
void diag_load_timer(struct diag_percpu_context *context)
{
u64 ms;
@@ -190,6 +223,11 @@ void diag_load_timer(struct diag_percpu_context *context)
}
} while_each_thread(g, p);
rcu_read_unlock();
+
+ if (!load_monitor_settings.mass && load_monitor_settings.cpu_run) {
+ smp_call_function(load_monitor_ipi, NULL, 1);
+ load_monitor_ipi(NULL);
+ }
}
}
#endif