Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752570AbdF0JEm (ORCPT ); Tue, 27 Jun 2017 05:04:42 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:53060 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752112AbdF0JES (ORCPT ); Tue, 27 Jun 2017 05:04:18 -0400 Date: Tue, 27 Jun 2017 14:34:04 +0530 From: "Naveen N. Rao" To: Peter Zijlstra , Arnaldo Carvalho de Melo , Jiri Olsa , Ingo Molnar Cc: linux-kernel@vger.kernel.org Subject: Re: [PATCH 0/2] Notifications for perf sideband events References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20170609 (1.8.3) X-TM-AS-MML: disable x-cbid: 17062709-0044-0000-0000-00000274AA1D X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17062709-0045-0000-0000-000007049E5C Message-Id: <20170627090403.xsmwkdvu3sfmlsyb@naverao1-tp.localdomain> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-06-27_05:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1703280000 definitions=main-1706270147 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4319 Lines: 160 On 2017/06/19 08:01PM, 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. > > 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; > > 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. Peter, Arnaldo, Jiri, Can you please take a look at this patchset? Thanks, Naveen > > > - 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 >