lkml.org 
[lkml]   [2019]   [Apr]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/core] perf/core: Add perf_pmu_resched() as global function
    Commit-ID:  c68d224e5ed15605e651e2482c6ffd95915ddf58
    Gitweb: https://git.kernel.org/tip/c68d224e5ed15605e651e2482c6ffd95915ddf58
    Author: Stephane Eranian <eranian@google.com>
    AuthorDate: Mon, 8 Apr 2019 10:32:51 -0700
    Committer: Ingo Molnar <mingo@kernel.org>
    CommitDate: Tue, 16 Apr 2019 12:19:34 +0200

    perf/core: Add perf_pmu_resched() as global function

    This patch add perf_pmu_resched() a global function that can be called
    to force rescheduling of events for a given PMU. The function locks
    both cpuctx and task_ctx internally. This will be used by a subsequent
    patch.

    Signed-off-by: Stephane Eranian <eranian@google.com>
    [ Simplified the calling convention. ]
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vince Weaver <vincent.weaver@maine.edu>
    Cc: kan.liang@intel.com
    Cc: nelson.dsouza@intel.com
    Cc: tonyj@suse.com
    Link: https://lkml.kernel.org/r/20190408173252.37932-2-eranian@google.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    ---
    include/linux/perf_event.h | 3 +++
    kernel/events/core.c | 10 ++++++++++
    2 files changed, 13 insertions(+)

    diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
    index 085a95e2582a..f3864e1c5569 100644
    --- a/include/linux/perf_event.h
    +++ b/include/linux/perf_event.h
    @@ -888,6 +888,9 @@ extern void perf_sched_cb_dec(struct pmu *pmu);
    extern void perf_sched_cb_inc(struct pmu *pmu);
    extern int perf_event_task_disable(void);
    extern int perf_event_task_enable(void);
    +
    +extern void perf_pmu_resched(struct pmu *pmu);
    +
    extern int perf_event_refresh(struct perf_event *event, int refresh);
    extern void perf_event_update_userpage(struct perf_event *event);
    extern int perf_event_release_kernel(struct perf_event *event);
    diff --git a/kernel/events/core.c b/kernel/events/core.c
    index 30a572e4c6f1..abbd4b3b96c2 100644
    --- a/kernel/events/core.c
    +++ b/kernel/events/core.c
    @@ -2478,6 +2478,16 @@ static void ctx_resched(struct perf_cpu_context *cpuctx,
    perf_pmu_enable(cpuctx->ctx.pmu);
    }

    +void perf_pmu_resched(struct pmu *pmu)
    +{
    + struct perf_cpu_context *cpuctx = this_cpu_ptr(pmu->pmu_cpu_context);
    + struct perf_event_context *task_ctx = cpuctx->task_ctx;
    +
    + perf_ctx_lock(cpuctx, task_ctx);
    + ctx_resched(cpuctx, task_ctx, EVENT_ALL|EVENT_CPU);
    + perf_ctx_unlock(cpuctx, task_ctx);
    +}
    +
    /*
    * Cross CPU call to install and enable a performance event
    *
    \
     
     \ /
      Last update: 2019-04-16 13:33    [W:3.037 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site