Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753329AbaDYNyU (ORCPT ); Fri, 25 Apr 2014 09:54:20 -0400 Received: from mail-ee0-f49.google.com ([74.125.83.49]:54423 "EHLO mail-ee0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751028AbaDYNyS (ORCPT ); Fri, 25 Apr 2014 09:54:18 -0400 Date: Fri, 25 Apr 2014 15:54:13 +0200 From: Robert Richter To: Peter Zijlstra Cc: Jean Pihet , Borislav Petkov , Ingo Molnar , Arnaldo Carvalho de Melo , Jiri Olsa , linux-kernel@vger.kernel.org, Al Viro Subject: Re: [PATCH 04/16] perf, mmap: Factor out perf_get_fd() Message-ID: <20140425135413.GE32718@rric.localhost> References: <1396883078-25320-1-git-send-email-jean.pihet@linaro.org> <1396883078-25320-5-git-send-email-jean.pihet@linaro.org> <20140422142759.GM11182@twins.programming.kicks-ass.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140422142759.GM11182@twins.programming.kicks-ass.net> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 22.04.14 16:27:59, Peter Zijlstra wrote: > On Mon, Apr 07, 2014 at 05:04:26PM +0200, Jean Pihet wrote: > > From: Robert Richter > > > > This new function creates a new fd for an event. We need this later to > > get a fd from a persistent event. > > > > Signed-off-by: Robert Richter > > Signed-off-by: Robert Richter > > Signed-off-by: Jean Pihet > > --- > > kernel/events/core.c | 14 ++++++++------ > > kernel/events/internal.h | 1 + > > 2 files changed, 9 insertions(+), 6 deletions(-) > > > > diff --git a/kernel/events/core.c b/kernel/events/core.c > > index 22ec8f0..9857475 100644 > > --- a/kernel/events/core.c > > +++ b/kernel/events/core.c > > @@ -4206,6 +4206,11 @@ static const struct file_operations perf_fops = { > > .fasync = perf_fasync, > > }; > > > > +int perf_get_fd(struct perf_event *event, int f_flags) > > +{ > > + return anon_inode_getfd("[perf_event]", &perf_fops, event, f_flags); > > +} > > + > > /* > > * Perf event wakeup > > * > > @@ -7028,7 +7033,6 @@ SYSCALL_DEFINE5(perf_event_open, > > struct perf_event *event, *sibling; > > struct perf_event_attr attr; > > struct perf_event_context *ctx; > > - struct file *event_file = NULL; > > struct fd group = {NULL, 0}; > > struct task_struct *task = NULL; > > struct pmu *pmu; > > @@ -7189,10 +7193,9 @@ SYSCALL_DEFINE5(perf_event_open, > > goto err_context; > > } > > > > - event_file = anon_inode_getfile("[perf_event]", &perf_fops, event, > > - f_flags); > > - if (IS_ERR(event_file)) { > > - err = PTR_ERR(event_file); > > + event_fd = perf_get_fd(event, f_flags); > > + if (event_fd < 0) { > > + err = event_fd; > > goto err_context; > > } > > > > @@ -7257,7 +7260,6 @@ SYSCALL_DEFINE5(perf_event_open, > > * perf_group_detach(). > > */ > > fdput(group); > > - fd_install(event_fd, event_file); > > return event_fd; > > > > err_context: > > ISTR there being a good reason we only install the FD at the very last > moment. Of course I cannot quite recall it :/ > > I suspect it had something to do with not being able to fudge the state > while its being set-up or somesuch. I guess its this patch from Al you referring to: ea635c6 Fix racy use of anon_inode_getfd() in perf_event.c I think we do not introduce it back due to: a6fa941 perf_event: Switch to internal refcount, fix race with close() which removes the user of event_file. -Robert -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/