All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@kernel.org>
To: John Stultz <jstultz@google.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	 Stephen Boyd <sboyd@kernel.org>,
	Alexander Viro <viro@zeniv.linux.org.uk>,
	 Christian Brauner <brauner@kernel.org>, Jan Kara <jack@suse.cz>,
	 Steven Rostedt <rostedt@goodmis.org>,
	 Masami Hiramatsu <mhiramat@kernel.org>,
	 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
	 Jonathan Corbet <corbet@lwn.net>,
	Randy Dunlap <rdunlap@infradead.org>,
	 Chandan Babu R <chandan.babu@oracle.com>,
	 "Darrick J. Wong" <djwong@kernel.org>,
	Theodore Ts'o <tytso@mit.edu>,
	 Andreas Dilger <adilger.kernel@dilger.ca>,
	Chris Mason <clm@fb.com>,  Josef Bacik <josef@toxicpanda.com>,
	David Sterba <dsterba@suse.com>,  Hugh Dickins <hughd@google.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	 Chuck Lever <chuck.lever@oracle.com>,
	 Vadim Fedorenko <vadim.fedorenko@linux.dev>
Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	 linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org,
	 linux-xfs@vger.kernel.org, linux-ext4@vger.kernel.org,
	 linux-btrfs@vger.kernel.org, linux-nfs@vger.kernel.org,
	linux-mm@kvack.org,  Jeff Layton <jlayton@kernel.org>
Subject: [PATCH v9 07/12] timekeeping: add percpu counter for tracking floor swap events
Date: Wed, 02 Oct 2024 14:49:35 -0400	[thread overview]
Message-ID: <20241002-mgtime-v9-7-77e2baad57ac@kernel.org> (raw)
In-Reply-To: <20241002-mgtime-v9-0-77e2baad57ac@kernel.org>

The mgtime_floor value is a global variable for tracking the latest
fine-grained timestamp handed out. Because it's a global, track the
number of times that a new floor value is assigned.

Add a new percpu counter to the timekeeping code to track the number of
floor swap events that have occurred. Display that as a fourth integer
in /sys/kernel/debug/multigrain_timestamps.

Tested-by: Randy Dunlap <rdunlap@infradead.org> # documentation bits
Signed-off-by: Jeff Layton <jlayton@kernel.org>
---
 fs/inode.c                         |  5 +++--
 include/linux/timekeeping.h        |  1 +
 kernel/time/timekeeping.c          |  1 +
 kernel/time/timekeeping_debug.c    | 13 +++++++++++++
 kernel/time/timekeeping_internal.h |  9 +++++++++
 5 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/fs/inode.c b/fs/inode.c
index 0223f8ec3cfb..1edac9ab1ecc 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -145,9 +145,10 @@ static int mgts_show(struct seq_file *s, void *p)
 	unsigned long ctime_updates = get_mg_ctime_updates();
 	unsigned long ctime_swaps = get_mg_ctime_swaps();
 	unsigned long fine_stamps = get_mg_fine_stamps();
+	unsigned long floor_swaps = timekeeping_get_mg_floor_swaps();
 
-	seq_printf(s, "%lu %lu %lu\n",
-		   ctime_updates, ctime_swaps, fine_stamps);
+	seq_printf(s, "%lu %lu %lu %lu\n",
+		   ctime_updates, ctime_swaps, fine_stamps, floor_swaps);
 	return 0;
 }
 
diff --git a/include/linux/timekeeping.h b/include/linux/timekeeping.h
index 7aa85246c183..84a035e86ac8 100644
--- a/include/linux/timekeeping.h
+++ b/include/linux/timekeeping.h
@@ -48,6 +48,7 @@ extern void ktime_get_coarse_real_ts64(struct timespec64 *ts);
 /* Multigrain timestamp interfaces */
 extern void ktime_get_coarse_real_ts64_mg(struct timespec64 *ts);
 extern void ktime_get_real_ts64_mg(struct timespec64 *ts);
