From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751937AbdIENvD (ORCPT ); Tue, 5 Sep 2017 09:51:03 -0400 Received: from mga11.intel.com ([192.55.52.93]:56226 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751646AbdIENud (ORCPT ); Tue, 5 Sep 2017 09:50:33 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.41,480,1498546800"; d="scan'208";a="1011119169" From: Alexander Shishkin To: Peter Zijlstra Cc: Ingo Molnar , linux-kernel@vger.kernel.org, acme@redhat.com, kirill.shutemov@linux.intel.com, Borislav Petkov , rric@kernel.org, Alexander Shishkin Subject: [RFC PATCH 13/17] perf: Re-inject shmem buffers after exec Date: Tue, 5 Sep 2017 16:30:22 +0300 Message-Id: <20170905133026.13689-14-alexander.shishkin@linux.intel.com> X-Mailer: git-send-email 2.13.1 In-Reply-To: <20170905133026.13689-1-alexander.shishkin@linux.intel.com> References: <20170905133026.13689-1-alexander.shishkin@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org A exec will unmap everything, but we want our shmem buffers to persist. This tells the page-pinning task work to mmap event's ring buffer after the task exec'ed. Signed-off-by: Alexander Shishkin --- kernel/events/core.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/kernel/events/core.c b/kernel/events/core.c index e00f1f6aaf..f0b77b33b4 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -6482,6 +6482,29 @@ static void perf_event_addr_filters_exec(struct perf_event *event, void *data) perf_event_stop(event, 1); } +static void perf_shmem_ctx_exec(struct perf_event_context *ctx) +{ + struct perf_event *event; + unsigned long flags; + + raw_spin_lock_irqsave(&ctx->lock, flags); + + list_for_each_entry(event, &ctx->event_list, event_entry) { + if (event->attach_state & PERF_ATTACH_SHMEM) { + struct ring_buffer *rb; + + /* called inside rcu read section */ + rb = rcu_dereference(event->rb); + if (!rb) + continue; + + rb->shmem_file_addr = 0; + } + } + + raw_spin_unlock_irqrestore(&ctx->lock, flags); +} + void perf_event_exec(void) { struct perf_event_context *ctx; @@ -6497,6 +6520,7 @@ void perf_event_exec(void) perf_iterate_ctx(ctx, perf_event_addr_filters_exec, NULL, true); + perf_shmem_ctx_exec(ctx); } rcu_read_unlock(); } -- 2.14.1