From patchwork Wed Jul 3 05:32:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Masami Hiramatsu (Google)" X-Patchwork-Id: 13721410 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3EE16383B1; Wed, 3 Jul 2024 05:32:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719984775; cv=none; b=VDscg7ntUonNNwaQ0BuO7sAsZRQJ7X2hny2ln8z+5uCgy4XcIUW+ZJ1dTxrkMpKlny5YHYgKUFCG6nMpC8c/9bMrsjBKFdMVkPvizrVOYOP/Apur2hnhfNkrV+on8d3lA3hqEhWhWsF7G5NGRgwn5dhgb2Qw1h+PxWdV1MGDdf0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719984775; c=relaxed/simple; bh=WULNwgwERPKbPxbI+UaCGX2Ay60pymtdMlPiYvx3DeU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=F6tahv5nYKzAFA1r1/on/u3nJ7wEEn8AoEV+tzqVvoZ4o2+FmlLpYFv9T/jEEaY4Laqmt0KAmxMQkXfhDeQ2lUnOol3T9361v8bAI31Q3VXM7NbRS+s/RM7D0hQNqmp9FnHlnEmeWRPjvWhpEuqLjY+J29u/JWkYA+w2YIeyb30= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KgBCHXuj; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="KgBCHXuj" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E6A7EC32781; Wed, 3 Jul 2024 05:32:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1719984774; bh=WULNwgwERPKbPxbI+UaCGX2Ay60pymtdMlPiYvx3DeU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KgBCHXujA8Q/s4vtuumqlicoQBkopCAtrz5CpZ0yBW24UnSaDLxOShYhHtzRqOxuD sMrcY4VgIFXLbaKsYbtDsYiADzEARwwJ078znf8hetQmk/hndmmc6Jfaa/Qmpx6kTd YLYlG3Aj63SB7h7gKbIqiPAL5kZj+G++I4MHzN6Mc/eId4BaMea1OoNFBnhA8lDdsg allkCMwqOv4J6ZVb98vjoyKVXCcCDPEjH4cSU+5fIQwzGHPj2t80gAP6XB2zQNNcGG H7QXZO8tnCKRpPx/vwdoUjArow/OocsUQP2Pl2EzZs3bnVWLRBhYZB4LoLFFRK7pd2 3zLZj8+RqLr1w== From: "Masami Hiramatsu (Google)" To: Steven Rostedt , Shuah Khan Cc: Masami Hiramatsu , Tom Zanussi , Mathieu Desnoyers , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH v2 2/3] tracing/hist: Support POLLPRI event for poll on histogram Date: Wed, 3 Jul 2024 14:32:50 +0900 Message-Id: <171998477066.54594.13188592197265452865.stgit@devnote2> X-Mailer: git-send-email 2.34.1 In-Reply-To: <171998475175.54594.7244942110355338359.stgit@devnote2> References: <171998475175.54594.7244942110355338359.stgit@devnote2> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Masami Hiramatsu (Google) Since POLLIN will not be flashed until read the hist file, user needs to repeat read() and poll() on hist for monitoring the event continuously. But the read() is somewhat redundant only for monitoring events. This add POLLPRI poll event on hist, this event returns when a histogram is updated after open(), poll() or read(). Thus it is possible to wait next event without read(). Signed-off-by: Masami Hiramatsu (Google) Reviewed-by: Tom Zanussi --- kernel/trace/trace_events_hist.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c index 136d91139949..a22454ad36d8 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -5599,6 +5599,7 @@ static void hist_trigger_show(struct seq_file *m, struct hist_file_data { struct file *file; u64 last_read; + u64 last_act; }; static u64 get_hist_hit_count(struct trace_event_file *event_file) @@ -5636,6 +5637,11 @@ static int hist_show(struct seq_file *m, void *v) hist_trigger_show(m, data, n++); } hist_file->last_read = get_hist_hit_count(event_file); + /* + * Update last_act too so that poll()/POLLPRI can wait for the next + * event after any syscall on hist file. + */ + hist_file->last_act = hist_file->last_read; out_unlock: mutex_unlock(&event_mutex); @@ -5649,6 +5655,7 @@ static __poll_t event_hist_poll(struct file *file, struct poll_table_struct *wai struct seq_file *m = file->private_data; struct hist_file_data *hist_file = m->private; __poll_t ret = 0; + u64 cnt; mutex_lock(&event_mutex); @@ -5660,8 +5667,13 @@ static __poll_t event_hist_poll(struct file *file, struct poll_table_struct *wai poll_wait(file, &event_file->hist_wq, wait); - if (hist_file->last_read != get_hist_hit_count(event_file)) - ret = EPOLLIN | EPOLLRDNORM; + cnt = get_hist_hit_count(event_file); + if (hist_file->last_read != cnt) + ret |= EPOLLIN | EPOLLRDNORM; + if (hist_file->last_act != cnt) { + hist_file->last_act = cnt; + ret |= EPOLLPRI; + } out_unlock: mutex_unlock(&event_mutex); @@ -5680,6 +5692,7 @@ static int event_hist_release(struct inode *inode, struct file *file) static int event_hist_open(struct inode *inode, struct file *file) { + struct trace_event_file *event_file; struct hist_file_data *hist_file; int ret; @@ -5690,13 +5703,25 @@ static int event_hist_open(struct inode *inode, struct file *file) hist_file = kzalloc(sizeof(*hist_file), GFP_KERNEL); if (!hist_file) return -ENOMEM; + + mutex_lock(&event_mutex); + event_file = event_file_data(file); + if (!event_file) { + ret = -ENODEV; + goto out_unlock; + } + hist_file->file = file; + hist_file->last_act = get_hist_hit_count(event_file); /* Clear private_data to avoid warning in single_open() */ file->private_data = NULL; ret = single_open(file, hist_show, hist_file); + +out_unlock: if (ret) kfree(hist_file); + mutex_unlock(&event_mutex); return ret; }