提交 b09bbe5b 编写于 作者: D Dave Martin 提交者: Nicolas Pitre

ARM: bL_switcher/trace: Add trace trigger for trace bootstrapping

When tracing switching, an external tracer needs a way to bootstrap
its knowledge of the logical<->physical CPU mapping.

This patch adds a sysfs attribute trace_trigger.  A write to this
attribute will generate a power:cpu_migrate_current event for each
online CPU, indicating the current physical CPU for each logical
CPU.

Activating or deactivating the switcher also generates these
events, so that the tracer knows about the resulting remapping of
affected CPUs.
Signed-off-by: NDave Martin <dave.martin@linaro.org>
上级 1bfbddb6
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/smp.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/sysfs.h> #include <linux/sysfs.h>
...@@ -531,6 +532,25 @@ static int bL_switcher_halve_cpus(void) ...@@ -531,6 +532,25 @@ static int bL_switcher_halve_cpus(void)
return 0; return 0;
} }
static void bL_switcher_trace_trigger_cpu(void *__always_unused info)
{
trace_cpu_migrate_current(get_ns(), read_mpidr());
}
static int bL_switcher_trace_trigger(void)
{
int ret;
preempt_disable();
bL_switcher_trace_trigger_cpu(NULL);
ret = smp_call_function(bL_switcher_trace_trigger_cpu, NULL, true);
preempt_enable();
return ret;
}
static int bL_switcher_enable(void) static int bL_switcher_enable(void)
{ {
int cpu, ret; int cpu, ret;
...@@ -553,6 +573,8 @@ static int bL_switcher_enable(void) ...@@ -553,6 +573,8 @@ static int bL_switcher_enable(void)
if (ret) if (ret)
goto error; goto error;
bL_switcher_trace_trigger();
for_each_online_cpu(cpu) { for_each_online_cpu(cpu) {
struct bL_thread *t = &bL_threads[cpu]; struct bL_thread *t = &bL_threads[cpu];
spin_lock_init(&t->lock); spin_lock_init(&t->lock);
...@@ -637,6 +659,8 @@ static void bL_switcher_disable(void) ...@@ -637,6 +659,8 @@ static void bL_switcher_disable(void)
} }
bL_switcher_restore_cpus(); bL_switcher_restore_cpus();
bL_switcher_trace_trigger();
bL_activation_notify(BL_NOTIFY_POST_DISABLE); bL_activation_notify(BL_NOTIFY_POST_DISABLE);
out: out:
...@@ -670,11 +694,23 @@ static ssize_t bL_switcher_active_store(struct kobject *kobj, ...@@ -670,11 +694,23 @@ static ssize_t bL_switcher_active_store(struct kobject *kobj,
return (ret >= 0) ? count : ret; return (ret >= 0) ? count : ret;
} }
static ssize_t bL_switcher_trace_trigger_store(struct kobject *kobj,
struct kobj_attribute *attr, const char *buf, size_t count)
{
int ret = bL_switcher_trace_trigger();
return ret ? ret : count;
}
static struct kobj_attribute bL_switcher_active_attr = static struct kobj_attribute bL_switcher_active_attr =
__ATTR(active, 0644, bL_switcher_active_show, bL_switcher_active_store); __ATTR(active, 0644, bL_switcher_active_show, bL_switcher_active_store);
static struct kobj_attribute bL_switcher_trace_trigger_attr =
__ATTR(trace_trigger, 0200, NULL, bL_switcher_trace_trigger_store);
static struct attribute *bL_switcher_attrs[] = { static struct attribute *bL_switcher_attrs[] = {
&bL_switcher_active_attr.attr, &bL_switcher_active_attr.attr,
&bL_switcher_trace_trigger_attr.attr,
NULL, NULL,
}; };
......
...@@ -42,6 +42,7 @@ DECLARE_EVENT_CLASS(cpu_migrate, ...@@ -42,6 +42,7 @@ DECLARE_EVENT_CLASS(cpu_migrate,
__define_cpu_migrate_event(begin); __define_cpu_migrate_event(begin);
__define_cpu_migrate_event(finish); __define_cpu_migrate_event(finish);
__define_cpu_migrate_event(current);
#undef __define_cpu_migrate #undef __define_cpu_migrate
#undef __cpu_migrate_proto #undef __cpu_migrate_proto
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册