From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2EA0AC43217 for ; Thu, 17 Nov 2022 20:31:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240510AbiKQUbg (ORCPT ); Thu, 17 Nov 2022 15:31:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34836 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240269AbiKQUbM (ORCPT ); Thu, 17 Nov 2022 15:31:12 -0500 Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9697713E81 for ; Thu, 17 Nov 2022 12:29:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1668716985; x=1700252985; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=GSPLETnaolgpM0Ng/jT0nkyrwJsOnMaR9UYLk2NCP+w=; b=GFCz32xIE63coeZtGFMZ7/AC7U6uw9k3td2QHTen1KxYPBkFsJRiJEzA RIE/Xce4JJ4kNfZMaBVjp0tY8HOqhILS0H03bc01yq0DjHd0JiJIK4aaC 6McpGFGWVWWmETDga715NVznib7gztpxN+5SBv/0o6+nBp7V1o2QwktWm BPVNPqKoLoAGnVEMmghW3+Y87Cydyl1BTuDnCNp4ciXIPFqNIFJwmTJNE K0JSyPHMCBZ66NyiytungB7LPzhlTUCL9bXup+nE13o5EglsT9qv0Ra/c e1PiNkdJv/oo/EVy6t0SKw9R2ICEvR4S0LwpmkVN4S88oyomdl2OlKa1W w==; X-IronPort-AV: E=McAfee;i="6500,9779,10534"; a="300500544" X-IronPort-AV: E=Sophos;i="5.96,172,1665471600"; d="scan'208";a="300500544" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2022 12:29:44 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10534"; a="672951417" X-IronPort-AV: E=Sophos;i="5.96,172,1665471600"; d="scan'208";a="672951417" Received: from djiang5-mobl2.amr.corp.intel.com (HELO [10.213.166.194]) ([10.213.166.194]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2022 12:29:43 -0800 Message-ID: <61ddbc4e-2b2c-020e-b872-39d23e94ddb5@intel.com> Date: Thu, 17 Nov 2022 13:29:42 -0700 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0 Thunderbird/102.4.1 Subject: Re: [PATCH v4 05/10] cxl: add monitor function for event trace events Content-Language: en-US To: Steven Rostedt Cc: linux-cxl@vger.kernel.org, dan.j.williams@intel.com, ira.weiny@intel.com, vishal.l.verma@intel.com, alison.schofield@intel.com References: <166793212765.3768752.4370741471494095451.stgit@djiang5-desk3.ch.intel.com> <166793221692.3768752.18351228388707416243.stgit@djiang5-desk3.ch.intel.com> <20221117133743.67ecd167@gandalf.local.home> From: Dave Jiang In-Reply-To: <20221117133743.67ecd167@gandalf.local.home> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-cxl@vger.kernel.org On 11/17/2022 11:37 AM, Steven Rostedt wrote: > On Tue, 08 Nov 2022 11:30:16 -0700 > Dave Jiang wrote: > >> Add function that creates an event trace instance and utilize the cxl event >> trace common functions to extract interested events from the trace buffer. >> The monitoring function will pend on an epoll fd and wait for new events >> to appear in the trace buffer. >> >> Signed-off-by: Dave Jiang >> --- >> cxl/meson.build | 1 >> cxl/monitor.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 141 insertions(+) >> create mode 100644 cxl/monitor.c >> >> diff --git a/cxl/meson.build b/cxl/meson.build >> index c59876262e76..eb8b2b1070ed 100644 >> --- a/cxl/meson.build >> +++ b/cxl/meson.build >> @@ -8,6 +8,7 @@ cxl_src = [ >> 'json.c', >> 'filter.c', >> 'event_trace.c', >> + 'monitor.c', >> ] >> >> cxl_tool = executable('cxl', >> diff --git a/cxl/monitor.c b/cxl/monitor.c >> new file mode 100644 >> index 000000000000..c3f7e3639ec0 >> --- /dev/null >> +++ b/cxl/monitor.c >> @@ -0,0 +1,140 @@ >> +// SPDX-License-Identifier: GPL-2.0 >> +// Copyright (C) 2022, Intel Corp. All rights reserved. >> +/* Some bits copied from ndctl monitor code */ >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +/* reuse the core log helpers for the monitor logger */ >> +#ifndef ENABLE_LOGGING >> +#define ENABLE_LOGGING >> +#endif >> +#ifndef ENABLE_DEBUG >> +#define ENABLE_DEBUG >> +#endif >> +#include >> + >> +#include "event_trace.h" >> + >> +static const char *cxl_system = "cxl"; >> + >> +static struct monitor { >> + struct log_ctx ctx; >> + FILE *log_file; >> + bool human; >> +} monitor; >> + >> +static int monitor_event(struct cxl_ctx *ctx) >> +{ >> + int fd, epollfd, rc = 0, timeout = -1; >> + struct epoll_event ev, *events; >> + struct tracefs_instance *inst; >> + struct event_ctx ectx; >> + int jflag; >> + >> + events = calloc(1, sizeof(struct epoll_event)); >> + if (!events) { >> + err(&monitor, "alloc for events error\n"); >> + return -ENOMEM; >> + } >> + >> + epollfd = epoll_create1(0); >> + if (epollfd == -1) { >> + rc = -errno; >> + err(&monitor, "epoll_create1() error: %d\n", rc); >> + goto epoll_err; >> + } >> + >> + inst = tracefs_instance_create("cxl_monitor"); >> + if (!inst) { >> + rc = -errno; >> + err(&monitor, "tracefs_instance_create( failed: %d\n", rc); >> + goto inst_err; >> + } >> + >> + fd = tracefs_instance_file_open(inst, "trace_pipe", -1); > > FYI, libtracefs now has an API to read the raw trace file directly. > > https://www.trace-cmd.org/Documentation/libtracefs-doc/libtracefs-cpu.html > > as well iterate over the live stream: > > https://www.trace-cmd.org/Documentation/libtracefs-doc/libtracefs-iterator.html Hi Steve, After looking those over, I'm uncertain how the new APIs would apply here. I'm only using fd to the trace_pipe for epoll notification of new events for the instance. Otherwise I'm using tracefs_iterate_raw_events() to retrieve and parse the events. > > -- Steve > >> + if (fd < 0) { >> + rc = fd; >> + err(&monitor, "tracefs_instance_file_open() err: %d\n", rc); >> + goto inst_file_err; >> + } >> + >> + memset(&ev, 0, sizeof(ev)); >> + ev.events = EPOLLIN; >> + ev.data.fd = fd; >> + >> + if (epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev) != 0) { >> + rc = -errno; >> + err(&monitor, "epoll_ctl() error: %d\n", rc); >> + goto epoll_ctl_err; >> + } >> + >> + rc = cxl_event_tracing_enable(inst, cxl_system, NULL); >> + if (rc < 0) { >> + err(&monitor, "cxl_trace_event_enable() failed: %d\n", rc); >> + goto event_en_err; >> + } >> + >> + memset(&ectx, 0, sizeof(ectx)); >> + ectx.system = cxl_system; >> + if (monitor.human) >> + jflag = JSON_C_TO_STRING_PRETTY; >> + else >> + jflag = JSON_C_TO_STRING_PLAIN; >> + >> + while (1) { >> + struct jlist_node *jnode, *next; >> + >> + rc = epoll_wait(epollfd, events, 1, timeout); >> + if (rc < 0) { >> + rc = -errno; >> + if (errno != EINTR) >> + err(&monitor, "epoll_wait error: %d\n", -errno); >> + break; >> + } >> + >> + list_head_init(&ectx.jlist_head); >> + rc = cxl_parse_events(inst, &ectx); >> + if (rc < 0) >> + goto parse_err; >> + >> + if (list_empty(&ectx.jlist_head)) >> + continue; >> + >> + list_for_each_safe(&ectx.jlist_head, jnode, next, list) { >> + notice(&monitor, "%s\n", >> + json_object_to_json_string_ext(jnode->jobj, jflag)); >> + list_del(&jnode->list); >> + json_object_put(jnode->jobj); >> + free(jnode); >> + } >> + } >> + >> +parse_err: >> + rc = cxl_event_tracing_disable(inst); >> +event_en_err: >> +epoll_ctl_err: >> + close(fd); >> +inst_file_err: >> + tracefs_instance_free(inst); >> +inst_err: >> + close(epollfd); >> +epoll_err: >> + free(events); >> + return rc; >> +} >> >