+extern unsigned long timekeeping_get_mg_floor_swaps(void);
 
 void getboottime64(struct timespec64 *ts);
 
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index ebfe846ebde3..e8b713e8ce55 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -2488,6 +2488,7 @@ void ktime_get_real_ts64_mg(struct timespec64 *ts)
 	if (atomic64_try_cmpxchg(&mg_floor, &old, mono)) {
 		ts->tv_nsec = 0;
 		timespec64_add_ns(ts, nsecs);
+		timekeeping_inc_mg_floor_swaps();
 	} else {
 		/*
 		 * Another task changed mg_floor since "old" was fetched.
diff --git a/kernel/time/timekeeping_debug.c b/kernel/time/timekeeping_debug.c
index b73e8850e58d..b731621ad811 100644
--- a/kernel/time/timekeeping_debug.c
+++ b/kernel/time/timekeeping_debug.c
@@ -17,6 +17,9 @@
 
 #define NUM_BINS 32
 
+/* incremented every time mg_floor is updated */
+DEFINE_PER_CPU(unsigned long, timekeeping_mg_floor_swaps);
+
 static unsigned int sleep_time_bin[NUM_BINS] = {0};
 
 static int tk_debug_sleep_time_show(struct seq_file *s, void *data)
@@ -53,3 +56,13 @@ void tk_debug_account_sleep_time(const struct timespec64 *t)
 			   (s64)t->tv_sec, t->tv_nsec / NSEC_PER_MSEC);
 }
 
+unsigned long timekeeping_get_mg_floor_swaps(void)
+{
+	int i;
+	unsigned long sum = 0;
+
+	for_each_possible_cpu(i)
+		sum += per_cpu(timekeeping_mg_floor_swaps, i);
+	return sum < 0 ? 0 : sum;
+}
+
diff --git a/kernel/time/timekeeping_internal.h b/kernel/time/timekeeping_internal.h
index 4ca2787d1642..f53e76d5ee7c 100644
--- a/kernel/time/timekeeping_internal.h
+++ b/kernel/time/timekeeping_internal.h
@@ -10,9 +10,18 @@
  * timekeeping debug functions
  */
 #ifdef CONFIG_DEBUG_FS
+DECLARE_PER_CPU(unsigned long, timekeeping_mg_floor_swaps);
+static inline void timekeeping_inc_mg_floor_swaps(void)
+{
+	this_cpu_inc(timekeeping_mg_floor_swaps);
+}
+
 extern void tk_debug_account_sleep_time(const struct timespec64 *t);
 #else
 #define tk_debug_account_sleep_time(x)
+static inline void timekeeping_inc_mg_floor_swaps(void)
+{
+}
 #endif
 
 #ifdef CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE

-- 
2.46.2


  parent reply	other threads:[~2024-10-02 18:50 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-02 18:49 [PATCH v9 00/12] fs: multigrain timestamp redux Jeff Layton
2024-10-02 18:49 ` [PATCH v9 01/12] timekeeping: add interfaces for handling timestamps with a floor value Jeff Layton
2024-10-02 18:49 ` [PATCH v9 02/12] fs: add infrastructure for multigrain timestamps Jeff Layton
2024-10-02 18:49 ` [PATCH v9 03/12] fs: have setattr_copy handle multigrain timestamps appropriately Jeff Layton
2024-10-02 18:49 ` [PATCH v9 04/12] fs: handle delegated timestamps in setattr_copy_mgtime Jeff Layton
2024-10-02 18:49 ` [PATCH v9 05/12] fs: tracepoints around multigrain timestamp events Jeff Layton
2024-10-02 18:49 ` [PATCH v9 06/12] fs: add percpu counters for significant " Jeff Layton
2024-10-02 18:49 ` Jeff Layton [this message]
2024-10-02 19:33   ` [PATCH v9 07/12] timekeeping: add percpu counter for tracking floor swap events Thomas Gleixner
2024-10-02 18:49 ` [PATCH v9 08/12] Documentation: add a new file documenting multigrain timestamps Jeff Layton
2024-10-04  4:49   ` Bagas Sanjaya
2024-10-02 18:49 ` [PATCH v9 09/12] xfs: switch to " Jeff Layton
2024-10-02 18:49 ` [PATCH v9 10/12] ext4: " Jeff Layton
2024-10-02 18:49 ` [PATCH v9 11/12] btrfs: convert " Jeff Layton
2024-10-02 18:49 ` [PATCH v9 12/12] tmpfs: add support for " Jeff Layton

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20241002-mgtime-v9-7-77e2baad57ac@kernel.org \
    --to=jlayton@kernel.org \
    --cc=adilger.kernel@dilger.ca \
    --cc=akpm@linux-foundation.org \
    --cc=brauner@kernel.org \
    --cc=chandan.babu@oracle.com \
    --cc=chuck.lever@oracle.com \
    --cc=clm@fb.com \
    --cc=corbet@lwn.net \
    --cc=djwong@kernel.org \
    --cc=dsterba@suse.com \
    --cc=hughd@google.com \
    --cc=jack@suse.cz \
    --cc=josef@toxicpanda.com \
    --cc=jstultz@google.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=linux-trace-kernel@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mhiramat@kernel.org \
    --cc=rdunlap@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=sboyd@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=tytso@mit.edu \
    --cc=vadim.fedorenko@linux.dev \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.