.. | .. |
---|
37 | 37 | stm_ftrace_write(struct trace_export *export, const void *buf, unsigned int len) |
---|
38 | 38 | { |
---|
39 | 39 | struct stm_ftrace *stm = container_of(export, struct stm_ftrace, ftrace); |
---|
| 40 | + /* This is called from trace system with preemption disabled */ |
---|
| 41 | + unsigned int cpu = smp_processor_id(); |
---|
40 | 42 | |
---|
41 | | - stm_source_write(&stm->data, STM_FTRACE_CHAN, buf, len); |
---|
| 43 | + stm_source_write(&stm->data, STM_FTRACE_CHAN + cpu, buf, len); |
---|
42 | 44 | } |
---|
43 | 45 | |
---|
44 | 46 | static int stm_ftrace_link(struct stm_source_data *data) |
---|
.. | .. |
---|
46 | 48 | struct stm_ftrace *sf = container_of(data, struct stm_ftrace, data); |
---|
47 | 49 | |
---|
48 | 50 | sf->ftrace.write = stm_ftrace_write; |
---|
| 51 | + sf->ftrace.flags = TRACE_EXPORT_FUNCTION | TRACE_EXPORT_EVENT |
---|
| 52 | + | TRACE_EXPORT_MARKER; |
---|
49 | 53 | |
---|
50 | 54 | return register_ftrace_export(&sf->ftrace); |
---|
51 | 55 | } |
---|
.. | .. |
---|
61 | 65 | { |
---|
62 | 66 | int ret; |
---|
63 | 67 | |
---|
| 68 | + stm_ftrace.data.nr_chans = roundup_pow_of_two(num_possible_cpus()); |
---|
64 | 69 | ret = stm_source_register_device(NULL, &stm_ftrace.data); |
---|
65 | 70 | if (ret) |
---|
66 | 71 | pr_err("Failed to register stm_source - ftrace.\n"); |
---|