From patchwork Mon Apr 7 15:04:32 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jean Pihet X-Patchwork-Id: 27907 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-qg0-f71.google.com (mail-qg0-f71.google.com [209.85.192.71]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 8796B20490 for ; Mon, 7 Apr 2014 15:08:38 +0000 (UTC) Received: by mail-qg0-f71.google.com with SMTP id j5sf13938720qga.6 for ; Mon, 07 Apr 2014 08:08:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe; bh=yc8ZToQcZ2W8pRtBGuKn2JYemgfAvrUjrveQr8lJbwY=; b=U9/CYceS9KvEK5deYN1CoBqZhOaA9f/5ecybnUndnDwHbych9c5E26WPCIyH8YXMW2 d+R0MOoHcj2qe2hn8fclrh23NODqnyuJBkFw2YtyQvUgGtP3fxy3W+CCv9awD8B7UBEH znHi1PDM1A5yfuYVACNk4kUWDfC66TTj3vgQZeQXQWq+fbxI5xc/caK8PqBwOzl1e+BX O1SS0m5QoTTNvbPkmmeGzHGIqyECuI66BBQol/OeYqBjiWungqajJ6Dhoju3b/Ps30Bc 40D02/2ipaCoehUbP6se0NSnAzkZ1oZ3biKuDPpARHkFtYwQRoMaS11JKWJ75tDzUyOZ xzYg== X-Gm-Message-State: ALoCoQmlmSr5pshHdk8QryW2CZFo2/Yu9ooMao1XrvkKN2VJ+66gHM2GhuO/Q7HY0mrvqSZmoV2y X-Received: by 10.236.112.4 with SMTP id x4mr5338956yhg.56.1396883318260; Mon, 07 Apr 2014 08:08:38 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.84.103 with SMTP id k94ls1820458qgd.93.gmail; Mon, 07 Apr 2014 08:08:38 -0700 (PDT) X-Received: by 10.58.88.8 with SMTP id bc8mr613028veb.39.1396883318143; Mon, 07 Apr 2014 08:08:38 -0700 (PDT) Received: from mail-vc0-f180.google.com (mail-vc0-f180.google.com [209.85.220.180]) by mx.google.com with ESMTPS id sc7si3175647vdc.85.2014.04.07.08.08.38 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 07 Apr 2014 08:08:38 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.220.180 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.220.180; Received: by mail-vc0-f180.google.com with SMTP id lf12so5491275vcb.11 for ; Mon, 07 Apr 2014 08:08:38 -0700 (PDT) X-Received: by 10.220.103.141 with SMTP id k13mr1790496vco.25.1396883318052; Mon, 07 Apr 2014 08:08:38 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.220.12.8 with SMTP id v8csp169896vcv; Mon, 7 Apr 2014 08:08:37 -0700 (PDT) X-Received: by 10.68.250.3 with SMTP id yy3mr31605483pbc.56.1396883317241; Mon, 07 Apr 2014 08:08:37 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id qf5si1986703pac.334.2014.04.07.08.08.36; Mon, 07 Apr 2014 08:08:36 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755627AbaDGPI1 (ORCPT + 27 others); Mon, 7 Apr 2014 11:08:27 -0400 Received: from mail-ee0-f42.google.com ([74.125.83.42]:47842 "EHLO mail-ee0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752575AbaDGPFT (ORCPT ); Mon, 7 Apr 2014 11:05:19 -0400 Received: by mail-ee0-f42.google.com with SMTP id d17so740390eek.15 for ; Mon, 07 Apr 2014 08:05:18 -0700 (PDT) X-Received: by 10.15.48.129 with SMTP id h1mr3445325eew.57.1396883118436; Mon, 07 Apr 2014 08:05:18 -0700 (PDT) Received: from localhost.localdomain (201-179-62-37.mobileinternet.proximus.be. [37.62.179.201]) by mx.google.com with ESMTPSA id o4sm42287649eef.20.2014.04.07.08.05.16 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Mon, 07 Apr 2014 08:05:17 -0700 (PDT) From: Jean Pihet To: Borislav Petkov , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Jiri Olsa , linux-kernel@vger.kernel.org, Robert Richter Cc: Robert Richter , Jean Pihet Subject: [PATCH 10/16] perf, persistent: Implement reference counter for events Date: Mon, 7 Apr 2014 17:04:32 +0200 Message-Id: <1396883078-25320-11-git-send-email-jean.pihet@linaro.org> X-Mailer: git-send-email 1.7.11.7 In-Reply-To: <1396883078-25320-1-git-send-email-jean.pihet@linaro.org> References: <1396883078-25320-1-git-send-email-jean.pihet@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: jean.pihet@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.220.180 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , From: Robert Richter We need this later for proper event removal. Signed-off-by: Robert Richter Signed-off-by: Robert Richter Signed-off-by: Jean Pihet --- kernel/events/persistent.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/kernel/events/persistent.c b/kernel/events/persistent.c index d04827c..fcbb4f8 100644 --- a/kernel/events/persistent.c +++ b/kernel/events/persistent.c @@ -9,6 +9,7 @@ #define CPU_BUFFER_NR_PAGES ((512 * 1024) / PAGE_SIZE) struct pevent { + atomic_t refcount; struct perf_pmu_events_attr sysfs; char *name; int id; @@ -130,6 +131,7 @@ static int persistent_event_open(int cpu, struct pevent *pevent, if (ret) goto fail; + atomic_inc(&pevent->refcount); atomic_inc(&event->mmap_count); /* All workie, enable event now */ @@ -144,8 +146,11 @@ fail: static void persistent_event_close(int cpu, struct pevent *pevent) { struct perf_event *event = pevent_del(pevent, cpu); - if (event) + if (event) { + /* Safe, the caller holds &pevent->refcount too. */ + atomic_dec(&pevent->refcount); persistent_event_release(event); + } } static int pevent_sysfs_register(struct pevent *event); @@ -162,6 +167,8 @@ persistent_open(char *name, struct perf_event_attr *attr, int nr_pages) if (!pevent) return -ENOMEM; + atomic_set(&pevent->refcount, 1); + ret = get_event_id(pevent); if (ret < 0) goto fail; @@ -187,21 +194,21 @@ persistent_open(char *name, struct perf_event_attr *attr, int nr_pages) } ret = pevent_sysfs_register(pevent); - if (ret) - goto fail; - - return 0; + if (!ret) + goto out; fail: for_each_possible_cpu(cpu) persistent_event_close(cpu, pevent); - if (pevent->id) - put_event_id(pevent->id); - kfree(pevent->name); - kfree(pevent); - pr_err("%s: Error adding persistent event: %d\n", __func__, ret); +out: + if (atomic_dec_and_test(&pevent->refcount)) { + if (pevent->id) + put_event_id(pevent->id); + kfree(pevent->name); + kfree(pevent); + } return ret; }