lkml.org 
[lkml]   [2015]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/core] perf: Disallow sparse AUX allocations for non-SG PMUs in overwrite mode
    Commit-ID:  aa319bcd366349c6f72fcd331da89d3d06090651
    Gitweb: http://git.kernel.org/tip/aa319bcd366349c6f72fcd331da89d3d06090651
    Author: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    AuthorDate: Fri, 22 May 2015 18:30:20 +0300
    Committer: Ingo Molnar <mingo@kernel.org>
    CommitDate: Wed, 27 May 2015 09:16:20 +0200

    perf: Disallow sparse AUX allocations for non-SG PMUs in overwrite mode

    PMUs that don't support hardware scatter tables require big contiguous
    chunks of memory and a PMI to switch between them. However, in overwrite
    using a PMI for this purpose adds extra overhead that the users would
    like to avoid. Thus, in overwrite mode for such PMUs we can only allow
    one contiguous chunk for the entire requested buffer.

    This patch changes the behavior accordingly, so that if the buddy allocator
    fails to come up with a single high-order chunk for the entire requested
    buffer, the allocation will fail.

    Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: acme@infradead.org
    Cc: adrian.hunter@intel.com
    Cc: hpa@zytor.com
    Link: http://lkml.kernel.org/r/1432308626-18845-2-git-send-email-alexander.shishkin@linux.intel.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    ---
    kernel/events/ring_buffer.c | 14 ++++++++++++++
    1 file changed, 14 insertions(+)

    diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
    index 232f00f..725c416 100644
    --- a/kernel/events/ring_buffer.c
    +++ b/kernel/events/ring_buffer.c
    @@ -493,6 +493,20 @@ int rb_alloc_aux(struct ring_buffer *rb, struct perf_event *event,
    rb->aux_pages[rb->aux_nr_pages] = page_address(page++);
    }

    + /*
    + * In overwrite mode, PMUs that don't support SG may not handle more
    + * than one contiguous allocation, since they rely on PMI to do double
    + * buffering. In this case, the entire buffer has to be one contiguous
    + * chunk.
    + */
    + if ((event->pmu->capabilities & PERF_PMU_CAP_AUX_NO_SG) &&
    + overwrite) {
    + struct page *page = virt_to_page(rb->aux_pages[0]);
    +
    + if (page_private(page) != max_order)
    + goto out;
    + }
    +
    rb->aux_priv = event->pmu->setup_aux(event->cpu, rb->aux_pages, nr_pages,
    overwrite);
    if (!rb->aux_priv)

    \
     
     \ /
      Last update: 2015-05-27 12:21    [W:3.753 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site