lkml.org 
[lkml]   [2009]   [Nov]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/core] perf: Optimize some swcounter attr.sample_period==1 paths
    Commit-ID:  0cff784ae41cc125368ae77f1c01328ae2fdc6b3
    Gitweb: http://git.kernel.org/tip/0cff784ae41cc125368ae77f1c01328ae2fdc6b3
    Author: Peter Zijlstra <a.p.zijlstra@chello.nl>
    AuthorDate: Fri, 20 Nov 2009 22:19:44 +0100
    Committer: Ingo Molnar <mingo@elte.hu>
    CommitDate: Sat, 21 Nov 2009 14:11:35 +0100

    perf: Optimize some swcounter attr.sample_period==1 paths

    Avoid the rather expensive perf_swevent_set_period() if we know
    we have to sample every single event anyway.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Paul Mackerras <paulus@samba.org>
    LKML-Reference: <20091120212508.299508332@chello.nl>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    ---
    kernel/perf_event.c | 17 +++++++++++------
    1 files changed, 11 insertions(+), 6 deletions(-)

    diff --git a/kernel/perf_event.c b/kernel/perf_event.c
    index 1dfb6cc..8e55b44 100644
    --- a/kernel/perf_event.c
    +++ b/kernel/perf_event.c
    @@ -3759,16 +3759,16 @@ again:
    return nr;
    }

    -static void perf_swevent_overflow(struct perf_event *event,
    +static void perf_swevent_overflow(struct perf_event *event, u64 overflow,
    int nmi, struct perf_sample_data *data,
    struct pt_regs *regs)
    {
    struct hw_perf_event *hwc = &event->hw;
    int throttle = 0;
    - u64 overflow;

    data->period = event->hw.last_period;
    - overflow = perf_swevent_set_period(event);
    + if (!overflow)
    + overflow = perf_swevent_set_period(event);

    if (hwc->interrupts == MAX_INTERRUPTS)
    return;
    @@ -3801,14 +3801,19 @@ static void perf_swevent_add(struct perf_event *event, u64 nr,

    atomic64_add(nr, &event->count);

    + if (!regs)
    + return;
    +
    if (!hwc->sample_period)
    return;

    - if (!regs)
    + if (nr == 1 && hwc->sample_period == 1 && !event->attr.freq)
    + return perf_swevent_overflow(event, 1, nmi, data, regs);
    +
    + if (atomic64_add_negative(nr, &hwc->period_left))
    return;

    - if (!atomic64_add_negative(nr, &hwc->period_left))
    - perf_swevent_overflow(event, nmi, data, regs);
    + perf_swevent_overflow(event, 0, nmi, data, regs);
    }

    static int perf_swevent_is_counting(struct perf_event *event)

    \
     
     \ /
      Last update: 2009-11-21 14:45    [W:0.023 / U:59.648 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site