Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756282AbdGLKtE (ORCPT ); Wed, 12 Jul 2017 06:49:04 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53438 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756225AbdGLKtB (ORCPT ); Wed, 12 Jul 2017 06:49:01 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 3A76A3D956 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=jolsa@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 3A76A3D956 Date: Wed, 12 Jul 2017 12:48:58 +0200 From: Jiri Olsa To: "Naveen N. Rao" Cc: Peter Zijlstra , Arnaldo Carvalho de Melo , Ingo Molnar , linux-kernel@vger.kernel.org Subject: Re: [PATCH 0/2] Notifications for perf sideband events Message-ID: <20170712104858.GA5583@krava> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.8.3 (2017-05-23) X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Wed, 12 Jul 2017 10:49:01 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4475 Lines: 163 On Mon, Jun 19, 2017 at 08:01:06PM +0530, Naveen N. Rao wrote: > Currently, there is no way to ask for signals to be delivered when a > certain number of sideband events have been logged into the ring buffer. > This is problematic if we are only interested in, say, context switch > events. Furthermore, signals are more useful (rather than polling) for > self-profiling. This series provides for a way to achieve this. > > We ride on top of the existing support for ring buffer wakeup to > generate signals as desired. Counting sideband events still requires > some changes in the output path, but in normal cases, it ends up being > just a comparison. > > The test program below demonstrates how a process can profile itself for > context switch events and how it can control notification through > signals. The key changes include the below perf_event_attr settings as > well as use of IOC_ENABLE: > pe.signal_on_wakeup = 1; > pe.count_sb_events = 1; > pe.wakeup_events = 2; Vince, could you please check on this? thanks Naveen, have you run Vince's test suite on this? http://github.com/deater/perf_event_tests.git jirka > > To keep things simple, PERF_EVENT_IOC_REFRESH cannot be used if any of > the new attributes are set. > > RFC v2: > https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg1420363.html > Changes: > - Send HUP on perf_event_exit_event() (suggested by Jiri) > - Disable use of IOC_REFRESH if signal_on_wakeup/count_sb_events is > set. > > > - Naveen > > --- > Here is a sample program demonstrating the same: > > #define _GNU_SOURCE > > #include > #include > #include > #include > #include > #include > #include > #include > #include > #include > > static long > perf_event_open(struct perf_event_attr *hw_event, pid_t pid, > int cpu, int group_fd, unsigned long flags) > { > return syscall(__NR_perf_event_open, hw_event, pid, cpu, > group_fd, flags); > } > > static void sigio_handler(int n, siginfo_t *info, void *uc) > { > fprintf (stderr, "Caught %s\n", info->si_code == POLL_HUP ? "POLL_HUP" : > (info->si_code == POLL_IN ? "POLL_IN" : "other signal")); > } > > int main(int argc, char **argv) > { > struct perf_event_attr pe; > struct sigaction act; > int fd; > void *buf; > > memset(&act, 0, sizeof(act)); > act.sa_sigaction = sigio_handler; > act.sa_flags = SA_SIGINFO; > sigaction(SIGIO, &act, 0); > > memset(&pe, 0, sizeof(struct perf_event_attr)); > pe.size = sizeof(struct perf_event_attr); > pe.type = PERF_TYPE_SOFTWARE; > pe.config = PERF_COUNT_SW_DUMMY; > pe.disabled = 1; > pe.sample_period = 1; > pe.context_switch = 1; > pe.signal_on_wakeup = 1; > pe.count_sb_events = 1; > pe.wakeup_events = 2; > > fd = perf_event_open(&pe, 0, -1, -1, 0); > if (fd == -1) { > fprintf(stderr, "Error opening leader %lx\n", (unsigned long)pe.config); > exit(EXIT_FAILURE); > } > > buf = mmap(NULL, sysconf(_SC_PAGESIZE) * 2, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); > if (buf == MAP_FAILED) { > fprintf(stderr, "Can't mmap buffer\n"); > return -1; > } > > if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_ASYNC) == -1) > return -2; > > if (fcntl(fd, F_SETSIG, SIGIO) == -1) > return -3; > > if (fcntl(fd, F_SETOWN, getpid()) == -1) > return -4; > > if (ioctl(fd, PERF_EVENT_IOC_ENABLE, 0) == -1) > return -5; > > fprintf (stderr, "Sleep 1\n"); > sleep(1); > fprintf (stderr, "Sleep 2\n"); > sleep(1); > fprintf (stderr, "Sleep 3\n"); > sleep(1); > > /* Disable the event counter */ > ioctl(fd, PERF_EVENT_IOC_DISABLE, 1); > > close(fd); > > return 0; > } > > > A sample output: > $ time ./cs > Sleep 1 > Caught POLL_IN > Sleep 2 > Caught POLL_IN > Sleep 3 > Caught POLL_IN > > real 0m3.040s > user 0m0.001s > sys 0m0.003s > > > Naveen N. Rao (2): > kernel/events: Add option to notify through signals on wakeup > kernel/events: Add option to enable counting sideband events in > wakeup_events > > include/uapi/linux/perf_event.h | 4 +++- > kernel/events/core.c | 20 ++++++++++++-------- > kernel/events/ring_buffer.c | 16 ++++++++++++++++ > 3 files changed, 31 insertions(+), 9 deletions(-) > > -- > 2.13.1 >