lkml.org 
[lkml]   [2019]   [Aug]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v3 16/19] tracing/boot: Add cpu_mask option support
    Date
    Add ftrace.cpumask option support for setting trace
    cpumask.

    - 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 | 41 ++++++++++++++++++++++++++++-------------
    kernel/trace/trace_boot.c | 14 ++++++++++++++
    2 files changed, 42 insertions(+), 13 deletions(-)

    diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
    index 69400a87e48f..bfe513e472d2 100644
    --- a/kernel/trace/trace.c
    +++ b/kernel/trace/trace.c
    @@ -4437,20 +4437,12 @@ 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);
    @@ -4474,11 +4466,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 74cffecd12a4..755a2040aebf 100644
    --- a/kernel/trace/trace_boot.c
    +++ b/kernel/trace/trace_boot.c
    @@ -22,6 +22,8 @@ extern void __init trace_init_tracepoint_printk(void);
    extern ssize_t tracing_resize_ring_buffer(struct trace_array *tr,
    unsigned long size, int cpu_id);
    extern struct trace_array *trace_array_create(const char *name);
    +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 skc_node *node)
    @@ -56,6 +58,18 @@ trace_boot_set_instance_options(struct trace_array *tr, struct skc_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 = skc_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);
    + }
    + }
    }

    static void __init
    \
     
     \ /
      Last update: 2019-08-26 05:26    [W:4.025 / U:0.172 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site