Received: by 2002:a25:23cc:0:0:0:0:0 with SMTP id j195csp258400ybj; Wed, 6 May 2020 16:54:10 -0700 (PDT) X-Google-Smtp-Source: APiQypLi7C40w4XyzugwfX0TrtughrDj5ecerwNBe09HOkVMk7SIZe4EfRNuvAoqb+Ai8uWAgFpJ X-Received: by 2002:a17:907:6fc:: with SMTP id yh28mr9975495ejb.326.1588809250058; Wed, 06 May 2020 16:54:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588809250; cv=none; d=google.com; s=arc-20160816; b=BCMM61J9JDt1y2gtTEKkG89UuKWjHw0i6fnBsqk49BdxE+bdXhqovmNbHSORy/r4o/ FQRvtgXC9ZqSgXJN9Hdjnq8+UO1cl4yH+zxG5yPoz/Y3Pigwg/SXca3gOo/IFODyZa81 X8nKiQJubTQ2yf3aTv7kgV8gWzvWl+N4XZlyVRM9etrXRWToK45Cyy9FTsT9Dbcz3jCD iIa+9SKfzMiCW5qQjuuKomOaGx7Zh5Cam7IgEhztqgoGvLDhsRB1BoC/5YtFvVjHHG7a mb/sxrHECMaNUIXopl5CIDZ5CNaTmRPUGEUqSSlGfXj7RpZxHgqdjkKIxHFJTstj3CKq KePg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:date:from :dkim-signature; bh=OhnPg6FmM/PvlxA3EMEXSgdF+c8Ak7a+kAiTazPJVjM=; b=CKPlR7JXwk1e+1TjaRu0K6d30SFH8TJDcA3f6ZUjkdunU4d2x+wFBNUAJltMDFKbaO vIRX6nG2Pd7GJjJZgBSSTVkWuGid0UbQPhu4b7A2RSK6+sctin6BWen02GchUnwW3+mf qpy/ANhVo6DlX4CmUTEglilny39+aK/UAlSnd8ETcSoklU8qZFm9f/OWJj2lPa1IOIqW zEIh2gFoL9kUtNas8uCzK+Ajb1Pm/0Txox2m3jP97fxYDNwSxlydDn8Evvbmih60erWd qRjg2+F8uzAtuxo7A/lmh2R1OF81hlfLJ52Zoc7hKG1pqzJ8JEPedSYJxpGCflsJyPbp BNPQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=CKjFMKkz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id lc1si2065954ejb.198.2020.05.06.16.53.47; Wed, 06 May 2020 16:54:10 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=CKjFMKkz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728836AbgEFUVm (ORCPT + 99 others); Wed, 6 May 2020 16:21:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48932 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726495AbgEFUVm (ORCPT ); Wed, 6 May 2020 16:21:42 -0400 Received: from mail-qv1-xf43.google.com (mail-qv1-xf43.google.com [IPv6:2607:f8b0:4864:20::f43]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1D55BC061A0F for ; Wed, 6 May 2020 13:21:42 -0700 (PDT) Received: by mail-qv1-xf43.google.com with SMTP id v10so1508910qvr.2 for ; Wed, 06 May 2020 13:21:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:date:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=OhnPg6FmM/PvlxA3EMEXSgdF+c8Ak7a+kAiTazPJVjM=; b=CKjFMKkzrP6Mx2WcyxkY27qcGV0NfENUgdqxdtN034M1SCcrAMvxG89H+miaUEOtr/ M0Vq5t2Ad8SG5olAFoLxeIzbySLdpREf07i7JaAjLfKNl/OKHxRiyJcJ+3o4Vk0Sdm3j UafJKVF8k0M+ZpJKC++F/52/rW5Z65GVKHIJfaCad8j9V6TbPzmpsh2XjcGfxIph2sEM jYSVJAj62whWqEoUqQqWiDQyGssG1WLd92ywGIihwyJM32X/2Vy112lX9Kcs6NUyf6gx wL89FL3CM9qrdj+S6VJwsYrq6TZePLUYm14Lx2RRct1swn5ZpudLOmz9ASJj5TM6/ycX sNsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:date:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=OhnPg6FmM/PvlxA3EMEXSgdF+c8Ak7a+kAiTazPJVjM=; b=cpy9kWkdZnLIZVFsofUnvaIhdUf72SsS90e3YTqgca7w0E3olVl8R7CTDTTRc/u3XB yntocSFdhAppI1ev3CFqh49uhEWTMzGcUobS+rabQLR+YIv4NnqJdPO6R+7fCkIEVxHg MzshTM+2IzCE7w9Bu8DzY58zs6xkjE0XhK5ZCfOw/z2PX5vDIHBKaX3qELWSqxdXLTN5 LjBuYwB3QCszA4UyoJaWmrvFaIaBBcO/+PW9zziCGFG9XajF2hGVzKmjKYIRS1aTHBT9 2h+bLr4fe90VKnV6oCdphKO7FmSmrv7oqf9omTJbma45fnLwX9boXVRlH77QFQNnsdQ5 GXmA== X-Gm-Message-State: AGi0PuYBhHmJBbqZ0l9rY6UOAHm6cDz2EsdN42ZGMd0NOj6Z4GGLzbZb o4qfUenV7zjsrclsKHAwTcc= X-Received: by 2002:ad4:49c1:: with SMTP id j1mr3225948qvy.144.1588796501200; Wed, 06 May 2020 13:21:41 -0700 (PDT) Received: from quaco.ghostprotocols.net ([179.97.37.151]) by smtp.gmail.com with ESMTPSA id y185sm2560874qkd.29.2020.05.06.13.21.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 May 2020 13:21:40 -0700 (PDT) From: Arnaldo Carvalho de Melo X-Google-Original-From: Arnaldo Carvalho de Melo Received: by quaco.ghostprotocols.net (Postfix, from userid 1000) id 5B848409A3; Wed, 6 May 2020 17:21:38 -0300 (-03) Date: Wed, 6 May 2020 17:21:38 -0300 To: Alexey Budankov Cc: Jiri Olsa , Namhyung Kim , Alexander Shishkin , Peter Zijlstra , Ingo Molnar , Andi Kleen , linux-kernel Subject: Re: [PATCH v2 02/11] perf evlist: implement control command handling functions Message-ID: <20200506202138.GF9893@kernel.org> References: <142da58d-7ff1-ea73-89e0-30342a710aab@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <142da58d-7ff1-ea73-89e0-30342a710aab@linux.intel.com> X-Url: http://acmel.wordpress.com Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Wed, May 06, 2020 at 09:19:22PM +0300, Alexey Budankov escreveu: > > Implement functions of initialization, finalization and processing > of control commands coming from control file descriptors. > > Signed-off-by: Alexey Budankov > --- > tools/perf/util/evlist.c | 100 +++++++++++++++++++++++++++++++++++++++ > tools/perf/util/evlist.h | 12 +++++ > 2 files changed, 112 insertions(+) > > diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c > index 2db4bedc4f81..e086c846ef3a 100644 > --- a/tools/perf/util/evlist.c > +++ b/tools/perf/util/evlist.c > @@ -1707,3 +1707,103 @@ struct evsel *perf_evlist__reset_weak_group(struct evlist *evsel_list, > } > return leader; > } > + > +int perf_evlist__initialize_ctlfd(struct evlist *evlist, int ctl_fd, int ctl_fd_ack) > +{ > + if (ctl_fd == -1) { > + pr_debug("Control descriptor is not initialized\n"); > + return 0; > + } > + > + evlist->ctl_fd_pos = perf_evlist__add_pollfd(&evlist->core, ctl_fd, NULL, POLLIN); > + if (evlist->ctl_fd_pos < 0) { > + evlist->ctl_fd_pos = -1; > + pr_err("Failed to add ctl fd entry: %m\n"); > + return -1; > + } > + > + evlist->ctl_fd = ctl_fd; > + evlist->ctl_fd_ack = ctl_fd_ack; > + > + return 0; > +} > + > +int perf_evlist__finalize_ctlfd(struct evlist *evlist) > +{ > + if (evlist->ctl_fd_pos == -1) > + return 0; > + > + evlist->core.pollfd.entries[evlist->ctl_fd_pos].fd = -1; > + evlist->ctl_fd_pos = -1; > + evlist->ctl_fd_ack = -1; > + evlist->ctl_fd = -1; > + > + return 0; > +} > + > +static int perf_evlist__ctlfd_recv(struct evlist *evlist, enum evlist_ctl_cmd *cmd) > +{ > + int err; > + char buf[2]; > + > + err = read(evlist->ctl_fd, &buf, sizeof(buf)); > + if (err > 0) > + *cmd = buf[0]; > + else if (err == -1) > + pr_err("Failed to read from ctlfd %d: %m\n", evlist->ctl_fd); > + > + return err; > +} > + > +static int perf_evlist__ctlfd_ack(struct evlist *evlist) > +{ > + int err; > + char buf[2] = {CTL_CMD_ACK, '\n'}; > + > + if (evlist->ctl_fd_ack == -1) > + return 0; > + > + err = write(evlist->ctl_fd_ack, buf, sizeof(buf)); > + if (err == -1) > + pr_err("failed to write to ctl_ack_fd %d: %m\n", evlist->ctl_fd_ack); > + > + return err; > +} > + > +int perf_evlist__ctlfd_process(struct evlist *evlist, enum evlist_ctl_cmd *cmd) > +{ > + int err = 0; > + int ctlfd_pos = evlist->ctl_fd_pos; > + struct pollfd *entries = evlist->core.pollfd.entries; > + > + if (!entries[ctlfd_pos].revents) > + return 0; > + > + if (entries[ctlfd_pos].revents & POLLIN) { > + err = perf_evlist__ctlfd_recv(evlist, cmd); > + if (err > 0) { > + switch (*cmd) { > + case CTL_CMD_ENABLE: > + evlist__enable(evlist); > + break; > + case CTL_CMD_DISABLE: > + evlist__disable(evlist); > + break; > + case CTL_CMD_ACK: > + case CTL_CMD_UNSUPPORTED: > + default: > + pr_debug("ctlfd: unsupported %d\n", *cmd); > + break; > + } > + if (!(*cmd == CTL_CMD_ACK || *cmd == CTL_CMD_UNSUPPORTED)) > + perf_evlist__ctlfd_ack(evlist); > + } > + } > + > + if (entries[ctlfd_pos].revents & (POLLHUP | POLLERR)) > + perf_evlist__finalize_ctlfd(evlist); > + else > + entries[ctlfd_pos].revents = 0; > + > + return err; > +} > diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h > index 62f259d89b41..84386850c290 100644 > --- a/tools/perf/util/evlist.h > +++ b/tools/perf/util/evlist.h > @@ -358,4 +358,16 @@ void perf_evlist__force_leader(struct evlist *evlist); > struct evsel *perf_evlist__reset_weak_group(struct evlist *evlist, > struct evsel *evsel, > bool close); > + > +enum evlist_ctl_cmd { > + CTL_CMD_UNSUPPORTED = 0, > + CTL_CMD_ENABLE = 'e', > + CTL_CMD_DISABLE = 'd', > + CTL_CMD_ACK = 'a' > +}; Can we make this a string, I think we'll eventually ask for lots more stuff, like asking for a --switch-output snapshot with --overwrite, reconfiguring events to increase/decrease frequency, etc, interfacing with PERF_EVENT_IOC_MODIFY_ATTRIBUTES, PERF_EVENT_IOC_SET_FILTER, etc. This will also allow us to have parameters, etc, wdyt? Also please since these are events that deal with 'struct evlist', name them with the evlist__ prefix, not the perf_evlist__ one, as those should be used with 'struct perf_evlist', i.e. the one in libperf (tools/lib/perf/). Right now this is inconsistent, we did it that way to minimize disruption of the codebase when moving things from tools/perf/ to tools/lib/perf/, but this confuses things and I just did a s/perf_evsel__/evsel__) for things dealing with 'struct evsel', so lets not add new ones with the wrong prefix, eventually we'll have perf_ only for things in libperf. > + > +int perf_evlist__initialize_ctlfd(struct evlist *evlist, int ctl_fd, int ctl_fd_ack); > +int perf_evlist__finalize_ctlfd(struct evlist *evlist); > +int perf_evlist__ctlfd_process(struct evlist *evlist, enum evlist_ctl_cmd *cmd); > + > #endif /* __PERF_EVLIST_H */ > -- > 2.24.1 > > -- - Arnaldo