lkml.org 
[lkml]   [2019]   [Dec]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v4 20/22] tracing/boot: Add cpu_mask option support
    Date
    Add ftrace.cpumask option support to boot-time tracing.
    This sets cpumask for each instance.

    - ftrace.[instance.INSTANCE.]cpumask = CPUMASK;
    Set the trace cpumask. Note that the CPUMASK should be a string
    which <tracefs>/tracing_cpumask can accepts.

    Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
    ---
    kernel/trace/trace.c | 42 +++++++++++++++++++++++++++++-------------
    kernel/trace/trace_boot.c | 14 ++++++++++++++
    2 files changed, 43 insertions(+), 13 deletions(-)

    diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
    index c19dce22f5bd..008d3788331a 100644
    --- a/kernel/trace/trace.c
    +++ b/kernel/trace/trace.c
    @@ -4555,20 +4555,13 @@ tracing_cpumask_read(struct file *filp, char __user *ubuf,
    return count;
    }

    -static ssize_t
    -tracing_cpumask_write(struct file *filp, const char __user *ubuf,
    - size_t count, loff_t *ppos)
    +int tracing_set_cpumask(struct trace_array *tr,
    + cpumask_var_t tracing_cpumask_new)
    {
    - struct trace_array *tr = file_inode(filp)->i_private;
    - cpumask_var_t tracing_cpumask_new;
    - int err, cpu;
    -
    - if (!alloc_cpumask_var(&tracing_cpumask_new, GFP_KERNEL))
    - return -ENOMEM;
    + int cpu;

    - err = cpumask_parse_user(ubuf, count, tracing_cpumask_new);
    - if (err)
    - goto err_unlock;
    + if (!tr)
    + return -EINVAL;

    local_irq_disable();
    arch_spin_lock(&tr->max_lock);
    @@ -4592,11 +4585,34 @@ tracing_cpumask_write(struct file *filp, const char __user *ubuf,
    local_irq_enable();

    cpumask_copy(tr->tracing_cpumask, tracing_cpumask_new);
    +
    + return 0;
    +}
    +
    +static ssize_t
    +tracing_cpumask_write(struct file *filp, const char __user *ubuf,
    + size_t count, loff_t *ppos)
    +{
    + struct trace_array *tr = file_inode(filp)->i_private;
    + cpumask_var_t tracing_cpumask_new;
    + int err;
    +
    + if (!alloc_cpumask_var(&tracing_cpumask_new, GFP_KERNEL))
    + return -ENOMEM;
    +
    + err = cpumask_parse_user(ubuf, count, tracing_cpumask_new);
    + if (err)
    + goto err_free;
    +
    + err = tracing_set_cpumask(tr, tracing_cpumask_new);
    + if (err)
    + goto err_free;
    +
    free_cpumask_var(tracing_cpumask_new);

    return count;

    -err_unlock:
    +err_free:
    free_cpumask_var(tracing_cpumask_new);

    return err;
    diff --git a/kernel/trace/trace_boot.c b/kernel/trace/trace_boot.c
    index f5db30d25b0b..81d923c16a4d 100644
    --- a/kernel/trace/trace_boot.c
    +++ b/kernel/trace/trace_boot.c
    @@ -18,6 +18,8 @@ extern int trace_set_options(struct trace_array *tr, char *option);
    extern int tracing_set_tracer(struct trace_array *tr, const char *buf);
    extern ssize_t tracing_resize_ring_buffer(struct trace_array *tr,
    unsigned long size, int cpu_id);
    +extern int tracing_set_cpumask(struct trace_array *tr,
    + cpumask_var_t tracing_cpumask_new);

    static void __init
    trace_boot_set_instance_options(struct trace_array *tr, struct xbc_node *node)
    @@ -52,6 +54,18 @@ trace_boot_set_instance_options(struct trace_array *tr, struct xbc_node *node)
    if (tracing_resize_ring_buffer(tr, v, RING_BUFFER_ALL_CPUS) < 0)
    pr_err("Failed to resize trace buffer to %s\n", p);
    }
    +
    + p = xbc_node_find_value(node, "cpumask", NULL);
    + if (p && *p != '\0') {
    + cpumask_var_t new_mask;
    +
    + if (alloc_cpumask_var(&new_mask, GFP_KERNEL)) {
    + if (cpumask_parse(p, new_mask) < 0 ||
    + tracing_set_cpumask(tr, new_mask) < 0)
    + pr_err("Failed to set new CPU mask %s\n", p);
    + free_cpumask_var(new_mask);
    + }
    + }
    }

    #ifdef CONFIG_EVENT_TRACING
    \
     
     \ /
      Last update: 2019-12-02 11:18    [W:4.345 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site