lkml.org 
[lkml]   [2013]   [Jun]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 2/2] hw_breakpoint: Use cpu_possible_mask in {reserve,release}_bp_slot()
    fetch_bp_busy_slots() and toggle_bp_slot() use for_each_online_cpu(),
    this is obviously wrong wrt cpu_up() or cpu_down(), we can over/under
    account the per-cpu numbers.

    For example:

    # echo 0 >> /sys/devices/system/cpu/cpu1/online
    # perf record -e mem:0x10 -p 1 &
    # echo 1 >> /sys/devices/system/cpu/cpu1/online
    # perf record -e mem:0x10,mem:0x10,mem:0x10,mem:0x10 -C1 -a &
    # taskset -p 0x2 1

    triggers the same WARN_ONCE("Can't find any breakpoint slot") in
    arch_install_hw_breakpoint().

    Signed-off-by: Oleg Nesterov <oleg@redhat.com>
    Cc: <stable@vger.kernel.org>
    ---
    kernel/events/hw_breakpoint.c | 4 ++--
    1 files changed, 2 insertions(+), 2 deletions(-)

    diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c
    index 29d3abe..4407e43 100644
    --- a/kernel/events/hw_breakpoint.c
    +++ b/kernel/events/hw_breakpoint.c
    @@ -149,7 +149,7 @@ fetch_bp_busy_slots(struct bp_busy_slots *slots, struct perf_event *bp,
    return;
    }

    - for_each_online_cpu(cpu) {
    + for_each_possible_cpu(cpu) {
    unsigned int nr;

    nr = per_cpu(nr_cpu_bp_pinned[type], cpu);
    @@ -235,7 +235,7 @@ toggle_bp_slot(struct perf_event *bp, bool enable, enum bp_type_idx type,
    if (cpu >= 0) {
    toggle_bp_task_slot(bp, cpu, enable, type, weight);
    } else {
    - for_each_online_cpu(cpu)
    + for_each_possible_cpu(cpu)
    toggle_bp_task_slot(bp, cpu, enable, type, weight);
    }

    --
    1.5.5.1



    \
     
     \ /
      Last update: 2013-06-01 21:01    [W:4.092 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site