* Re: [PATCH 12/61] nfsd: update format strings for u64 i_ino
From: Chuck Lever @ 2026-02-26 19:48 UTC (permalink / raw)
To: Jeff Layton, Alexander Viro, Christian Brauner, Jan Kara,
Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers, Dan Williams,
Matthew Wilcox, Eric Biggers, Theodore Y. Ts'o, Muchun Song,
Oscar Salvador, David Hildenbrand, David Howells, Paulo Alcantara,
Andreas Dilger, Jan Kara, Jaegeuk Kim, Chao Yu, Trond Myklebust,
Anna Schumaker, NeilBrown, Olga Kornievskaia, Dai Ngo, Tom Talpey,
Steve French, Ronnie Sahlberg, Shyam Prasad N, Bharath SM,
Alexander Aring, Ryusuke Konishi, Viacheslav Dubeyko,
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, David Sterba, Marc Dionne, Ian Kent,
Luis de Bethencourt, Salah Triki, Tigran A. Aivazian,
Ilya Dryomov, Alex Markuze, Jan Harkes, coda, Nicolas Pitre,
Tyler Hicks, Amir Goldstein, Christoph Hellwig,
John Paul Adrian Glaubitz, Yangtao Li, Mikulas Patocka,
David Woodhouse, Richard Weinberger, Dave Kleikamp,
Konstantin Komarov, Mark Fasheh, Joel Becker, Joseph Qi,
Mike Marshall, Martin Brandenburg, Miklos Szeredi, Anders Larsen,
Zhihao Cheng, Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
John Johansen, Paul Moore, James Morris, Serge E. Hallyn,
Mimi Zohar, Roberto Sassu, Dmitry Kasatkin, Eric Snowberg, Fan Wu,
Stephen Smalley, Ondrej Mosnacek, Casey Schaufler, Alex Deucher,
Christian König, David Airlie, Simona Vetter, Sumit Semwal,
Eric Dumazet, Kuniyuki Iwashima, Paolo Abeni, Willem de Bruijn,
David S. Miller, Jakub Kicinski, Simon Horman, Oleg Nesterov,
Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, James Clark, Darrick J. Wong,
Martin Schiller
Cc: linux-fsdevel, linux-kernel, linux-trace-kernel, nvdimm, fsverity,
linux-mm, netfs, linux-ext4, linux-f2fs-devel, linux-nfs,
linux-cifs, samba-technical, linux-nilfs, v9fs, linux-afs, autofs,
ceph-devel, codalist, ecryptfs, linux-mtd, jfs-discussion, ntfs3,
ocfs2-devel, devel, linux-unionfs, apparmor,
linux-security-module, linux-integrity, selinux, amd-gfx,
dri-devel, linux-media, linaro-mm-sig, netdev, linux-perf-users,
linux-fscrypt, linux-xfs, linux-hams, linux-x25
In-Reply-To: <20260226-iino-u64-v1-12-ccceff366db9@kernel.org>
On 2/26/26 10:55 AM, Jeff Layton wrote:
> Update format strings from %ld/%lu to %lld/%llu for i_ino, which is
> now a u64.
>
> Signed-off-by: Jeff Layton <jlayton@kernel.org>
> ---
> fs/nfsd/export.c | 2 +-
> fs/nfsd/nfs4state.c | 4 ++--
> fs/nfsd/nfsfh.c | 4 ++--
> fs/nfsd/vfs.c | 2 +-
> 4 files changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c
> index 8fdbba7cad96443d92cc7fdeea6158c4cc681be1..334b63eb966e71e6af6adde61aa1123f01b4390b 100644
> --- a/fs/nfsd/export.c
> +++ b/fs/nfsd/export.c
> @@ -1039,7 +1039,7 @@ exp_rootfh(struct net *net, struct auth_domain *clp, char *name,
> }
> inode = d_inode(path.dentry);
>
> - dprintk("nfsd: exp_rootfh(%s [%p] %s:%s/%ld)\n",
> + dprintk("nfsd: exp_rootfh(%s [%p] %s:%s/%lld)\n",
> name, path.dentry, clp->name,
> inode->i_sb->s_id, inode->i_ino);
> exp = exp_parent(cd, clp, &path);
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index 6b9c399b89dfb71a52b9c97f0efe9a1dea0558a6..a569d89ac9123d66bb47e7d74c7c98610de21da2 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -1253,7 +1253,7 @@ static void nfsd4_finalize_deleg_timestamps(struct nfs4_delegation *dp, struct f
> if (ret) {
> struct inode *inode = file_inode(f);
>
> - pr_notice_ratelimited("nfsd: Unable to update timestamps on inode %02x:%02x:%lu: %d\n",
> + pr_notice_ratelimited("nfsd: Unable to update timestamps on inode %02x:%02x:%llu: %d\n",
> MAJOR(inode->i_sb->s_dev),
> MINOR(inode->i_sb->s_dev),
> inode->i_ino, ret);
> @@ -2888,7 +2888,7 @@ static void nfs4_show_superblock(struct seq_file *s, struct nfsd_file *f)
> {
> struct inode *inode = file_inode(f->nf_file);
>
> - seq_printf(s, "superblock: \"%02x:%02x:%ld\"",
> + seq_printf(s, "superblock: \"%02x:%02x:%llu\"",
> MAJOR(inode->i_sb->s_dev),
> MINOR(inode->i_sb->s_dev),
> inode->i_ino);
> diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c
> index ed85dd43da18e6d4c4667ff14dc035f2eacff1d6..cfd143b41eb1fb53868f378d668905c1c7d5f868 100644
> --- a/fs/nfsd/nfsfh.c
> +++ b/fs/nfsd/nfsfh.c
> @@ -601,9 +601,9 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry,
> struct inode * inode = d_inode(dentry);
> dev_t ex_dev = exp_sb(exp)->s_dev;
>
> - dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %pd2, ino=%ld)\n",
> + dprintk("nfsd: fh_compose(exp %02x:%02x/%lld %pd2, ino=%lld)\n",
> MAJOR(ex_dev), MINOR(ex_dev),
> - (long) d_inode(exp->ex_path.dentry)->i_ino,
> + (long long) d_inode(exp->ex_path.dentry)->i_ino,
> dentry,
> (inode ? inode->i_ino : 0));
>
> diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
> index c884c3f34afb044ee5cacc962a04a97de2f7fd88..dde09f3734c2844a3fe0b6d18d596276a19aa2d1 100644
> --- a/fs/nfsd/vfs.c
> +++ b/fs/nfsd/vfs.c
> @@ -1163,7 +1163,7 @@ nfsd_direct_read(struct svc_rqst *rqstp, struct svc_fh *fhp,
> } else if (unlikely(host_err == -EINVAL)) {
> struct inode *inode = d_inode(fhp->fh_dentry);
>
> - pr_info_ratelimited("nfsd: Direct I/O alignment failure on %s/%ld\n",
> + pr_info_ratelimited("nfsd: Direct I/O alignment failure on %s/%lld\n",
> inode->i_sb->s_id, inode->i_ino);
> host_err = -ESERVERFAULT;
> }
>
Suggestion: Let's use the %llu format specifier consistently for
inode->i_ino, which is unsigned.
Reviewed-by: Chuck Lever <chuck.lever@oracle.com>
--
Chuck Lever
^ permalink raw reply
* Re: [PATCH 17/61] nilfs2: update for u64 i_ino
From: Viacheslav Dubeyko @ 2026-02-26 19:46 UTC (permalink / raw)
To: david@kernel.org, namhyung@kernel.org, oleg@redhat.com,
anna@kernel.org, ms@dev.tdt.de,
alexander.shishkin@linux.intel.com, jack@suse.cz,
ebiggers@kernel.org, Ondrej Mosnacek, mark.rutland@arm.com,
casey@schaufler-ca.com, glaubitz@physik.fu-berlin.de,
miklos@szeredi.hu, sumit.semwal@linaro.org,
john.johansen@canonical.com, amir73il@gmail.com,
slava@dubeyko.com, willy@infradead.org, tytso@mit.edu,
asmadeus@codewreck.org, jth@kernel.org, shaggy@kernel.org,
serge@hallyn.com, jaharkes@cs.cmu.edu, jlayton@kernel.org,
trondmy@kernel.org, jolsa@kernel.org, ericvh@kernel.org,
simona@ffwll.ch, willemb@google.com, aivazian.tigran@gmail.com,
hubcap@omnibond.com, muchun.song@linux.dev, sfrench@samba.org,
neil@brown.name, jmorris@namei.org, jlbec@evilplan.org,
chuck.lever@oracle.com, ronniesahlberg@gmail.com,
lucho@ionkov.net, dan.j.williams@intel.com, raven@themaw.net,
Alex Markuze, mhiramat@kernel.org, alexander.deucher@amd.com,
mathieu.desnoyers@efficios.com, horms@kernel.org, tom@talpey.com,
mark@fasheh.com, mikulas@artax.karlin.mff.cuni.cz,
djwong@kernel.org, edumazet@google.com, Olga Kornievskaia,
bharathsm@microsoft.com, adrian.hunter@intel.com,
osalvador@suse.de, peterz@infradead.org, christian.koenig@amd.com,
pc@manguebit.org, martin@omnibond.com, naohiro.aota@wdc.com,
frank.li@vivo.com, dsterba@suse.com, zohar@linux.ibm.com,
code@tyhicks.com, dwmw2@infradead.org, kuba@kernel.org,
kuniyu@google.com, nico@fluxnic.net, jack@suse.com,
dlemoal@kernel.org, viro@zeniv.linux.org.uk,
stephen.smalley.work@gmail.com, salah.triki@gmail.com,
David Howells, paul@paul-moore.com, luisbg@kernel.org,
irogers@google.com, acme@kernel.org, richard@nod.at,
rostedt@goodmis.org, idryomov@gmail.com,
joseph.qi@linux.alibaba.com, al@alarsen.net,
james.clark@linaro.org, dmitry.kasatkin@gmail.com,
roberto.sassu@huawei.com, konishi.ryusuke@gmail.com,
sprasad@microsoft.com, jaegeuk@kernel.org,
linux_oss@crudebyte.com, brauner@kernel.org, Dai.Ngo@oracle.com,
eric.snowberg@oracle.com, adilger.kernel@dilger.ca,
chao@kernel.org, wufan@kernel.org, coda@cs.cmu.edu, Ingo Molnar,
alex.aring@gmail.com, airlied@gmail.com, chengzhihao1@huawei.com,
Paolo Abeni, marc.dionne@auristor.com,
almaz.alexandrovich@paragon-software.com, davem@davemloft.net,
hch@infradead.org
Cc: ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org,
apparmor@lists.ubuntu.com, linux-ext4@vger.kernel.org,
autofs@vger.kernel.org, amd-gfx@lists.freedesktop.org,
fsverity@lists.linux.dev, ntfs3@lists.linux.dev,
ocfs2-devel@lists.linux.dev, linux-fsdevel@vger.kernel.org,
linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, linux-integrity@vger.kernel.org,
samba-technical@lists.samba.org, linux-nilfs@vger.kernel.org,
selinux@vger.kernel.org, linaro-mm-sig@lists.linaro.org,
linux-trace-kernel@vger.kernel.org, v9fs@lists.linux.dev,
linux-xfs@vger.kernel.org, linux-x25@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net, nvdimm@lists.linux.dev,
ceph-devel@vger.kernel.org, jfs-discussion@lists.sourceforge.net,
linux-mtd@lists.infradead.org, devel@lists.orangefs.org,
linux-afs@lists.infradead.org, linux-fscrypt@vger.kernel.org,
linux-security-module@vger.kernel.org, linux-cifs@vger.kernel.org,
linux-hams@vger.kernel.org, linux-nfs@vger.kernel.org,
codalist@coda.cs.cmu.edu, linux-mm@kvack.org,
netfs@lists.linux.dev, linux-perf-users@vger.kernel.org,
dri-devel@lists.freedesktop.org
In-Reply-To: <20260226-iino-u64-v1-17-ccceff366db9@kernel.org>
On Thu, 2026-02-26 at 10:55 -0500, Jeff Layton wrote:
> Update nilfs2 trace events and filesystem code for u64 i_ino:
>
> - Change __field(ino_t, ...) to __field(u64, ...) in trace events
> - Update format strings from %lu to %llu
> - Cast to (unsigned long long) in TP_printk
>
> Signed-off-by: Jeff Layton <jlayton@kernel.org>
> ---
> fs/nilfs2/alloc.c | 10 +++++-----
> fs/nilfs2/bmap.c | 2 +-
> fs/nilfs2/btnode.c | 2 +-
> fs/nilfs2/btree.c | 12 ++++++------
> fs/nilfs2/dir.c | 12 ++++++------
> fs/nilfs2/direct.c | 4 ++--
> fs/nilfs2/gcinode.c | 2 +-
> fs/nilfs2/inode.c | 8 ++++----
> fs/nilfs2/mdt.c | 2 +-
> fs/nilfs2/namei.c | 2 +-
> fs/nilfs2/segment.c | 2 +-
> include/trace/events/nilfs2.h | 12 ++++++------
> 12 files changed, 35 insertions(+), 35 deletions(-)
>
> diff --git a/fs/nilfs2/alloc.c b/fs/nilfs2/alloc.c
> index e7eebb04f9a4080a39f17d4123e58ed7df6b2f4b..7b1cd2baefcf21e54f9260845b02c7c95c148c64 100644
> --- a/fs/nilfs2/alloc.c
> +++ b/fs/nilfs2/alloc.c
> @@ -707,7 +707,7 @@ void nilfs_palloc_commit_free_entry(struct inode *inode,
>
> if (!nilfs_clear_bit_atomic(lock, group_offset, bitmap))
> nilfs_warn(inode->i_sb,
> - "%s (ino=%lu): entry number %llu already freed",
> + "%s (ino=%llu): entry number %llu already freed",
> __func__, inode->i_ino,
> (unsigned long long)req->pr_entry_nr);
> else
> @@ -748,7 +748,7 @@ void nilfs_palloc_abort_alloc_entry(struct inode *inode,
>
> if (!nilfs_clear_bit_atomic(lock, group_offset, bitmap))
> nilfs_warn(inode->i_sb,
> - "%s (ino=%lu): entry number %llu already freed",
> + "%s (ino=%llu): entry number %llu already freed",
> __func__, inode->i_ino,
> (unsigned long long)req->pr_entry_nr);
> else
> @@ -861,7 +861,7 @@ int nilfs_palloc_freev(struct inode *inode, __u64 *entry_nrs, size_t nitems)
> if (!nilfs_clear_bit_atomic(lock, group_offset,
> bitmap)) {
> nilfs_warn(inode->i_sb,
> - "%s (ino=%lu): entry number %llu already freed",
> + "%s (ino=%llu): entry number %llu already freed",
> __func__, inode->i_ino,
> (unsigned long long)entry_nrs[j]);
> } else {
> @@ -906,7 +906,7 @@ int nilfs_palloc_freev(struct inode *inode, __u64 *entry_nrs, size_t nitems)
> last_nrs[k]);
> if (ret && ret != -ENOENT)
> nilfs_warn(inode->i_sb,
> - "error %d deleting block that object (entry=%llu, ino=%lu) belongs to",
> + "error %d deleting block that object (entry=%llu, ino=%llu) belongs to",
> ret, (unsigned long long)last_nrs[k],
> inode->i_ino);
> }
> @@ -923,7 +923,7 @@ int nilfs_palloc_freev(struct inode *inode, __u64 *entry_nrs, size_t nitems)
> ret = nilfs_palloc_delete_bitmap_block(inode, group);
> if (ret && ret != -ENOENT)
> nilfs_warn(inode->i_sb,
> - "error %d deleting bitmap block of group=%lu, ino=%lu",
> + "error %d deleting bitmap block of group=%lu, ino=%llu",
> ret, group, inode->i_ino);
> }
> }
> diff --git a/fs/nilfs2/bmap.c b/fs/nilfs2/bmap.c
> index ccc1a7aa52d2064d56b826058554264c498d592f..824f2bd91c167965ec3a660202b6e6c5f1fe007e 100644
> --- a/fs/nilfs2/bmap.c
> +++ b/fs/nilfs2/bmap.c
> @@ -33,7 +33,7 @@ static int nilfs_bmap_convert_error(struct nilfs_bmap *bmap,
>
> if (err == -EINVAL) {
> __nilfs_error(inode->i_sb, fname,
> - "broken bmap (inode number=%lu)", inode->i_ino);
> + "broken bmap (inode number=%llu)", inode->i_ino);
> err = -EIO;
> }
> return err;
> diff --git a/fs/nilfs2/btnode.c b/fs/nilfs2/btnode.c
> index 56836712909201775907483887e8a0022851bbec..2e553d698d0f3980de98fced415dfd819ddbca0a 100644
> --- a/fs/nilfs2/btnode.c
> +++ b/fs/nilfs2/btnode.c
> @@ -64,7 +64,7 @@ nilfs_btnode_create_block(struct address_space *btnc, __u64 blocknr)
> * clearing of an abandoned b-tree node is missing somewhere).
> */
> nilfs_error(inode->i_sb,
> - "state inconsistency probably due to duplicate use of b-tree node block address %llu (ino=%lu)",
> + "state inconsistency probably due to duplicate use of b-tree node block address %llu (ino=%llu)",
> (unsigned long long)blocknr, inode->i_ino);
> goto failed;
> }
> diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c
> index dd0c8e560ef6a2c96515025321914e0d73f41144..3c03f5a741d144d22d1ffb5acf43a035e88c00dc 100644
> --- a/fs/nilfs2/btree.c
> +++ b/fs/nilfs2/btree.c
> @@ -353,7 +353,7 @@ static int nilfs_btree_node_broken(const struct nilfs_btree_node *node,
> nchildren <= 0 ||
> nchildren > NILFS_BTREE_NODE_NCHILDREN_MAX(size))) {
> nilfs_crit(inode->i_sb,
> - "bad btree node (ino=%lu, blocknr=%llu): level = %d, flags = 0x%x, nchildren = %d",
> + "bad btree node (ino=%llu, blocknr=%llu): level = %d, flags = 0x%x, nchildren = %d",
> inode->i_ino, (unsigned long long)blocknr, level,
> flags, nchildren);
> ret = 1;
> @@ -384,7 +384,7 @@ static int nilfs_btree_root_broken(const struct nilfs_btree_node *node,
> nchildren > NILFS_BTREE_ROOT_NCHILDREN_MAX ||
> (nchildren == 0 && level > NILFS_BTREE_LEVEL_NODE_MIN))) {
> nilfs_crit(inode->i_sb,
> - "bad btree root (ino=%lu): level = %d, flags = 0x%x, nchildren = %d",
> + "bad btree root (ino=%llu): level = %d, flags = 0x%x, nchildren = %d",
> inode->i_ino, level, flags, nchildren);
> ret = 1;
> }
> @@ -453,7 +453,7 @@ static int nilfs_btree_bad_node(const struct nilfs_bmap *btree,
> if (unlikely(nilfs_btree_node_get_level(node) != level)) {
> dump_stack();
> nilfs_crit(btree->b_inode->i_sb,
> - "btree level mismatch (ino=%lu): %d != %d",
> + "btree level mismatch (ino=%llu): %d != %d",
> btree->b_inode->i_ino,
> nilfs_btree_node_get_level(node), level);
> return 1;
> @@ -521,7 +521,7 @@ static int __nilfs_btree_get_block(const struct nilfs_bmap *btree, __u64 ptr,
> out_no_wait:
> if (!buffer_uptodate(bh)) {
> nilfs_err(btree->b_inode->i_sb,
> - "I/O error reading b-tree node block (ino=%lu, blocknr=%llu)",
> + "I/O error reading b-tree node block (ino=%llu, blocknr=%llu)",
> btree->b_inode->i_ino, (unsigned long long)ptr);
> brelse(bh);
> return -EIO;
> @@ -2104,7 +2104,7 @@ static int nilfs_btree_propagate(struct nilfs_bmap *btree,
> if (ret < 0) {
> if (unlikely(ret == -ENOENT)) {
> nilfs_crit(btree->b_inode->i_sb,
> - "writing node/leaf block does not appear in b-tree (ino=%lu) at key=%llu, level=%d",
> + "writing node/leaf block does not appear in b-tree (ino=%llu) at key=%llu, level=%d",
> btree->b_inode->i_ino,
> (unsigned long long)key, level);
> ret = -EINVAL;
> @@ -2146,7 +2146,7 @@ static void nilfs_btree_add_dirty_buffer(struct nilfs_bmap *btree,
> level >= NILFS_BTREE_LEVEL_MAX) {
> dump_stack();
> nilfs_warn(btree->b_inode->i_sb,
> - "invalid btree level: %d (key=%llu, ino=%lu, blocknr=%llu)",
> + "invalid btree level: %d (key=%llu, ino=%llu, blocknr=%llu)",
> level, (unsigned long long)key,
> btree->b_inode->i_ino,
> (unsigned long long)bh->b_blocknr);
> diff --git a/fs/nilfs2/dir.c b/fs/nilfs2/dir.c
> index b243199036dfa1ab2299efaaa5bdf5da2d159ff2..3653db5cdb65137d1e660bb509c14ec4cbc8840b 100644
> --- a/fs/nilfs2/dir.c
> +++ b/fs/nilfs2/dir.c
> @@ -150,7 +150,7 @@ static bool nilfs_check_folio(struct folio *folio, char *kaddr)
>
> Ebadsize:
> nilfs_error(sb,
> - "size of directory #%lu is not a multiple of chunk size",
> + "size of directory #%llu is not a multiple of chunk size",
> dir->i_ino);
> goto fail;
> Eshort:
> @@ -169,7 +169,7 @@ static bool nilfs_check_folio(struct folio *folio, char *kaddr)
> error = "disallowed inode number";
> bad_entry:
> nilfs_error(sb,
> - "bad entry in directory #%lu: %s - offset=%lu, inode=%lu, rec_len=%zd, name_len=%d",
> + "bad entry in directory #%llu: %s - offset=%lu, inode=%lu, rec_len=%zd, name_len=%d",
I think you missed 'inode=%lu' here.
> dir->i_ino, error, (folio->index << PAGE_SHIFT) + offs,
> (unsigned long)le64_to_cpu(p->inode),
> rec_len, p->name_len);
> @@ -177,7 +177,7 @@ static bool nilfs_check_folio(struct folio *folio, char *kaddr)
> Eend:
> p = (struct nilfs_dir_entry *)(kaddr + offs);
> nilfs_error(sb,
> - "entry in directory #%lu spans the page boundary offset=%lu, inode=%lu",
> + "entry in directory #%llu spans the page boundary offset=%lu, inode=%lu",
Ditto. You missed 'inode=%lu' here.
Thanks,
Slava.
> dir->i_ino, (folio->index << PAGE_SHIFT) + offs,
> (unsigned long)le64_to_cpu(p->inode));
> fail:
> @@ -251,7 +251,7 @@ static int nilfs_readdir(struct file *file, struct dir_context *ctx)
>
> kaddr = nilfs_get_folio(inode, n, &folio);
> if (IS_ERR(kaddr)) {
> - nilfs_error(sb, "bad page in #%lu", inode->i_ino);
> + nilfs_error(sb, "bad page in #%llu", inode->i_ino);
> ctx->pos += PAGE_SIZE - offset;
> return -EIO;
> }
> @@ -336,7 +336,7 @@ struct nilfs_dir_entry *nilfs_find_entry(struct inode *dir,
> /* next folio is past the blocks we've got */
> if (unlikely(n > (dir->i_blocks >> (PAGE_SHIFT - 9)))) {
> nilfs_error(dir->i_sb,
> - "dir %lu size %lld exceeds block count %llu",
> + "dir %llu size %lld exceeds block count %llu",
> dir->i_ino, dir->i_size,
> (unsigned long long)dir->i_blocks);
> goto out;
> @@ -382,7 +382,7 @@ struct nilfs_dir_entry *nilfs_dotdot(struct inode *dir, struct folio **foliop)
> return next_de;
>
> fail:
> - nilfs_error(dir->i_sb, "directory #%lu %s", dir->i_ino, msg);
> + nilfs_error(dir->i_sb, "directory #%llu %s", dir->i_ino, msg);
> folio_release_kmap(folio, de);
> return NULL;
> }
> diff --git a/fs/nilfs2/direct.c b/fs/nilfs2/direct.c
> index 2d8dc6b35b5477947ca12a70288d3a3cce858aab..8bd0b1374e25f8ff510f3b36dbde2acc01aafc1e 100644
> --- a/fs/nilfs2/direct.c
> +++ b/fs/nilfs2/direct.c
> @@ -338,7 +338,7 @@ static int nilfs_direct_assign(struct nilfs_bmap *bmap,
> key = nilfs_bmap_data_get_key(bmap, *bh);
> if (unlikely(key > NILFS_DIRECT_KEY_MAX)) {
> nilfs_crit(bmap->b_inode->i_sb,
> - "%s (ino=%lu): invalid key: %llu",
> + "%s (ino=%llu): invalid key: %llu",
> __func__,
> bmap->b_inode->i_ino, (unsigned long long)key);
> return -EINVAL;
> @@ -346,7 +346,7 @@ static int nilfs_direct_assign(struct nilfs_bmap *bmap,
> ptr = nilfs_direct_get_ptr(bmap, key);
> if (unlikely(ptr == NILFS_BMAP_INVALID_PTR)) {
> nilfs_crit(bmap->b_inode->i_sb,
> - "%s (ino=%lu): invalid pointer: %llu",
> + "%s (ino=%llu): invalid pointer: %llu",
> __func__,
> bmap->b_inode->i_ino, (unsigned long long)ptr);
> return -EINVAL;
> diff --git a/fs/nilfs2/gcinode.c b/fs/nilfs2/gcinode.c
> index 561c220799c7aee879ad866865e377799c8ee6bb..62d4c1b787e95c961a360a4214d621d564ad8b4c 100644
> --- a/fs/nilfs2/gcinode.c
> +++ b/fs/nilfs2/gcinode.c
> @@ -137,7 +137,7 @@ int nilfs_gccache_wait_and_mark_dirty(struct buffer_head *bh)
> struct inode *inode = bh->b_folio->mapping->host;
>
> nilfs_err(inode->i_sb,
> - "I/O error reading %s block for GC (ino=%lu, vblocknr=%llu)",
> + "I/O error reading %s block for GC (ino=%llu, vblocknr=%llu)",
> buffer_nilfs_node(bh) ? "node" : "data",
> inode->i_ino, (unsigned long long)bh->b_blocknr);
> return -EIO;
> diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c
> index 51bde45d586509dda3ef0cb7c46facb7fb2c61dd..51f7e125a311b868860e3e111700d49d4cb98fa6 100644
> --- a/fs/nilfs2/inode.c
> +++ b/fs/nilfs2/inode.c
> @@ -108,7 +108,7 @@ int nilfs_get_block(struct inode *inode, sector_t blkoff,
> * be locked in this case.
> */
> nilfs_warn(inode->i_sb,
> - "%s (ino=%lu): a race condition while inserting a data block at offset=%llu",
> + "%s (ino=%llu): a race condition while inserting a data block at offset=%llu",
> __func__, inode->i_ino,
> (unsigned long long)blkoff);
> err = -EAGAIN;
> @@ -789,7 +789,7 @@ static void nilfs_truncate_bmap(struct nilfs_inode_info *ii,
> goto repeat;
>
> failed:
> - nilfs_warn(ii->vfs_inode.i_sb, "error %d truncating bmap (ino=%lu)",
> + nilfs_warn(ii->vfs_inode.i_sb, "error %d truncating bmap (ino=%llu)",
> ret, ii->vfs_inode.i_ino);
> }
>
> @@ -1026,7 +1026,7 @@ int nilfs_set_file_dirty(struct inode *inode, unsigned int nr_dirty)
> * this inode.
> */
> nilfs_warn(inode->i_sb,
> - "cannot set file dirty (ino=%lu): the file is being freed",
> + "cannot set file dirty (ino=%llu): the file is being freed",
> inode->i_ino);
> spin_unlock(&nilfs->ns_inode_lock);
> return -EINVAL; /*
> @@ -1057,7 +1057,7 @@ int __nilfs_mark_inode_dirty(struct inode *inode, int flags)
> err = nilfs_load_inode_block(inode, &ibh);
> if (unlikely(err)) {
> nilfs_warn(inode->i_sb,
> - "cannot mark inode dirty (ino=%lu): error %d loading inode block",
> + "cannot mark inode dirty (ino=%llu): error %d loading inode block",
> inode->i_ino, err);
> return err;
> }
> diff --git a/fs/nilfs2/mdt.c b/fs/nilfs2/mdt.c
> index 946b0d3534a5f22f34ac44a91fb121541881c548..09adb40c65e505d92012a3d2f5fe8a5696e10056 100644
> --- a/fs/nilfs2/mdt.c
> +++ b/fs/nilfs2/mdt.c
> @@ -203,7 +203,7 @@ static int nilfs_mdt_read_block(struct inode *inode, unsigned long block,
> err = -EIO;
> if (!buffer_uptodate(first_bh)) {
> nilfs_err(inode->i_sb,
> - "I/O error reading meta-data file (ino=%lu, block-offset=%lu)",
> + "I/O error reading meta-data file (ino=%llu, block-offset=%lu)",
> inode->i_ino, block);
> goto failed_bh;
> }
> diff --git a/fs/nilfs2/namei.c b/fs/nilfs2/namei.c
> index 40f4b1a28705b6e0eb8f0978cf3ac18b43aa1331..40ac679ec56e400b1df98e9be6fe9ca338a9ba51 100644
> --- a/fs/nilfs2/namei.c
> +++ b/fs/nilfs2/namei.c
> @@ -292,7 +292,7 @@ static int nilfs_do_unlink(struct inode *dir, struct dentry *dentry)
>
> if (!inode->i_nlink) {
> nilfs_warn(inode->i_sb,
> - "deleting nonexistent file (ino=%lu), %d",
> + "deleting nonexistent file (ino=%llu), %d",
> inode->i_ino, inode->i_nlink);
> set_nlink(inode, 1);
> }
> diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
> index 098a3bd103e04cd09b0689fe2017380d74664496..4b1bf559f3524b1cc3965dae9fd3e5745718569d 100644
> --- a/fs/nilfs2/segment.c
> +++ b/fs/nilfs2/segment.c
> @@ -2024,7 +2024,7 @@ static int nilfs_segctor_collect_dirty_files(struct nilfs_sc_info *sci,
> ifile, ii->vfs_inode.i_ino, &ibh);
> if (unlikely(err)) {
> nilfs_warn(sci->sc_super,
> - "log writer: error %d getting inode block (ino=%lu)",
> + "log writer: error %d getting inode block (ino=%llu)",
> err, ii->vfs_inode.i_ino);
> return err;
> }
> diff --git a/include/trace/events/nilfs2.h b/include/trace/events/nilfs2.h
> index 8880c11733dd307c223cc62ee34ebeff650ecb12..86a0011c9eeaf031cfa0b79875b2b106ef8b7cfd 100644
> --- a/include/trace/events/nilfs2.h
> +++ b/include/trace/events/nilfs2.h
> @@ -165,14 +165,14 @@ TRACE_EVENT(nilfs2_segment_usage_freed,
>
> TRACE_EVENT(nilfs2_mdt_insert_new_block,
> TP_PROTO(struct inode *inode,
> - unsigned long ino,
> + u64 ino,
> unsigned long block),
>
> TP_ARGS(inode, ino, block),
>
> TP_STRUCT__entry(
> __field(struct inode *, inode)
> - __field(unsigned long, ino)
> + __field(u64, ino)
> __field(unsigned long, block)
> ),
>
> @@ -182,7 +182,7 @@ TRACE_EVENT(nilfs2_mdt_insert_new_block,
> __entry->block = block;
> ),
>
> - TP_printk("inode = %p ino = %lu block = %lu",
> + TP_printk("inode = %p ino = %llu block = %lu",
> __entry->inode,
> __entry->ino,
> __entry->block)
> @@ -190,7 +190,7 @@ TRACE_EVENT(nilfs2_mdt_insert_new_block,
>
> TRACE_EVENT(nilfs2_mdt_submit_block,
> TP_PROTO(struct inode *inode,
> - unsigned long ino,
> + u64 ino,
> unsigned long blkoff,
> enum req_op mode),
>
> @@ -198,7 +198,7 @@ TRACE_EVENT(nilfs2_mdt_submit_block,
>
> TP_STRUCT__entry(
> __field(struct inode *, inode)
> - __field(unsigned long, ino)
> + __field(u64, ino)
> __field(unsigned long, blkoff)
> /*
> * Use field_struct() to avoid is_signed_type() on the
> @@ -214,7 +214,7 @@ TRACE_EVENT(nilfs2_mdt_submit_block,
> __entry->mode = mode;
> ),
>
> - TP_printk("inode = %p ino = %lu blkoff = %lu mode = %x",
> + TP_printk("inode = %p ino = %llu blkoff = %lu mode = %x",
> __entry->inode,
> __entry->ino,
> __entry->blkoff,
^ permalink raw reply
* Re: [PATCH v17 0/3] Improve proc RSS accuracy
From: Mathieu Desnoyers @ 2026-02-26 19:38 UTC (permalink / raw)
To: Heiko Carstens
Cc: Andrew Morton, linux-kernel, Paul E. McKenney, Steven Rostedt,
Masami Hiramatsu, Dennis Zhou, Tejun Heo, Christoph Lameter,
Martin Liu, David Rientjes, christian.koenig, Shakeel Butt,
SeongJae Park, Michal Hocko, Johannes Weiner, Sweet Tea Dorminy,
Lorenzo Stoakes, Liam R . Howlett, Mike Rapoport,
Suren Baghdasaryan, Vlastimil Babka, Christian Brauner, Wei Yang,
David Hildenbrand, Miaohe Lin, Al Viro, linux-mm,
linux-trace-kernel, Yu Zhao, Roman Gushchin, Mateusz Guzik,
Matthew Wilcox, Baolin Wang, Aboorva Devarajan, Vasily Gorbik,
linux-s390
In-Reply-To: <e0af317a-d6ad-4de4-8bb1-215d5dce7351@efficios.com>
On 2026-02-26 10:42, Mathieu Desnoyers wrote:
> On 2026-02-26 10:00, Mathieu Desnoyers wrote:
>> On 2026-02-26 07:04, Heiko Carstens wrote:
>>> On Tue, Feb 17, 2026 at 11:10:03AM -0500, Mathieu Desnoyers wrote:
>>>> This series introduces the hierarchical tree counter (hpcc) to increase
>>>> accuracy of approximated RSS counters exposed through proc interfaces.
>>>>
>>>> With a test program hopping across CPUs doing frequent mmap/munmap
>>>> operations, the upstream implementation approximation reaches a 1GB
>>>> delta from the precise value after a few minutes, compared to a 80MB
>>>> delta with the hierarchical counter. The hierarchical counter
>>>> provides a
>>>> guaranteed maximum approximation inaccuracy of 192MB on that hardware
>>>> topology.
>>>>
>>>> This series is based on
>>>> commit 0f2acd3148e0 Merge tag 'm68knommu-for-v7.0' of git://
>>>> git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu
>>>>
>>>> The main changes since v16:
>>>> - Dropped OOM killer 2-pass task selection algorithm.
>>>> - Introduce Kunit tests.
>>>> - Only perform atomic increments of intermediate tree nodes when
>>>> bits which are significant for carry propagation are being changed.
>>>
>>> This seems to cause crashes with linux-next on s390, at least I could
>>> bisect
>>> it to the last patch of this series. Reverting the last one, makes
>>> the crashes
>>> go away:
>>>
>>> 0acac6604c1cfd7a1762901f0a4abe87cf3a8619 is the first bad commit
>>> commit 0acac6604c1cfd7a1762901f0a4abe87cf3a8619 (HEAD)
>>> Author: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
>>> AuthorDate: Tue Feb 17 11:10:06 2026 -0500
>>> Commit: Andrew Morton <akpm@linux-foundation.org>
>>> CommitDate: Tue Feb 24 11:15:15 2026 -0800
>>>
>>> mm: improve RSS counter approximation accuracy for proc interfaces
>>>
>>> Unable to handle kernel pointer dereference in virtual kernel address
>>> space
>>> Failing address: 766d615f72615000 TEID: 766d615f72615803 ESOP-2 FSI
>>> Fault in home space mode while using kernel ASCE.
>>> AS:000000025dc04007 R3:0000000000000024
>>> Oops: 0038 ilc:2 [#1]SMP
>>> Modules linked in:
>>> CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted
>>> 7.0.0-20260224.rc1.git266.3ef088b0c577.300.fc43.s390x+next #1
>>> PREEMPTLAZY
>>> Hardware name: IBM 3931 A01 703 (z/VM 7.4.0)
>>> Krnl PSW : 0704c00180000000 00000216ef164cde
>>> (kernfs_name_hash+0x1e/0xb0)
>>> R:0 T:1 IO:1 EX:1 Key:0 M:1 W:0 P:0 AS:3 CC:0 PM:0 RI:0 EA:3
>>> Krnl GPRS: 0000000000000000 0000000000000000 766d615f72615f65
>>> 0000000000000000
>>> 766d615f72615f65 0000000000000000 0000000000000000
>>> 0000000000000000
>>> 766d615f72615f65 0000000081212440 0000000000000000
>>> 0000000000000000
>>> 0000000080a00000 00000216efcb5390 00000216ef16530c
>>> 00000196eeb07ae0
>>> Krnl Code: 00000216ef164cd2: a7190000 lghi %r1,0
>>> 00000216ef164cd6: b9040042 lgr %r4,%r2
>>> *00000216ef164cda: a7090000 lghi %r0,0
>>> >00000216ef164cde: b25e0014 srst %r1,%r4
>>> 00000216ef164ce2: a714fffe brc 1,00000216ef164cde
>>> 00000216ef164ce6: b9e92051 sgrk %r5,%r1,%r2
>>> 00000216ef164cea: ec1200208076 crj %r1,
>>> %r2,8,00000216ef164d2a
>>> 00000216ef164cf0: b9160005 llgfr %r0,%r5
>>> Call Trace:
>>> [<00000216ef164cde>] kernfs_name_hash+0x1e/0xb0
>>> [<00000216ef167d32>] kernfs_remove_by_name_ns+0x72/0x120
>>> [<00000216ef16bbfa>] remove_files+0x4a/0x90
>>> [<00000216ef16bf96>] create_files+0x276/0x2b0
>>> [<00000216ef16c15a>] internal_create_group+0x18a/0x320
>>> [<00000216f09b61c6>] swap_init+0x5e/0xa0
>>> [<00000216eec7fb00>] do_one_initcall+0x40/0x270
>>> [<00000216f0990a40>] kernel_init_freeable+0x2b0/0x330
>>> [<00000216efb5160e>] kernel_init+0x2e/0x180
>>> [<00000216eec81ffc>] __ret_from_fork+0x3c/0x240
>>> [<00000216efb5e052>] ret_from_fork+0xa/0x30
>>> Last Breaking-Event-Address:
>>> [<00000216ef165306>] kernfs_find_ns+0x76/0x140
>>> Kernel panic - not syncing: Fatal exception: panic_on_oops
>>
>> It looks like either an issue with ordering of the bootup sequence, or
>> an issue with the size of struct mm_struct init_mm. I'll have a look.
>
> I've successfully booted a linux-next 7.0.0-rc1-next-20260226 within a
> x86-64 vm, with a swap partition.
>
> I wonder if s390x somehow alters the value of nr_cpus_ids late in
> bootup, after percpu_counter_tree_subsystem_init() ?
>
> Can you share your .config and kernel command line arguments ?
I've successfully booted a defconfig s390x next-20260226 kernel in qemu
with 1 and 4 CPUs, and within a nested s390x VM on 2 cpus.
I guess I'll really need more info about your specific .config and
command line args to help further.
Thanks,
Mathieu
>
> Thanks,
>
> Mathieu
>
--
Mathieu Desnoyers
EfficiOS Inc.
https://www.efficios.com
^ permalink raw reply
* Re: [PATCH 25/61] ceph: update format strings for u64 i_ino
From: Viacheslav Dubeyko @ 2026-02-26 19:37 UTC (permalink / raw)
To: david@kernel.org, namhyung@kernel.org, oleg@redhat.com,
anna@kernel.org, ms@dev.tdt.de,
alexander.shishkin@linux.intel.com, jack@suse.cz,
ebiggers@kernel.org, Ondrej Mosnacek, mark.rutland@arm.com,
casey@schaufler-ca.com, glaubitz@physik.fu-berlin.de,
miklos@szeredi.hu, sumit.semwal@linaro.org,
john.johansen@canonical.com, amir73il@gmail.com,
slava@dubeyko.com, willy@infradead.org, tytso@mit.edu,
asmadeus@codewreck.org, jth@kernel.org, shaggy@kernel.org,
serge@hallyn.com, jaharkes@cs.cmu.edu, jlayton@kernel.org,
trondmy@kernel.org, jolsa@kernel.org, ericvh@kernel.org,
simona@ffwll.ch, willemb@google.com, aivazian.tigran@gmail.com,
hubcap@omnibond.com, muchun.song@linux.dev, sfrench@samba.org,
neil@brown.name, jmorris@namei.org, jlbec@evilplan.org,
chuck.lever@oracle.com, ronniesahlberg@gmail.com,
lucho@ionkov.net, dan.j.williams@intel.com, raven@themaw.net,
Alex Markuze, mhiramat@kernel.org, alexander.deucher@amd.com,
mathieu.desnoyers@efficios.com, horms@kernel.org, tom@talpey.com,
mark@fasheh.com, mikulas@artax.karlin.mff.cuni.cz,
djwong@kernel.org, edumazet@google.com, Olga Kornievskaia,
bharathsm@microsoft.com, adrian.hunter@intel.com,
osalvador@suse.de, peterz@infradead.org, christian.koenig@amd.com,
pc@manguebit.org, martin@omnibond.com, naohiro.aota@wdc.com,
frank.li@vivo.com, dsterba@suse.com, zohar@linux.ibm.com,
code@tyhicks.com, dwmw2@infradead.org, kuba@kernel.org,
kuniyu@google.com, nico@fluxnic.net, jack@suse.com,
dlemoal@kernel.org, viro@zeniv.linux.org.uk,
stephen.smalley.work@gmail.com, salah.triki@gmail.com,
David Howells, paul@paul-moore.com, luisbg@kernel.org,
irogers@google.com, acme@kernel.org, richard@nod.at,
rostedt@goodmis.org, idryomov@gmail.com,
joseph.qi@linux.alibaba.com, al@alarsen.net,
james.clark@linaro.org, dmitry.kasatkin@gmail.com,
roberto.sassu@huawei.com, konishi.ryusuke@gmail.com,
sprasad@microsoft.com, jaegeuk@kernel.org,
linux_oss@crudebyte.com, brauner@kernel.org, Dai.Ngo@oracle.com,
eric.snowberg@oracle.com, adilger.kernel@dilger.ca,
chao@kernel.org, wufan@kernel.org, coda@cs.cmu.edu, Ingo Molnar,
alex.aring@gmail.com, airlied@gmail.com, chengzhihao1@huawei.com,
Paolo Abeni, marc.dionne@auristor.com,
almaz.alexandrovich@paragon-software.com, davem@davemloft.net,
hch@infradead.org
Cc: ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org,
apparmor@lists.ubuntu.com, linux-ext4@vger.kernel.org,
autofs@vger.kernel.org, amd-gfx@lists.freedesktop.org,
fsverity@lists.linux.dev, ntfs3@lists.linux.dev,
ocfs2-devel@lists.linux.dev, linux-fsdevel@vger.kernel.org,
linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, linux-integrity@vger.kernel.org,
samba-technical@lists.samba.org, linux-nilfs@vger.kernel.org,
selinux@vger.kernel.org, linaro-mm-sig@lists.linaro.org,
linux-trace-kernel@vger.kernel.org, v9fs@lists.linux.dev,
linux-xfs@vger.kernel.org, linux-x25@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net, nvdimm@lists.linux.dev,
ceph-devel@vger.kernel.org, jfs-discussion@lists.sourceforge.net,
linux-mtd@lists.infradead.org, devel@lists.orangefs.org,
linux-afs@lists.infradead.org, linux-fscrypt@vger.kernel.org,
linux-security-module@vger.kernel.org, linux-cifs@vger.kernel.org,
linux-hams@vger.kernel.org, linux-nfs@vger.kernel.org,
codalist@coda.cs.cmu.edu, linux-mm@kvack.org,
netfs@lists.linux.dev, linux-perf-users@vger.kernel.org,
dri-devel@lists.freedesktop.org
In-Reply-To: <20260226-iino-u64-v1-25-ccceff366db9@kernel.org>
On Thu, 2026-02-26 at 10:55 -0500, Jeff Layton wrote:
> Update format strings and local variable types in ceph for the
> i_ino type change from unsigned long to u64.
>
> Signed-off-by: Jeff Layton <jlayton@kernel.org>
> ---
> fs/ceph/crypto.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/fs/ceph/crypto.c b/fs/ceph/crypto.c
> index f3de43ccb470ddbd7945426d79f9024ae615c127..3c8a21a572d8230b558f20bb02721184cae35ee6 100644
> --- a/fs/ceph/crypto.c
> +++ b/fs/ceph/crypto.c
> @@ -272,7 +272,7 @@ int ceph_encode_encrypted_dname(struct inode *parent, char *buf, int elen)
> /* To understand the 240 limit, see CEPH_NOHASH_NAME_MAX comments */
> WARN_ON(elen > 240);
> if (dir != parent) // leading _ is already there; append _<inum>
> - elen += 1 + sprintf(p + elen, "_%ld", dir->i_ino);
> + elen += 1 + sprintf(p + elen, "_%lld", dir->i_ino);
>
> out:
> kfree(cryptbuf);
> @@ -377,7 +377,7 @@ int ceph_fname_to_usr(const struct ceph_fname *fname, struct fscrypt_str *tname,
> if (!ret && (dir != fname->dir)) {
> char tmp_buf[BASE64_CHARS(NAME_MAX)];
>
> - name_len = snprintf(tmp_buf, sizeof(tmp_buf), "_%.*s_%ld",
> + name_len = snprintf(tmp_buf, sizeof(tmp_buf), "_%.*s_%lld",
> oname->len, oname->name, dir->i_ino);
> memcpy(oname->name, tmp_buf, name_len);
> oname->len = name_len;
Looks good.
Reviewed-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
Thanks,
Slava.
^ permalink raw reply
* Re: [PATCH 34/61] hfsplus: update format strings for u64 i_ino
From: Viacheslav Dubeyko @ 2026-02-26 19:35 UTC (permalink / raw)
To: david@kernel.org, namhyung@kernel.org, oleg@redhat.com,
anna@kernel.org, ms@dev.tdt.de,
alexander.shishkin@linux.intel.com, jack@suse.cz,
ebiggers@kernel.org, Ondrej Mosnacek, mark.rutland@arm.com,
casey@schaufler-ca.com, glaubitz@physik.fu-berlin.de,
miklos@szeredi.hu, sumit.semwal@linaro.org,
john.johansen@canonical.com, amir73il@gmail.com,
slava@dubeyko.com, willy@infradead.org, tytso@mit.edu,
asmadeus@codewreck.org, jth@kernel.org, shaggy@kernel.org,
serge@hallyn.com, jaharkes@cs.cmu.edu, jlayton@kernel.org,
trondmy@kernel.org, jolsa@kernel.org, ericvh@kernel.org,
simona@ffwll.ch, willemb@google.com, aivazian.tigran@gmail.com,
hubcap@omnibond.com, muchun.song@linux.dev, sfrench@samba.org,
neil@brown.name, jmorris@namei.org, jlbec@evilplan.org,
chuck.lever@oracle.com, ronniesahlberg@gmail.com,
lucho@ionkov.net, dan.j.williams@intel.com, raven@themaw.net,
Alex Markuze, mhiramat@kernel.org, alexander.deucher@amd.com,
mathieu.desnoyers@efficios.com, horms@kernel.org, tom@talpey.com,
mark@fasheh.com, mikulas@artax.karlin.mff.cuni.cz,
djwong@kernel.org, edumazet@google.com, Olga Kornievskaia,
bharathsm@microsoft.com, adrian.hunter@intel.com,
osalvador@suse.de, peterz@infradead.org, christian.koenig@amd.com,
pc@manguebit.org, martin@omnibond.com, naohiro.aota@wdc.com,
frank.li@vivo.com, dsterba@suse.com, zohar@linux.ibm.com,
code@tyhicks.com, dwmw2@infradead.org, kuba@kernel.org,
kuniyu@google.com, nico@fluxnic.net, jack@suse.com,
dlemoal@kernel.org, viro@zeniv.linux.org.uk,
stephen.smalley.work@gmail.com, salah.triki@gmail.com,
David Howells, paul@paul-moore.com, luisbg@kernel.org,
irogers@google.com, acme@kernel.org, richard@nod.at,
rostedt@goodmis.org, idryomov@gmail.com,
joseph.qi@linux.alibaba.com, al@alarsen.net,
james.clark@linaro.org, dmitry.kasatkin@gmail.com,
roberto.sassu@huawei.com, konishi.ryusuke@gmail.com,
sprasad@microsoft.com, jaegeuk@kernel.org,
linux_oss@crudebyte.com, brauner@kernel.org, Dai.Ngo@oracle.com,
eric.snowberg@oracle.com, adilger.kernel@dilger.ca,
chao@kernel.org, wufan@kernel.org, coda@cs.cmu.edu, Ingo Molnar,
alex.aring@gmail.com, airlied@gmail.com, chengzhihao1@huawei.com,
Paolo Abeni, marc.dionne@auristor.com,
almaz.alexandrovich@paragon-software.com, davem@davemloft.net,
hch@infradead.org
Cc: ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org,
apparmor@lists.ubuntu.com, linux-ext4@vger.kernel.org,
autofs@vger.kernel.org, amd-gfx@lists.freedesktop.org,
fsverity@lists.linux.dev, ntfs3@lists.linux.dev,
ocfs2-devel@lists.linux.dev, linux-fsdevel@vger.kernel.org,
linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, linux-integrity@vger.kernel.org,
samba-technical@lists.samba.org, linux-nilfs@vger.kernel.org,
selinux@vger.kernel.org, linaro-mm-sig@lists.linaro.org,
linux-trace-kernel@vger.kernel.org, v9fs@lists.linux.dev,
linux-xfs@vger.kernel.org, linux-x25@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net, nvdimm@lists.linux.dev,
ceph-devel@vger.kernel.org, jfs-discussion@lists.sourceforge.net,
linux-mtd@lists.infradead.org, devel@lists.orangefs.org,
linux-afs@lists.infradead.org, linux-fscrypt@vger.kernel.org,
linux-security-module@vger.kernel.org, linux-cifs@vger.kernel.org,
linux-hams@vger.kernel.org, linux-nfs@vger.kernel.org,
codalist@coda.cs.cmu.edu, linux-mm@kvack.org,
netfs@lists.linux.dev, linux-perf-users@vger.kernel.org,
dri-devel@lists.freedesktop.org
In-Reply-To: <20260226-iino-u64-v1-34-ccceff366db9@kernel.org>
On Thu, 2026-02-26 at 10:55 -0500, Jeff Layton wrote:
> Update format strings and local variable types in hfsplus for the
> i_ino type change from unsigned long to u64.
>
> Signed-off-by: Jeff Layton <jlayton@kernel.org>
> ---
> fs/hfsplus/attributes.c | 10 +++++-----
> fs/hfsplus/catalog.c | 2 +-
> fs/hfsplus/dir.c | 6 +++---
> fs/hfsplus/extents.c | 6 +++---
> fs/hfsplus/inode.c | 8 ++++----
> fs/hfsplus/super.c | 6 +++---
> fs/hfsplus/xattr.c | 10 +++++-----
> 7 files changed, 24 insertions(+), 24 deletions(-)
>
> diff --git a/fs/hfsplus/attributes.c b/fs/hfsplus/attributes.c
> index 4b79cd606276e31c20fa18ef3a099596f50e8a0f..e3d8fe1e7e75d9895c4ae30810a334412b4c105a 100644
> --- a/fs/hfsplus/attributes.c
> +++ b/fs/hfsplus/attributes.c
> @@ -203,7 +203,7 @@ int hfsplus_create_attr_nolock(struct inode *inode, const char *name,
> int entry_size;
> int err;
>
> - hfs_dbg("name %s, ino %ld\n",
> + hfs_dbg("name %s, ino %lld\n",
> name ? name : NULL, inode->i_ino);
>
> if (name) {
> @@ -255,7 +255,7 @@ int hfsplus_create_attr(struct inode *inode,
> hfsplus_attr_entry *entry_ptr;
> int err;
>
> - hfs_dbg("name %s, ino %ld\n",
> + hfs_dbg("name %s, ino %lld\n",
> name ? name : NULL, inode->i_ino);
>
> if (!HFSPLUS_SB(sb)->attr_tree) {
> @@ -337,7 +337,7 @@ int hfsplus_delete_attr_nolock(struct inode *inode, const char *name,
> struct super_block *sb = inode->i_sb;
> int err;
>
> - hfs_dbg("name %s, ino %ld\n",
> + hfs_dbg("name %s, ino %lld\n",
> name ? name : NULL, inode->i_ino);
>
> if (name) {
> @@ -367,7 +367,7 @@ int hfsplus_delete_attr(struct inode *inode, const char *name)
> struct super_block *sb = inode->i_sb;
> struct hfs_find_data fd;
>
> - hfs_dbg("name %s, ino %ld\n",
> + hfs_dbg("name %s, ino %lld\n",
> name ? name : NULL, inode->i_ino);
>
> if (!HFSPLUS_SB(sb)->attr_tree) {
> @@ -436,7 +436,7 @@ int hfsplus_replace_attr(struct inode *inode,
> hfsplus_attr_entry *entry_ptr;
> int err = 0;
>
> - hfs_dbg("name %s, ino %ld\n",
> + hfs_dbg("name %s, ino %lld\n",
> name ? name : NULL, inode->i_ino);
>
> if (!HFSPLUS_SB(sb)->attr_tree) {
> diff --git a/fs/hfsplus/catalog.c b/fs/hfsplus/catalog.c
> index 02c1eee4a4b86059ceaab7a7c68ab65adba6fa26..0e961e99b9856ab7d95da5d070b4fbce1e67ebde 100644
> --- a/fs/hfsplus/catalog.c
> +++ b/fs/hfsplus/catalog.c
> @@ -441,7 +441,7 @@ int hfsplus_rename_cat(u32 cnid,
> int entry_size, type;
> int err;
>
> - hfs_dbg("cnid %u - ino %lu, name %s - ino %lu, name %s\n",
> + hfs_dbg("cnid %u - ino %llu, name %s - ino %llu, name %s\n",
> cnid, src_dir->i_ino, src_name->name,
> dst_dir->i_ino, dst_name->name);
> err = hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &src_fd);
> diff --git a/fs/hfsplus/dir.c b/fs/hfsplus/dir.c
> index d559bf8625f853d50fd316d157cf8afe22069565..054f6da46033404bbbcf299beb5d8765495c0de3 100644
> --- a/fs/hfsplus/dir.c
> +++ b/fs/hfsplus/dir.c
> @@ -313,7 +313,7 @@ static int hfsplus_link(struct dentry *src_dentry, struct inode *dst_dir,
> if (!S_ISREG(inode->i_mode))
> return -EPERM;
>
> - hfs_dbg("src_dir->i_ino %lu, dst_dir->i_ino %lu, inode->i_ino %lu\n",
> + hfs_dbg("src_dir->i_ino %llu, dst_dir->i_ino %llu, inode->i_ino %llu\n",
> src_dir->i_ino, dst_dir->i_ino, inode->i_ino);
>
> mutex_lock(&sbi->vh_mutex);
> @@ -385,7 +385,7 @@ static int hfsplus_unlink(struct inode *dir, struct dentry *dentry)
> if (HFSPLUS_IS_RSRC(inode))
> return -EPERM;
>
> - hfs_dbg("dir->i_ino %lu, inode->i_ino %lu\n",
> + hfs_dbg("dir->i_ino %llu, inode->i_ino %llu\n",
> dir->i_ino, inode->i_ino);
>
> mutex_lock(&sbi->vh_mutex);
> @@ -393,7 +393,7 @@ static int hfsplus_unlink(struct inode *dir, struct dentry *dentry)
> if (inode->i_ino == cnid &&
> atomic_read(&HFSPLUS_I(inode)->opencnt)) {
> str.name = name;
> - str.len = sprintf(name, "temp%lu", inode->i_ino);
> + str.len = sprintf(name, "temp%llu", inode->i_ino);
> res = hfsplus_rename_cat(inode->i_ino,
> dir, &dentry->d_name,
> sbi->hidden_dir, &str);
> diff --git a/fs/hfsplus/extents.c b/fs/hfsplus/extents.c
> index 8e886514d27f1e5d4d94be75142f197669e62234..474fde1a1653be6cf74b26e757c6d8a6f8d2906a 100644
> --- a/fs/hfsplus/extents.c
> +++ b/fs/hfsplus/extents.c
> @@ -275,7 +275,7 @@ int hfsplus_get_block(struct inode *inode, sector_t iblock,
> mutex_unlock(&hip->extents_lock);
>
> done:
> - hfs_dbg("ino %lu, iblock %llu - dblock %u\n",
> + hfs_dbg("ino %llu, iblock %llu - dblock %u\n",
> inode->i_ino, (long long)iblock, dblock);
>
> mask = (1 << sbi->fs_shift) - 1;
> @@ -476,7 +476,7 @@ int hfsplus_file_extend(struct inode *inode, bool zeroout)
> goto out;
> }
>
> - hfs_dbg("ino %lu, start %u, len %u\n", inode->i_ino, start, len);
> + hfs_dbg("ino %llu, start %u, len %u\n", inode->i_ino, start, len);
>
> if (hip->alloc_blocks <= hip->first_blocks) {
> if (!hip->first_blocks) {
> @@ -545,7 +545,7 @@ void hfsplus_file_truncate(struct inode *inode)
> u32 alloc_cnt, blk_cnt, start;
> int res;
>
> - hfs_dbg("ino %lu, phys_size %llu -> i_size %llu\n",
> + hfs_dbg("ino %llu, phys_size %llu -> i_size %llu\n",
> inode->i_ino, (long long)hip->phys_size, inode->i_size);
>
> if (inode->i_size > hip->phys_size) {
> diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c
> index 922ff41df042a83d47364f2d941c45dabda29afb..02be32dc6833dfdd767c407ec0263485d1a2c3c6 100644
> --- a/fs/hfsplus/inode.c
> +++ b/fs/hfsplus/inode.c
> @@ -230,7 +230,7 @@ static int hfsplus_get_perms(struct inode *inode,
> inode->i_flags &= ~S_APPEND;
> return 0;
> bad_type:
> - pr_err("invalid file type 0%04o for inode %lu\n", mode, inode->i_ino);
> + pr_err("invalid file type 0%04o for inode %llu\n", mode, inode->i_ino);
> return -EIO;
> }
>
> @@ -328,7 +328,7 @@ int hfsplus_file_fsync(struct file *file, loff_t start, loff_t end,
> struct hfsplus_vh *vhdr = sbi->s_vhdr;
> int error = 0, error2;
>
> - hfs_dbg("inode->i_ino %lu, start %llu, end %llu\n",
> + hfs_dbg("inode->i_ino %llu, start %llu, end %llu\n",
> inode->i_ino, start, end);
>
> error = file_write_and_wait_range(file, start, end);
> @@ -639,7 +639,7 @@ int hfsplus_cat_write_inode(struct inode *inode)
> hfsplus_cat_entry entry;
> int res = 0;
>
> - hfs_dbg("inode->i_ino %lu\n", inode->i_ino);
> + hfs_dbg("inode->i_ino %llu\n", inode->i_ino);
>
> if (HFSPLUS_IS_RSRC(inode))
> main_inode = HFSPLUS_I(inode)->rsrc_inode;
> @@ -716,7 +716,7 @@ int hfsplus_cat_write_inode(struct inode *inode)
> if (!res) {
> res = hfs_btree_write(tree);
> if (res) {
> - pr_err("b-tree write err: %d, ino %lu\n",
> + pr_err("b-tree write err: %d, ino %llu\n",
> res, inode->i_ino);
> }
> }
> diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
> index 7229a8ae89f9469109b1c3a317ee9b7705a83f8b..b3917249c206c3a25fe98b39a5eb2168b7404dc2 100644
> --- a/fs/hfsplus/super.c
> +++ b/fs/hfsplus/super.c
> @@ -156,7 +156,7 @@ static int hfsplus_system_write_inode(struct inode *inode)
> int err = hfs_btree_write(tree);
>
> if (err) {
> - pr_err("b-tree write err: %d, ino %lu\n",
> + pr_err("b-tree write err: %d, ino %llu\n",
> err, inode->i_ino);
> return err;
> }
> @@ -169,7 +169,7 @@ static int hfsplus_write_inode(struct inode *inode,
> {
> int err;
>
> - hfs_dbg("ino %lu\n", inode->i_ino);
> + hfs_dbg("ino %llu\n", inode->i_ino);
>
> err = hfsplus_ext_write_extent(inode);
> if (err)
> @@ -184,7 +184,7 @@ static int hfsplus_write_inode(struct inode *inode,
>
> static void hfsplus_evict_inode(struct inode *inode)
> {
> - hfs_dbg("ino %lu\n", inode->i_ino);
> + hfs_dbg("ino %llu\n", inode->i_ino);
> truncate_inode_pages_final(&inode->i_data);
> clear_inode(inode);
> if (HFSPLUS_IS_RSRC(inode)) {
> diff --git a/fs/hfsplus/xattr.c b/fs/hfsplus/xattr.c
> index 9904944cbd54e3d326591fa65a5ed678f38ca583..c70bb6f494b22b1e3f74e18a9ef378e0c87f8194 100644
> --- a/fs/hfsplus/xattr.c
> +++ b/fs/hfsplus/xattr.c
> @@ -277,7 +277,7 @@ int __hfsplus_setxattr(struct inode *inode, const char *name,
> u16 folder_finderinfo_len = sizeof(DInfo) + sizeof(DXInfo);
> u16 file_finderinfo_len = sizeof(FInfo) + sizeof(FXInfo);
>
> - hfs_dbg("ino %lu, name %s, value %p, size %zu\n",
> + hfs_dbg("ino %llu, name %s, value %p, size %zu\n",
> inode->i_ino, name ? name : NULL,
> value, size);
>
> @@ -447,7 +447,7 @@ int hfsplus_setxattr(struct inode *inode, const char *name,
> NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN + 1;
> int res;
>
> - hfs_dbg("ino %lu, name %s, prefix %s, prefixlen %zu, "
> + hfs_dbg("ino %llu, name %s, prefix %s, prefixlen %zu, "
> "value %p, size %zu\n",
> inode->i_ino, name ? name : NULL,
> prefix ? prefix : NULL, prefixlen,
> @@ -607,7 +607,7 @@ ssize_t hfsplus_getxattr(struct inode *inode, const char *name,
> int res;
> char *xattr_name;
>
> - hfs_dbg("ino %lu, name %s, prefix %s\n",
> + hfs_dbg("ino %llu, name %s, prefix %s\n",
> inode->i_ino, name ? name : NULL,
> prefix ? prefix : NULL);
>
> @@ -717,7 +717,7 @@ ssize_t hfsplus_listxattr(struct dentry *dentry, char *buffer, size_t size)
> size_t strbuf_size;
> int xattr_name_len;
>
> - hfs_dbg("ino %lu\n", inode->i_ino);
> + hfs_dbg("ino %llu\n", inode->i_ino);
>
> if (!is_xattr_operation_supported(inode))
> return -EOPNOTSUPP;
> @@ -819,7 +819,7 @@ static int hfsplus_removexattr(struct inode *inode, const char *name)
> int is_xattr_acl_deleted;
> int is_all_xattrs_deleted;
>
> - hfs_dbg("ino %lu, name %s\n",
> + hfs_dbg("ino %llu, name %s\n",
> inode->i_ino, name ? name : NULL);
>
> if (!HFSPLUS_SB(inode->i_sb)->attr_tree)
Looks good.
Reviewed-by: Viacheslav Dubeyko <slava@dubeyko.com>
Thanks,
Slava.
^ permalink raw reply
* Re: [PATCH 33/61] hfs: update format strings for u64 i_ino
From: Viacheslav Dubeyko @ 2026-02-26 19:33 UTC (permalink / raw)
To: david@kernel.org, namhyung@kernel.org, oleg@redhat.com,
anna@kernel.org, ms@dev.tdt.de,
alexander.shishkin@linux.intel.com, jack@suse.cz,
ebiggers@kernel.org, Ondrej Mosnacek, mark.rutland@arm.com,
casey@schaufler-ca.com, glaubitz@physik.fu-berlin.de,
miklos@szeredi.hu, sumit.semwal@linaro.org,
john.johansen@canonical.com, amir73il@gmail.com,
slava@dubeyko.com, willy@infradead.org, tytso@mit.edu,
asmadeus@codewreck.org, jth@kernel.org, shaggy@kernel.org,
serge@hallyn.com, jaharkes@cs.cmu.edu, jlayton@kernel.org,
trondmy@kernel.org, jolsa@kernel.org, ericvh@kernel.org,
simona@ffwll.ch, willemb@google.com, aivazian.tigran@gmail.com,
hubcap@omnibond.com, muchun.song@linux.dev, sfrench@samba.org,
neil@brown.name, jmorris@namei.org, jlbec@evilplan.org,
chuck.lever@oracle.com, ronniesahlberg@gmail.com,
lucho@ionkov.net, dan.j.williams@intel.com, raven@themaw.net,
Alex Markuze, mhiramat@kernel.org, alexander.deucher@amd.com,
mathieu.desnoyers@efficios.com, horms@kernel.org, tom@talpey.com,
mark@fasheh.com, mikulas@artax.karlin.mff.cuni.cz,
djwong@kernel.org, edumazet@google.com, Olga Kornievskaia,
bharathsm@microsoft.com, adrian.hunter@intel.com,
osalvador@suse.de, peterz@infradead.org, christian.koenig@amd.com,
pc@manguebit.org, martin@omnibond.com, naohiro.aota@wdc.com,
frank.li@vivo.com, dsterba@suse.com, zohar@linux.ibm.com,
code@tyhicks.com, dwmw2@infradead.org, kuba@kernel.org,
kuniyu@google.com, nico@fluxnic.net, jack@suse.com,
dlemoal@kernel.org, viro@zeniv.linux.org.uk,
stephen.smalley.work@gmail.com, salah.triki@gmail.com,
David Howells, paul@paul-moore.com, luisbg@kernel.org,
irogers@google.com, acme@kernel.org, richard@nod.at,
rostedt@goodmis.org, idryomov@gmail.com,
joseph.qi@linux.alibaba.com, al@alarsen.net,
james.clark@linaro.org, dmitry.kasatkin@gmail.com,
roberto.sassu@huawei.com, konishi.ryusuke@gmail.com,
sprasad@microsoft.com, jaegeuk@kernel.org,
linux_oss@crudebyte.com, brauner@kernel.org, Dai.Ngo@oracle.com,
eric.snowberg@oracle.com, adilger.kernel@dilger.ca,
chao@kernel.org, wufan@kernel.org, coda@cs.cmu.edu, Ingo Molnar,
alex.aring@gmail.com, airlied@gmail.com, chengzhihao1@huawei.com,
Paolo Abeni, marc.dionne@auristor.com,
almaz.alexandrovich@paragon-software.com, davem@davemloft.net,
hch@infradead.org
Cc: ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org,
apparmor@lists.ubuntu.com, linux-ext4@vger.kernel.org,
autofs@vger.kernel.org, amd-gfx@lists.freedesktop.org,
fsverity@lists.linux.dev, ntfs3@lists.linux.dev,
ocfs2-devel@lists.linux.dev, linux-fsdevel@vger.kernel.org,
linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, linux-integrity@vger.kernel.org,
samba-technical@lists.samba.org, linux-nilfs@vger.kernel.org,
selinux@vger.kernel.org, linaro-mm-sig@lists.linaro.org,
linux-trace-kernel@vger.kernel.org, v9fs@lists.linux.dev,
linux-xfs@vger.kernel.org, linux-x25@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net, nvdimm@lists.linux.dev,
ceph-devel@vger.kernel.org, jfs-discussion@lists.sourceforge.net,
linux-mtd@lists.infradead.org, devel@lists.orangefs.org,
linux-afs@lists.infradead.org, linux-fscrypt@vger.kernel.org,
linux-security-module@vger.kernel.org, linux-cifs@vger.kernel.org,
linux-hams@vger.kernel.org, linux-nfs@vger.kernel.org,
codalist@coda.cs.cmu.edu, linux-mm@kvack.org,
netfs@lists.linux.dev, linux-perf-users@vger.kernel.org,
dri-devel@lists.freedesktop.org
In-Reply-To: <20260226-iino-u64-v1-33-ccceff366db9@kernel.org>
On Thu, 2026-02-26 at 10:55 -0500, Jeff Layton wrote:
> Update format strings and local variable types in hfs for the
> i_ino type change from unsigned long to u64.
>
> Signed-off-by: Jeff Layton <jlayton@kernel.org>
> ---
> fs/hfs/catalog.c | 2 +-
> fs/hfs/extent.c | 4 ++--
> fs/hfs/inode.c | 4 ++--
> 3 files changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/fs/hfs/catalog.c b/fs/hfs/catalog.c
> index b80ba40e38776123759df4b85c7f65daa19c6436..7f5339ee57c15aae2d5d00474133a985be3af6ca 100644
> --- a/fs/hfs/catalog.c
> +++ b/fs/hfs/catalog.c
> @@ -417,7 +417,7 @@ int hfs_cat_move(u32 cnid, struct inode *src_dir, const struct qstr *src_name,
> int entry_size, type;
> int err;
>
> - hfs_dbg("cnid %u - (ino %lu, name %s) - (ino %lu, name %s)\n",
> + hfs_dbg("cnid %u - (ino %llu, name %s) - (ino %llu, name %s)\n",
> cnid, src_dir->i_ino, src_name->name,
> dst_dir->i_ino, dst_name->name);
> sb = src_dir->i_sb;
> diff --git a/fs/hfs/extent.c b/fs/hfs/extent.c
> index a097908b269d0ad1575847dd01d6d4a4538262bf..f066a99a863bc739948aac921bc906874c6009b2 100644
> --- a/fs/hfs/extent.c
> +++ b/fs/hfs/extent.c
> @@ -411,7 +411,7 @@ int hfs_extend_file(struct inode *inode)
> goto out;
> }
>
> - hfs_dbg("ino %lu, start %u, len %u\n", inode->i_ino, start, len);
> + hfs_dbg("ino %llu, start %u, len %u\n", inode->i_ino, start, len);
> if (HFS_I(inode)->alloc_blocks == HFS_I(inode)->first_blocks) {
> if (!HFS_I(inode)->first_blocks) {
> hfs_dbg("first_extent: start %u, len %u\n",
> @@ -482,7 +482,7 @@ void hfs_file_truncate(struct inode *inode)
> u32 size;
> int res;
>
> - hfs_dbg("ino %lu, phys_size %llu -> i_size %llu\n",
> + hfs_dbg("ino %llu, phys_size %llu -> i_size %llu\n",
> inode->i_ino, (long long)HFS_I(inode)->phys_size,
> inode->i_size);
> if (inode->i_size > HFS_I(inode)->phys_size) {
> diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c
> index 878535db64d679995cd1f5c215f56c5258c3c720..95f0333a608b0fb57239cf5eec7d9489a25efb3a 100644
> --- a/fs/hfs/inode.c
> +++ b/fs/hfs/inode.c
> @@ -270,7 +270,7 @@ void hfs_delete_inode(struct inode *inode)
> {
> struct super_block *sb = inode->i_sb;
>
> - hfs_dbg("ino %lu\n", inode->i_ino);
> + hfs_dbg("ino %llu\n", inode->i_ino);
> if (S_ISDIR(inode->i_mode)) {
> atomic64_dec(&HFS_SB(sb)->folder_count);
> if (HFS_I(inode)->cat_key.ParID == cpu_to_be32(HFS_ROOT_CNID))
> @@ -455,7 +455,7 @@ int hfs_write_inode(struct inode *inode, struct writeback_control *wbc)
> hfs_cat_rec rec;
> int res;
>
> - hfs_dbg("ino %lu\n", inode->i_ino);
> + hfs_dbg("ino %llu\n", inode->i_ino);
> res = hfs_ext_write_extent(inode);
> if (res)
> return res;
Looks good.
Reviewed-by: Viacheslav Dubeyko <slava@dubeyko.com>
Thanks,
Slava.
^ permalink raw reply
* Re: [PATCH v3 5/5] mm: add tracepoints for zone lock
From: Shakeel Butt @ 2026-02-26 19:14 UTC (permalink / raw)
To: Dmitry Ilvokhin
Cc: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Axel Rasmussen, Yuanchu Xie,
Wei Xu, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Brendan Jackman, Johannes Weiner, Zi Yan, Oscar Salvador,
Qi Zheng, linux-kernel, linux-mm, linux-trace-kernel, linux-cxl,
kernel-team, Benjamin Cheatham
In-Reply-To: <378089dd269249d3d7981fe10eb8b49ad551d353.1772129168.git.d@ilvokhin.com>
On Thu, Feb 26, 2026 at 06:26:22PM +0000, Dmitry Ilvokhin wrote:
> Add tracepoint instrumentation to zone lock acquire/release operations
> via the previously introduced wrappers.
>
> The implementation follows the mmap_lock tracepoint pattern: a
> lightweight inline helper checks whether the tracepoint is enabled and
> calls into an out-of-line helper when tracing is active. When
> CONFIG_TRACING is disabled, helpers compile to empty inline stubs.
>
> The fast path is unaffected when tracing is disabled.
>
> Signed-off-by: Dmitry Ilvokhin <d@ilvokhin.com>
One nit below other than that:
Acked-by: Shakeel Butt <shakeel.butt@linux.dev>
[...]
> --- /dev/null
> +++ b/mm/zone_lock.c
> @@ -0,0 +1,31 @@
> +// SPDX-License-Identifier: GPL-2.0
> +#define CREATE_TRACE_POINTS
> +#include <trace/events/zone_lock.h>
> +
> +#include <linux/zone_lock.h>
> +
> +EXPORT_TRACEPOINT_SYMBOL(zone_lock_start_locking);
> +EXPORT_TRACEPOINT_SYMBOL(zone_lock_acquire_returned);
> +EXPORT_TRACEPOINT_SYMBOL(zone_lock_released);
> +
> +#ifdef CONFIG_TRACING
> +
> +void __zone_lock_do_trace_start_locking(struct zone *zone)
> +{
> + trace_zone_lock_start_locking(zone);
> +}
> +EXPORT_SYMBOL(__zone_lock_do_trace_start_locking);
No reason to not have these as EXPORT_SYMBOL_GPL (& below)
> +
> +void __zone_lock_do_trace_acquire_returned(struct zone *zone, bool success)
> +{
> + trace_zone_lock_acquire_returned(zone, success);
> +}
> +EXPORT_SYMBOL(__zone_lock_do_trace_acquire_returned);
> +
> +void __zone_lock_do_trace_released(struct zone *zone)
> +{
> + trace_zone_lock_released(zone);
> +}
> +EXPORT_SYMBOL(__zone_lock_do_trace_released);
> +
> +#endif /* CONFIG_TRACING */
> --
> 2.47.3
>
^ permalink raw reply
* Re: [PATCH v3 4/5] mm: rename zone->lock to zone->_lock
From: Shakeel Butt @ 2026-02-26 19:09 UTC (permalink / raw)
To: Dmitry Ilvokhin
Cc: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Axel Rasmussen, Yuanchu Xie,
Wei Xu, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Brendan Jackman, Johannes Weiner, Zi Yan, Oscar Salvador,
Qi Zheng, linux-kernel, linux-mm, linux-trace-kernel, linux-cxl,
kernel-team, Benjamin Cheatham
In-Reply-To: <1221b8e7fa9f5694f3c4e411f01581b5aba9bc63.1772129168.git.d@ilvokhin.com>
On Thu, Feb 26, 2026 at 06:26:21PM +0000, Dmitry Ilvokhin wrote:
> This intentionally breaks direct users of zone->lock at compile time so
> all call sites are converted to the zone lock wrappers. Without the
> rename, present and future out-of-tree code could continue using
> spin_lock(&zone->lock) and bypass the wrappers and tracing
> infrastructure.
>
> No functional change intended.
>
> Suggested-by: Andrew Morton <akpm@linux-foundation.org>
> Signed-off-by: Dmitry Ilvokhin <d@ilvokhin.com>
Acked-by: Shakeel Butt <shakeel.butt@linux.dev>
^ permalink raw reply
* Re: [PATCH v3 3/5] mm: convert compaction to zone lock wrappers
From: Shakeel Butt @ 2026-02-26 19:07 UTC (permalink / raw)
To: Dmitry Ilvokhin
Cc: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Axel Rasmussen, Yuanchu Xie,
Wei Xu, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Brendan Jackman, Johannes Weiner, Zi Yan, Oscar Salvador,
Qi Zheng, linux-kernel, linux-mm, linux-trace-kernel, linux-cxl,
kernel-team, Benjamin Cheatham
In-Reply-To: <01729baf359e4c6612aead53f1fcb644f782d1de.1772129168.git.d@ilvokhin.com>
On Thu, Feb 26, 2026 at 06:26:20PM +0000, Dmitry Ilvokhin wrote:
> Compaction uses compact_lock_irqsave(), which currently operates
> on a raw spinlock_t pointer so it can be used for both zone->lock
> and lruvec->lru_lock. Since zone lock operations are now wrapped,
> compact_lock_irqsave() can no longer directly operate on a
> spinlock_t when the lock belongs to a zone.
>
> Split the helper into compact_zone_lock_irqsave() and
> compact_lruvec_lock_irqsave(), duplicating the small amount of
> shared logic. As there are only two call sites and both statically
> know the lock type, this avoids introducing additional abstraction
> or runtime dispatch in the compaction path.
>
> No functional change intended.
>
> Signed-off-by: Dmitry Ilvokhin <d@ilvokhin.com>
Acked-by: Shakeel Butt <shakeel.butt@linux.dev>
^ permalink raw reply
* Re: [PATCH v5 1/3] ring-buffer: Flush and stop persistent ring buffer on panic
From: kernel test robot @ 2026-02-26 18:48 UTC (permalink / raw)
To: Masami Hiramatsu (Google), Steven Rostedt
Cc: oe-kbuild-all, Masami Hiramatsu, Mathieu Desnoyers, linux-kernel,
linux-trace-kernel
In-Reply-To: <177211311593.419230.2212568977306190482.stgit@mhiramat.tok.corp.google.com>
Hi Masami,
kernel test robot noticed the following build errors:
[auto build test ERROR on linus/master]
[also build test ERROR on v7.0-rc1 next-20260226]
[cannot apply to trace/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Masami-Hiramatsu-Google/ring-buffer-Flush-and-stop-persistent-ring-buffer-on-panic/20260226-222418
base: linus/master
patch link: https://lore.kernel.org/r/177211311593.419230.2212568977306190482.stgit%40mhiramat.tok.corp.google.com
patch subject: [PATCH v5 1/3] ring-buffer: Flush and stop persistent ring buffer on panic
config: sparc-randconfig-001-20260227 (https://download.01.org/0day-ci/archive/20260227/202602270244.3JWhusi4-lkp@intel.com/config)
compiler: sparc64-linux-gcc (GCC) 11.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260227/202602270244.3JWhusi4-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202602270244.3JWhusi4-lkp@intel.com/
All errors (new ones prefixed by >>):
kernel/trace/ring_buffer.c: In function 'rb_flush_buffer_cb':
>> kernel/trace/ring_buffer.c:2481:9: error: implicit declaration of function 'flush_cache_all'; did you mean 'flush_cache_page'? [-Werror=implicit-function-declaration]
2481 | flush_cache_all();
| ^~~~~~~~~~~~~~~
| flush_cache_page
cc1: some warnings being treated as errors
vim +2481 kernel/trace/ring_buffer.c
2475
2476 static int rb_flush_buffer_cb(struct notifier_block *nb, unsigned long event, void *data)
2477 {
2478 struct trace_buffer *buffer = container_of(nb, struct trace_buffer, flush_nb);
2479
2480 ring_buffer_record_off(buffer);
> 2481 flush_cache_all();
2482 return NOTIFY_DONE;
2483 }
2484
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* Re: [PATCH v6 14/16] sched_ext: Export task_is_scx_enabled() for verification
From: Gabriele Monaco @ 2026-02-26 18:39 UTC (permalink / raw)
To: Tejun Heo
Cc: linux-kernel, Andrea Righi, Joel Fernandes, Steven Rostedt,
Nam Cao, Juri Lelli, Ingo Molnar, Peter Zijlstra, sched-ext,
Tomas Glozar, Clark Williams, John Kacur, linux-trace-kernel
In-Reply-To: <aaCI08IDGXTLvwT8@slm.duckdns.org>
2026-02-26T17:54:35Z Tejun Heo <tj@kernel.org>:
> So, I don't know how rv works (searched a bit just now) but from kernel's
> POV, it seems to look mostly like an additional tracing framework, and
> testing p->sched_class against exported pointer value seems like a good fit
> for the use case, no? It's not like task_on_scx() or state testing is going
> to give you a "better" result anyway and it's actually rather confusing to
> use them outside scheduler proper as these are expected to be used while the
> task's rq lock is held. I don't think rv wants to (or even can) synchronize
> against scheduler internals. Using external observability mechanism seems
> like the better fit here.
Yeah you got a gist of it, essentially RV would be running from the tracepoint contexts, so in this specific scenario it would be synchronised with the scheduler.
Grabbing a pointer via kallsyms and comparing that will do exactly the same job, just a bit more "unofficially".
I can do that if you think such an "official" function won't really be useful. Indeed if that function wouldn't make sense without the rq lock, tracepoints are probably the only valid use case..
Thanks,
Gabriele
^ permalink raw reply
* [PATCH v3 5/5] mm: add tracepoints for zone lock
From: Dmitry Ilvokhin @ 2026-02-26 18:26 UTC (permalink / raw)
To: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Axel Rasmussen, Yuanchu Xie,
Wei Xu, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Brendan Jackman, Johannes Weiner, Zi Yan, Oscar Salvador,
Qi Zheng, Shakeel Butt
Cc: linux-kernel, linux-mm, linux-trace-kernel, linux-cxl,
kernel-team, Benjamin Cheatham, Dmitry Ilvokhin
In-Reply-To: <cover.1772129168.git.d@ilvokhin.com>
Add tracepoint instrumentation to zone lock acquire/release operations
via the previously introduced wrappers.
The implementation follows the mmap_lock tracepoint pattern: a
lightweight inline helper checks whether the tracepoint is enabled and
calls into an out-of-line helper when tracing is active. When
CONFIG_TRACING is disabled, helpers compile to empty inline stubs.
The fast path is unaffected when tracing is disabled.
Signed-off-by: Dmitry Ilvokhin <d@ilvokhin.com>
---
MAINTAINERS | 2 +
include/linux/zone_lock.h | 64 +++++++++++++++++++++++++++++++-
include/trace/events/zone_lock.h | 64 ++++++++++++++++++++++++++++++++
mm/Makefile | 2 +-
mm/zone_lock.c | 31 ++++++++++++++++
5 files changed, 161 insertions(+), 2 deletions(-)
create mode 100644 include/trace/events/zone_lock.h
create mode 100644 mm/zone_lock.c
diff --git a/MAINTAINERS b/MAINTAINERS
index 61e3d1f5bf43..b5aa2bb5d2ba 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -16681,6 +16681,7 @@ F: include/linux/ptdump.h
F: include/linux/vmpressure.h
F: include/linux/vmstat.h
F: include/linux/zone_lock.h
+F: include/trace/events/zone_lock.h
F: kernel/fork.c
F: mm/Kconfig
F: mm/debug.c
@@ -16700,6 +16701,7 @@ F: mm/sparse.c
F: mm/util.c
F: mm/vmpressure.c
F: mm/vmstat.c
+F: mm/zone_lock.c
N: include/linux/page[-_]*
MEMORY MANAGEMENT - EXECMEM
diff --git a/include/linux/zone_lock.h b/include/linux/zone_lock.h
index 5ce1aa38d500..f32ff0fae266 100644
--- a/include/linux/zone_lock.h
+++ b/include/linux/zone_lock.h
@@ -4,6 +4,53 @@
#include <linux/mmzone.h>
#include <linux/spinlock.h>
+#include <linux/tracepoint-defs.h>
+
+DECLARE_TRACEPOINT(zone_lock_start_locking);
+DECLARE_TRACEPOINT(zone_lock_acquire_returned);
+DECLARE_TRACEPOINT(zone_lock_released);
+
+#ifdef CONFIG_TRACING
+
+void __zone_lock_do_trace_start_locking(struct zone *zone);
+void __zone_lock_do_trace_acquire_returned(struct zone *zone, bool success);
+void __zone_lock_do_trace_released(struct zone *zone);
+
+static inline void __zone_lock_trace_start_locking(struct zone *zone)
+{
+ if (tracepoint_enabled(zone_lock_start_locking))
+ __zone_lock_do_trace_start_locking(zone);
+}
+
+static inline void __zone_lock_trace_acquire_returned(struct zone *zone,
+ bool success)
+{
+ if (tracepoint_enabled(zone_lock_acquire_returned))
+ __zone_lock_do_trace_acquire_returned(zone, success);
+}
+
+static inline void __zone_lock_trace_released(struct zone *zone)
+{
+ if (tracepoint_enabled(zone_lock_released))
+ __zone_lock_do_trace_released(zone);
+}
+
+#else /* !CONFIG_TRACING */
+
+static inline void __zone_lock_trace_start_locking(struct zone *zone)
+{
+}
+
+static inline void __zone_lock_trace_acquire_returned(struct zone *zone,
+ bool success)
+{
+}
+
+static inline void __zone_lock_trace_released(struct zone *zone)
+{
+}
+
+#endif /* CONFIG_TRACING */
static inline void zone_lock_init(struct zone *zone)
{
@@ -12,26 +59,41 @@ static inline void zone_lock_init(struct zone *zone)
#define zone_lock_irqsave(zone, flags) \
do { \
+ bool success = true; \
+ \
+ __zone_lock_trace_start_locking(zone); \
spin_lock_irqsave(&(zone)->_lock, flags); \
+ __zone_lock_trace_acquire_returned(zone, success); \
} while (0)
#define zone_trylock_irqsave(zone, flags) \
({ \
- spin_trylock_irqsave(&(zone)->_lock, flags); \
+ bool success; \
+ \
+ __zone_lock_trace_start_locking(zone); \
+ success = spin_trylock_irqsave(&(zone)->_lock, flags); \
+ __zone_lock_trace_acquire_returned(zone, success); \
+ success; \
})
static inline void zone_unlock_irqrestore(struct zone *zone, unsigned long flags)
{
+ __zone_lock_trace_released(zone);
spin_unlock_irqrestore(&zone->_lock, flags);
}
static inline void zone_lock_irq(struct zone *zone)
{
+ bool success = true;
+
+ __zone_lock_trace_start_locking(zone);
spin_lock_irq(&zone->_lock);
+ __zone_lock_trace_acquire_returned(zone, success);
}
static inline void zone_unlock_irq(struct zone *zone)
{
+ __zone_lock_trace_released(zone);
spin_unlock_irq(&zone->_lock);
}
diff --git a/include/trace/events/zone_lock.h b/include/trace/events/zone_lock.h
new file mode 100644
index 000000000000..3df82a8c0160
--- /dev/null
+++ b/include/trace/events/zone_lock.h
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM zone_lock
+
+#if !defined(_TRACE_ZONE_LOCK_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_ZONE_LOCK_H
+
+#include <linux/tracepoint.h>
+#include <linux/types.h>
+
+struct zone;
+
+DECLARE_EVENT_CLASS(zone_lock,
+
+ TP_PROTO(struct zone *zone),
+
+ TP_ARGS(zone),
+
+ TP_STRUCT__entry(
+ __field(struct zone *, zone)
+ ),
+
+ TP_fast_assign(
+ __entry->zone = zone;
+ ),
+
+ TP_printk("zone=%p", __entry->zone)
+);
+
+#define DEFINE_ZONE_LOCK_EVENT(name) \
+ DEFINE_EVENT(zone_lock, name, \
+ TP_PROTO(struct zone *zone), \
+ TP_ARGS(zone))
+
+DEFINE_ZONE_LOCK_EVENT(zone_lock_start_locking);
+DEFINE_ZONE_LOCK_EVENT(zone_lock_released);
+
+TRACE_EVENT(zone_lock_acquire_returned,
+
+ TP_PROTO(struct zone *zone, bool success),
+
+ TP_ARGS(zone, success),
+
+ TP_STRUCT__entry(
+ __field(struct zone *, zone)
+ __field(bool, success)
+ ),
+
+ TP_fast_assign(
+ __entry->zone = zone;
+ __entry->success = success;
+ ),
+
+ TP_printk(
+ "zone=%p success=%s",
+ __entry->zone,
+ __entry->success ? "true" : "false"
+ )
+);
+
+#endif /* _TRACE_ZONE_LOCK_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
diff --git a/mm/Makefile b/mm/Makefile
index 8ad2ab08244e..ffd06cf7a04e 100644
--- a/mm/Makefile
+++ b/mm/Makefile
@@ -55,7 +55,7 @@ obj-y := filemap.o mempool.o oom_kill.o fadvise.o \
mm_init.o percpu.o slab_common.o \
compaction.o show_mem.o \
interval_tree.o list_lru.o workingset.o \
- debug.o gup.o mmap_lock.o vma_init.o $(mmu-y)
+ debug.o gup.o mmap_lock.o zone_lock.o vma_init.o $(mmu-y)
# Give 'page_alloc' its own module-parameter namespace
page-alloc-y := page_alloc.o
diff --git a/mm/zone_lock.c b/mm/zone_lock.c
new file mode 100644
index 000000000000..f647fd2aca48
--- /dev/null
+++ b/mm/zone_lock.c
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0
+#define CREATE_TRACE_POINTS
+#include <trace/events/zone_lock.h>
+
+#include <linux/zone_lock.h>
+
+EXPORT_TRACEPOINT_SYMBOL(zone_lock_start_locking);
+EXPORT_TRACEPOINT_SYMBOL(zone_lock_acquire_returned);
+EXPORT_TRACEPOINT_SYMBOL(zone_lock_released);
+
+#ifdef CONFIG_TRACING
+
+void __zone_lock_do_trace_start_locking(struct zone *zone)
+{
+ trace_zone_lock_start_locking(zone);
+}
+EXPORT_SYMBOL(__zone_lock_do_trace_start_locking);
+
+void __zone_lock_do_trace_acquire_returned(struct zone *zone, bool success)
+{
+ trace_zone_lock_acquire_returned(zone, success);
+}
+EXPORT_SYMBOL(__zone_lock_do_trace_acquire_returned);
+
+void __zone_lock_do_trace_released(struct zone *zone)
+{
+ trace_zone_lock_released(zone);
+}
+EXPORT_SYMBOL(__zone_lock_do_trace_released);
+
+#endif /* CONFIG_TRACING */
--
2.47.3
^ permalink raw reply related
* [PATCH v3 4/5] mm: rename zone->lock to zone->_lock
From: Dmitry Ilvokhin @ 2026-02-26 18:26 UTC (permalink / raw)
To: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Axel Rasmussen, Yuanchu Xie,
Wei Xu, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Brendan Jackman, Johannes Weiner, Zi Yan, Oscar Salvador,
Qi Zheng, Shakeel Butt
Cc: linux-kernel, linux-mm, linux-trace-kernel, linux-cxl,
kernel-team, Benjamin Cheatham, Dmitry Ilvokhin
In-Reply-To: <cover.1772129168.git.d@ilvokhin.com>
This intentionally breaks direct users of zone->lock at compile time so
all call sites are converted to the zone lock wrappers. Without the
rename, present and future out-of-tree code could continue using
spin_lock(&zone->lock) and bypass the wrappers and tracing
infrastructure.
No functional change intended.
Suggested-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Dmitry Ilvokhin <d@ilvokhin.com>
---
include/linux/mmzone.h | 7 +++++--
include/linux/zone_lock.h | 12 ++++++------
mm/compaction.c | 4 ++--
mm/internal.h | 2 +-
mm/page_alloc.c | 16 ++++++++--------
mm/page_isolation.c | 4 ++--
mm/page_owner.c | 2 +-
7 files changed, 25 insertions(+), 22 deletions(-)
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 3e51190a55e4..32bca655fce5 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -1009,8 +1009,11 @@ struct zone {
/* zone flags, see below */
unsigned long flags;
- /* Primarily protects free_area */
- spinlock_t lock;
+ /*
+ * Primarily protects free_area. Should be accessed via zone_lock_*
+ * helpers.
+ */
+ spinlock_t _lock;
/* Pages to be freed when next trylock succeeds */
struct llist_head trylock_free_pages;
diff --git a/include/linux/zone_lock.h b/include/linux/zone_lock.h
index c531e26280e6..5ce1aa38d500 100644
--- a/include/linux/zone_lock.h
+++ b/include/linux/zone_lock.h
@@ -7,32 +7,32 @@
static inline void zone_lock_init(struct zone *zone)
{
- spin_lock_init(&zone->lock);
+ spin_lock_init(&zone->_lock);
}
#define zone_lock_irqsave(zone, flags) \
do { \
- spin_lock_irqsave(&(zone)->lock, flags); \
+ spin_lock_irqsave(&(zone)->_lock, flags); \
} while (0)
#define zone_trylock_irqsave(zone, flags) \
({ \
- spin_trylock_irqsave(&(zone)->lock, flags); \
+ spin_trylock_irqsave(&(zone)->_lock, flags); \
})
static inline void zone_unlock_irqrestore(struct zone *zone, unsigned long flags)
{
- spin_unlock_irqrestore(&zone->lock, flags);
+ spin_unlock_irqrestore(&zone->_lock, flags);
}
static inline void zone_lock_irq(struct zone *zone)
{
- spin_lock_irq(&zone->lock);
+ spin_lock_irq(&zone->_lock);
}
static inline void zone_unlock_irq(struct zone *zone)
{
- spin_unlock_irq(&zone->lock);
+ spin_unlock_irq(&zone->_lock);
}
#endif /* _LINUX_ZONE_LOCK_H */
diff --git a/mm/compaction.c b/mm/compaction.c
index 9f7997e827bd..aed5bf468fd3 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -506,7 +506,7 @@ static bool test_and_set_skip(struct compact_control *cc, struct page *page)
static bool compact_zone_lock_irqsave(struct zone *zone,
unsigned long *flags,
struct compact_control *cc)
-__acquires(&zone->lock)
+__acquires(&zone->_lock)
{
/* Track if the lock is contended in async mode */
if (cc->mode == MIGRATE_ASYNC && !cc->contended) {
@@ -1402,7 +1402,7 @@ static bool suitable_migration_target(struct compact_control *cc,
int order = cc->order > 0 ? cc->order : pageblock_order;
/*
- * We are checking page_order without zone->lock taken. But
+ * We are checking page_order without zone->_lock taken. But
* the only small danger is that we skip a potentially suitable
* pageblock, so it's not worth to check order for valid range.
*/
diff --git a/mm/internal.h b/mm/internal.h
index cb0af847d7d9..6cb06e21ce15 100644
--- a/mm/internal.h
+++ b/mm/internal.h
@@ -710,7 +710,7 @@ static inline unsigned int buddy_order(struct page *page)
* (d) a page and its buddy are in the same zone.
*
* For recording whether a page is in the buddy system, we set PageBuddy.
- * Setting, clearing, and testing PageBuddy is serialized by zone->lock.
+ * Setting, clearing, and testing PageBuddy is serialized by zone->_lock.
*
* For recording page's order, we use page_private(page).
*/
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index c5d13fe9b79f..56ca27a07a62 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -815,7 +815,7 @@ compaction_capture(struct capture_control *capc, struct page *page,
static inline void account_freepages(struct zone *zone, int nr_pages,
int migratetype)
{
- lockdep_assert_held(&zone->lock);
+ lockdep_assert_held(&zone->_lock);
if (is_migrate_isolate(migratetype))
return;
@@ -2473,7 +2473,7 @@ enum rmqueue_mode {
/*
* Do the hard work of removing an element from the buddy allocator.
- * Call me with the zone->lock already held.
+ * Call me with the zone->_lock already held.
*/
static __always_inline struct page *
__rmqueue(struct zone *zone, unsigned int order, int migratetype,
@@ -2501,7 +2501,7 @@ __rmqueue(struct zone *zone, unsigned int order, int migratetype,
* fallbacks modes with increasing levels of fragmentation risk.
*
* The fallback logic is expensive and rmqueue_bulk() calls in
- * a loop with the zone->lock held, meaning the freelists are
+ * a loop with the zone->_lock held, meaning the freelists are
* not subject to any outside changes. Remember in *mode where
* we found pay dirt, to save us the search on the next call.
*/
@@ -3203,7 +3203,7 @@ void __putback_isolated_page(struct page *page, unsigned int order, int mt)
struct zone *zone = page_zone(page);
/* zone lock should be held when this function is called */
- lockdep_assert_held(&zone->lock);
+ lockdep_assert_held(&zone->_lock);
/* Return isolated page to tail of freelist. */
__free_one_page(page, page_to_pfn(page), zone, order, mt,
@@ -7086,7 +7086,7 @@ int alloc_contig_frozen_range_noprof(unsigned long start, unsigned long end,
* pages. Because of this, we reserve the bigger range and
* once this is done free the pages we are not interested in.
*
- * We don't have to hold zone->lock here because the pages are
+ * We don't have to hold zone->_lock here because the pages are
* isolated thus they won't get removed from buddy.
*/
outer_start = find_large_buddy(start);
@@ -7655,7 +7655,7 @@ void accept_page(struct page *page)
return;
}
- /* Unlocks zone->lock */
+ /* Unlocks zone->_lock */
__accept_page(zone, &flags, page);
}
@@ -7672,7 +7672,7 @@ static bool try_to_accept_memory_one(struct zone *zone)
return false;
}
- /* Unlocks zone->lock */
+ /* Unlocks zone->_lock */
__accept_page(zone, &flags, page);
return true;
@@ -7813,7 +7813,7 @@ struct page *alloc_frozen_pages_nolock_noprof(gfp_t gfp_flags, int nid, unsigned
/*
* Best effort allocation from percpu free list.
- * If it's empty attempt to spin_trylock zone->lock.
+ * If it's empty attempt to spin_trylock zone->_lock.
*/
page = get_page_from_freelist(alloc_gfp, order, alloc_flags, &ac);
diff --git a/mm/page_isolation.c b/mm/page_isolation.c
index 56a272f38b66..78b58dae2015 100644
--- a/mm/page_isolation.c
+++ b/mm/page_isolation.c
@@ -212,7 +212,7 @@ static int set_migratetype_isolate(struct page *page, enum pb_isolate_mode mode,
zone_unlock_irqrestore(zone, flags);
if (mode == PB_ISOLATE_MODE_MEM_OFFLINE) {
/*
- * printk() with zone->lock held will likely trigger a
+ * printk() with zone->_lock held will likely trigger a
* lockdep splat, so defer it here.
*/
dump_page(unmovable, "unmovable page");
@@ -553,7 +553,7 @@ void undo_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn)
/*
* Test all pages in the range is free(means isolated) or not.
* all pages in [start_pfn...end_pfn) must be in the same zone.
- * zone->lock must be held before call this.
+ * zone->_lock must be held before call this.
*
* Returns the last tested pfn.
*/
diff --git a/mm/page_owner.c b/mm/page_owner.c
index 8178e0be557f..54a4ba63b14f 100644
--- a/mm/page_owner.c
+++ b/mm/page_owner.c
@@ -799,7 +799,7 @@ static void init_pages_in_zone(struct zone *zone)
continue;
/*
- * To avoid having to grab zone->lock, be a little
+ * To avoid having to grab zone->_lock, be a little
* careful when reading buddy page order. The only
* danger is that we skip too much and potentially miss
* some early allocated pages, which is better than
--
2.47.3
^ permalink raw reply related
* [PATCH v3 3/5] mm: convert compaction to zone lock wrappers
From: Dmitry Ilvokhin @ 2026-02-26 18:26 UTC (permalink / raw)
To: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Axel Rasmussen, Yuanchu Xie,
Wei Xu, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Brendan Jackman, Johannes Weiner, Zi Yan, Oscar Salvador,
Qi Zheng, Shakeel Butt
Cc: linux-kernel, linux-mm, linux-trace-kernel, linux-cxl,
kernel-team, Benjamin Cheatham, Dmitry Ilvokhin
In-Reply-To: <cover.1772129168.git.d@ilvokhin.com>
Compaction uses compact_lock_irqsave(), which currently operates
on a raw spinlock_t pointer so it can be used for both zone->lock
and lruvec->lru_lock. Since zone lock operations are now wrapped,
compact_lock_irqsave() can no longer directly operate on a
spinlock_t when the lock belongs to a zone.
Split the helper into compact_zone_lock_irqsave() and
compact_lruvec_lock_irqsave(), duplicating the small amount of
shared logic. As there are only two call sites and both statically
know the lock type, this avoids introducing additional abstraction
or runtime dispatch in the compaction path.
No functional change intended.
Signed-off-by: Dmitry Ilvokhin <d@ilvokhin.com>
---
mm/compaction.c | 33 ++++++++++++++++++++++++---------
1 file changed, 24 insertions(+), 9 deletions(-)
diff --git a/mm/compaction.c b/mm/compaction.c
index 47b26187a5df..9f7997e827bd 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -503,19 +503,36 @@ static bool test_and_set_skip(struct compact_control *cc, struct page *page)
*
* Always returns true which makes it easier to track lock state in callers.
*/
-static bool compact_lock_irqsave(spinlock_t *lock, unsigned long *flags,
- struct compact_control *cc)
- __acquires(lock)
+static bool compact_zone_lock_irqsave(struct zone *zone,
+ unsigned long *flags,
+ struct compact_control *cc)
+__acquires(&zone->lock)
{
/* Track if the lock is contended in async mode */
if (cc->mode == MIGRATE_ASYNC && !cc->contended) {
- if (spin_trylock_irqsave(lock, *flags))
+ if (zone_trylock_irqsave(zone, *flags))
return true;
cc->contended = true;
}
- spin_lock_irqsave(lock, *flags);
+ zone_lock_irqsave(zone, *flags);
+ return true;
+}
+
+static bool compact_lruvec_lock_irqsave(struct lruvec *lruvec,
+ unsigned long *flags,
+ struct compact_control *cc)
+__acquires(&lruvec->lru_lock)
+{
+ if (cc->mode == MIGRATE_ASYNC && !cc->contended) {
+ if (spin_trylock_irqsave(&lruvec->lru_lock, *flags))
+ return true;
+
+ cc->contended = true;
+ }
+
+ spin_lock_irqsave(&lruvec->lru_lock, *flags);
return true;
}
@@ -531,7 +548,6 @@ static bool compact_lock_irqsave(spinlock_t *lock, unsigned long *flags,
* Returns true if compaction should abort due to fatal signal pending.
* Returns false when compaction can continue.
*/
-
static bool compact_unlock_should_abort(struct zone *zone,
unsigned long flags,
bool *locked,
@@ -616,8 +632,7 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
/* If we already hold the lock, we can skip some rechecking. */
if (!locked) {
- locked = compact_lock_irqsave(&cc->zone->lock,
- &flags, cc);
+ locked = compact_zone_lock_irqsave(cc->zone, &flags, cc);
/* Recheck this is a buddy page under lock */
if (!PageBuddy(page))
@@ -1163,7 +1178,7 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn,
if (locked)
unlock_page_lruvec_irqrestore(locked, flags);
- compact_lock_irqsave(&lruvec->lru_lock, &flags, cc);
+ compact_lruvec_lock_irqsave(lruvec, &flags, cc);
locked = lruvec;
lruvec_memcg_debug(lruvec, folio);
--
2.47.3
^ permalink raw reply related
* [PATCH v3 2/5] mm: convert zone lock users to wrappers
From: Dmitry Ilvokhin @ 2026-02-26 18:26 UTC (permalink / raw)
To: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Axel Rasmussen, Yuanchu Xie,
Wei Xu, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Brendan Jackman, Johannes Weiner, Zi Yan, Oscar Salvador,
Qi Zheng, Shakeel Butt
Cc: linux-kernel, linux-mm, linux-trace-kernel, linux-cxl,
kernel-team, Benjamin Cheatham, Dmitry Ilvokhin
In-Reply-To: <cover.1772129168.git.d@ilvokhin.com>
Replace direct zone lock acquire/release operations with the
newly introduced wrappers.
The changes are purely mechanical substitutions. No functional change
intended. Locking semantics and ordering remain unchanged.
The compaction path is left unchanged for now and will be
handled separately in the following patch due to additional
non-trivial modifications.
Signed-off-by: Dmitry Ilvokhin <d@ilvokhin.com>
Acked-by: Shakeel Butt <shakeel.butt@linux.dev>
---
mm/compaction.c | 25 +++++++++-------
mm/memory_hotplug.c | 9 +++---
mm/mm_init.c | 3 +-
mm/page_alloc.c | 73 +++++++++++++++++++++++----------------------
mm/page_isolation.c | 19 ++++++------
mm/page_reporting.c | 13 ++++----
mm/show_mem.c | 5 ++--
mm/vmscan.c | 5 ++--
mm/vmstat.c | 9 +++---
9 files changed, 86 insertions(+), 75 deletions(-)
diff --git a/mm/compaction.c b/mm/compaction.c
index 1e8f8eca318c..47b26187a5df 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -24,6 +24,7 @@
#include <linux/page_owner.h>
#include <linux/psi.h>
#include <linux/cpuset.h>
+#include <linux/zone_lock.h>
#include "internal.h"
#ifdef CONFIG_COMPACTION
@@ -530,11 +531,14 @@ static bool compact_lock_irqsave(spinlock_t *lock, unsigned long *flags,
* Returns true if compaction should abort due to fatal signal pending.
* Returns false when compaction can continue.
*/
-static bool compact_unlock_should_abort(spinlock_t *lock,
- unsigned long flags, bool *locked, struct compact_control *cc)
+
+static bool compact_unlock_should_abort(struct zone *zone,
+ unsigned long flags,
+ bool *locked,
+ struct compact_control *cc)
{
if (*locked) {
- spin_unlock_irqrestore(lock, flags);
+ zone_unlock_irqrestore(zone, flags);
*locked = false;
}
@@ -582,9 +586,8 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
* contention, to give chance to IRQs. Abort if fatal signal
* pending.
*/
- if (!(blockpfn % COMPACT_CLUSTER_MAX)
- && compact_unlock_should_abort(&cc->zone->lock, flags,
- &locked, cc))
+ if (!(blockpfn % COMPACT_CLUSTER_MAX) &&
+ compact_unlock_should_abort(cc->zone, flags, &locked, cc))
break;
nr_scanned++;
@@ -649,7 +652,7 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
}
if (locked)
- spin_unlock_irqrestore(&cc->zone->lock, flags);
+ zone_unlock_irqrestore(cc->zone, flags);
/*
* Be careful to not go outside of the pageblock.
@@ -1555,7 +1558,7 @@ static void fast_isolate_freepages(struct compact_control *cc)
if (!area->nr_free)
continue;
- spin_lock_irqsave(&cc->zone->lock, flags);
+ zone_lock_irqsave(cc->zone, flags);
freelist = &area->free_list[MIGRATE_MOVABLE];
list_for_each_entry_reverse(freepage, freelist, buddy_list) {
unsigned long pfn;
@@ -1614,7 +1617,7 @@ static void fast_isolate_freepages(struct compact_control *cc)
}
}
- spin_unlock_irqrestore(&cc->zone->lock, flags);
+ zone_unlock_irqrestore(cc->zone, flags);
/* Skip fast search if enough freepages isolated */
if (cc->nr_freepages >= cc->nr_migratepages)
@@ -1988,7 +1991,7 @@ static unsigned long fast_find_migrateblock(struct compact_control *cc)
if (!area->nr_free)
continue;
- spin_lock_irqsave(&cc->zone->lock, flags);
+ zone_lock_irqsave(cc->zone, flags);
freelist = &area->free_list[MIGRATE_MOVABLE];
list_for_each_entry(freepage, freelist, buddy_list) {
unsigned long free_pfn;
@@ -2021,7 +2024,7 @@ static unsigned long fast_find_migrateblock(struct compact_control *cc)
break;
}
}
- spin_unlock_irqrestore(&cc->zone->lock, flags);
+ zone_unlock_irqrestore(cc->zone, flags);
}
cc->total_migrate_scanned += nr_scanned;
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index bc805029da51..cfc0103fa50e 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -36,6 +36,7 @@
#include <linux/rmap.h>
#include <linux/module.h>
#include <linux/node.h>
+#include <linux/zone_lock.h>
#include <asm/tlbflush.h>
@@ -1190,9 +1191,9 @@ int online_pages(unsigned long pfn, unsigned long nr_pages,
* Fixup the number of isolated pageblocks before marking the sections
* onlining, such that undo_isolate_page_range() works correctly.
*/
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
zone->nr_isolate_pageblock += nr_pages / pageblock_nr_pages;
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
/*
* If this zone is not populated, then it is not in zonelist.
@@ -2041,9 +2042,9 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages,
* effectively stale; nobody should be touching them. Fixup the number
* of isolated pageblocks, memory onlining will properly revert this.
*/
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
zone->nr_isolate_pageblock -= nr_pages / pageblock_nr_pages;
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
lru_cache_enable();
zone_pcp_enable(zone);
diff --git a/mm/mm_init.c b/mm/mm_init.c
index 61d983d23f55..6dd37621248b 100644
--- a/mm/mm_init.c
+++ b/mm/mm_init.c
@@ -32,6 +32,7 @@
#include <linux/vmstat.h>
#include <linux/kexec_handover.h>
#include <linux/hugetlb.h>
+#include <linux/zone_lock.h>
#include "internal.h"
#include "slab.h"
#include "shuffle.h"
@@ -1425,7 +1426,7 @@ static void __meminit zone_init_internals(struct zone *zone, enum zone_type idx,
zone_set_nid(zone, nid);
zone->name = zone_names[idx];
zone->zone_pgdat = NODE_DATA(nid);
- spin_lock_init(&zone->lock);
+ zone_lock_init(zone);
zone_seqlock_init(zone);
zone_pcp_init(zone);
}
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index fcc32737f451..c5d13fe9b79f 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -54,6 +54,7 @@
#include <linux/delayacct.h>
#include <linux/cacheinfo.h>
#include <linux/pgalloc_tag.h>
+#include <linux/zone_lock.h>
#include <asm/div64.h>
#include "internal.h"
#include "shuffle.h"
@@ -1500,7 +1501,7 @@ static void free_pcppages_bulk(struct zone *zone, int count,
/* Ensure requested pindex is drained first. */
pindex = pindex - 1;
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
while (count > 0) {
struct list_head *list;
@@ -1533,7 +1534,7 @@ static void free_pcppages_bulk(struct zone *zone, int count,
} while (count > 0 && !list_empty(list));
}
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
}
/* Split a multi-block free page into its individual pageblocks. */
@@ -1577,12 +1578,12 @@ static void free_one_page(struct zone *zone, struct page *page,
unsigned long flags;
if (unlikely(fpi_flags & FPI_TRYLOCK)) {
- if (!spin_trylock_irqsave(&zone->lock, flags)) {
+ if (!zone_trylock_irqsave(zone, flags)) {
add_page_to_zone_llist(zone, page, order);
return;
}
} else {
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
}
/* The lock succeeded. Process deferred pages. */
@@ -1600,7 +1601,7 @@ static void free_one_page(struct zone *zone, struct page *page,
}
}
split_large_buddy(zone, page, pfn, order, fpi_flags);
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
__count_vm_events(PGFREE, 1 << order);
}
@@ -2553,10 +2554,10 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order,
int i;
if (unlikely(alloc_flags & ALLOC_TRYLOCK)) {
- if (!spin_trylock_irqsave(&zone->lock, flags))
+ if (!zone_trylock_irqsave(zone, flags))
return 0;
} else {
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
}
for (i = 0; i < count; ++i) {
struct page *page = __rmqueue(zone, order, migratetype,
@@ -2576,7 +2577,7 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order,
*/
list_add_tail(&page->pcp_list, list);
}
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
return i;
}
@@ -3246,10 +3247,10 @@ struct page *rmqueue_buddy(struct zone *preferred_zone, struct zone *zone,
do {
page = NULL;
if (unlikely(alloc_flags & ALLOC_TRYLOCK)) {
- if (!spin_trylock_irqsave(&zone->lock, flags))
+ if (!zone_trylock_irqsave(zone, flags))
return NULL;
} else {
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
}
if (alloc_flags & ALLOC_HIGHATOMIC)
page = __rmqueue_smallest(zone, order, MIGRATE_HIGHATOMIC);
@@ -3268,11 +3269,11 @@ struct page *rmqueue_buddy(struct zone *preferred_zone, struct zone *zone,
page = __rmqueue_smallest(zone, order, MIGRATE_HIGHATOMIC);
if (!page) {
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
return NULL;
}
}
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
} while (check_new_pages(page, order));
__count_zid_vm_events(PGALLOC, page_zonenum(page), 1 << order);
@@ -3459,7 +3460,7 @@ static void reserve_highatomic_pageblock(struct page *page, int order,
if (zone->nr_reserved_highatomic >= max_managed)
return;
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
/* Recheck the nr_reserved_highatomic limit under the lock */
if (zone->nr_reserved_highatomic >= max_managed)
@@ -3481,7 +3482,7 @@ static void reserve_highatomic_pageblock(struct page *page, int order,
}
out_unlock:
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
}
/*
@@ -3514,7 +3515,7 @@ static bool unreserve_highatomic_pageblock(const struct alloc_context *ac,
pageblock_nr_pages)
continue;
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
for (order = 0; order < NR_PAGE_ORDERS; order++) {
struct free_area *area = &(zone->free_area[order]);
unsigned long size;
@@ -3562,11 +3563,11 @@ static bool unreserve_highatomic_pageblock(const struct alloc_context *ac,
*/
WARN_ON_ONCE(ret == -1);
if (ret > 0) {
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
return ret;
}
}
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
}
return false;
@@ -6446,7 +6447,7 @@ static void __setup_per_zone_wmarks(void)
for_each_zone(zone) {
u64 tmp;
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
tmp = (u64)pages_min * zone_managed_pages(zone);
tmp = div64_ul(tmp, lowmem_pages);
if (is_highmem(zone) || zone_idx(zone) == ZONE_MOVABLE) {
@@ -6487,7 +6488,7 @@ static void __setup_per_zone_wmarks(void)
zone->_watermark[WMARK_PROMO] = high_wmark_pages(zone) + tmp;
trace_mm_setup_per_zone_wmarks(zone);
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
}
/* update totalreserve_pages */
@@ -7257,7 +7258,7 @@ struct page *alloc_contig_frozen_pages_noprof(unsigned long nr_pages,
zonelist = node_zonelist(nid, gfp_mask);
for_each_zone_zonelist_nodemask(zone, z, zonelist,
gfp_zone(gfp_mask), nodemask) {
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
pfn = ALIGN(zone->zone_start_pfn, nr_pages);
while (zone_spans_last_pfn(zone, pfn, nr_pages)) {
@@ -7271,18 +7272,18 @@ struct page *alloc_contig_frozen_pages_noprof(unsigned long nr_pages,
* allocation spinning on this lock, it may
* win the race and cause allocation to fail.
*/
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
ret = alloc_contig_frozen_range_noprof(pfn,
pfn + nr_pages,
ACR_FLAGS_NONE,
gfp_mask);
if (!ret)
return pfn_to_page(pfn);
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
}
pfn += nr_pages;
}
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
}
/*
* If we failed, retry the search, but treat regions with HugeTLB pages
@@ -7436,7 +7437,7 @@ unsigned long __offline_isolated_pages(unsigned long start_pfn,
offline_mem_sections(pfn, end_pfn);
zone = page_zone(pfn_to_page(pfn));
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
while (pfn < end_pfn) {
page = pfn_to_page(pfn);
/*
@@ -7466,7 +7467,7 @@ unsigned long __offline_isolated_pages(unsigned long start_pfn,
del_page_from_free_list(page, zone, order, MIGRATE_ISOLATE);
pfn += (1 << order);
}
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
return end_pfn - start_pfn - already_offline;
}
@@ -7542,7 +7543,7 @@ bool take_page_off_buddy(struct page *page)
unsigned int order;
bool ret = false;
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
for (order = 0; order < NR_PAGE_ORDERS; order++) {
struct page *page_head = page - (pfn & ((1 << order) - 1));
int page_order = buddy_order(page_head);
@@ -7563,7 +7564,7 @@ bool take_page_off_buddy(struct page *page)
if (page_count(page_head) > 0)
break;
}
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
return ret;
}
@@ -7576,7 +7577,7 @@ bool put_page_back_buddy(struct page *page)
unsigned long flags;
bool ret = false;
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
if (put_page_testzero(page)) {
unsigned long pfn = page_to_pfn(page);
int migratetype = get_pfnblock_migratetype(page, pfn);
@@ -7587,7 +7588,7 @@ bool put_page_back_buddy(struct page *page)
ret = true;
}
}
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
return ret;
}
@@ -7636,7 +7637,7 @@ static void __accept_page(struct zone *zone, unsigned long *flags,
account_freepages(zone, -MAX_ORDER_NR_PAGES, MIGRATE_MOVABLE);
__mod_zone_page_state(zone, NR_UNACCEPTED, -MAX_ORDER_NR_PAGES);
__ClearPageUnaccepted(page);
- spin_unlock_irqrestore(&zone->lock, *flags);
+ zone_unlock_irqrestore(zone, *flags);
accept_memory(page_to_phys(page), PAGE_SIZE << MAX_PAGE_ORDER);
@@ -7648,9 +7649,9 @@ void accept_page(struct page *page)
struct zone *zone = page_zone(page);
unsigned long flags;
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
if (!PageUnaccepted(page)) {
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
return;
}
@@ -7663,11 +7664,11 @@ static bool try_to_accept_memory_one(struct zone *zone)
unsigned long flags;
struct page *page;
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
page = list_first_entry_or_null(&zone->unaccepted_pages,
struct page, lru);
if (!page) {
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
return false;
}
@@ -7724,12 +7725,12 @@ static bool __free_unaccepted(struct page *page)
if (!lazy_accept)
return false;
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
list_add_tail(&page->lru, &zone->unaccepted_pages);
account_freepages(zone, MAX_ORDER_NR_PAGES, MIGRATE_MOVABLE);
__mod_zone_page_state(zone, NR_UNACCEPTED, MAX_ORDER_NR_PAGES);
__SetPageUnaccepted(page);
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
return true;
}
diff --git a/mm/page_isolation.c b/mm/page_isolation.c
index c48ff5c00244..56a272f38b66 100644
--- a/mm/page_isolation.c
+++ b/mm/page_isolation.c
@@ -10,6 +10,7 @@
#include <linux/hugetlb.h>
#include <linux/page_owner.h>
#include <linux/migrate.h>
+#include <linux/zone_lock.h>
#include "internal.h"
#define CREATE_TRACE_POINTS
@@ -173,7 +174,7 @@ static int set_migratetype_isolate(struct page *page, enum pb_isolate_mode mode,
if (PageUnaccepted(page))
accept_page(page);
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
/*
* We assume the caller intended to SET migrate type to isolate.
@@ -181,7 +182,7 @@ static int set_migratetype_isolate(struct page *page, enum pb_isolate_mode mode,
* set it before us.
*/
if (is_migrate_isolate_page(page)) {
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
return -EBUSY;
}
@@ -200,15 +201,15 @@ static int set_migratetype_isolate(struct page *page, enum pb_isolate_mode mode,
mode);
if (!unmovable) {
if (!pageblock_isolate_and_move_free_pages(zone, page)) {
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
return -EBUSY;
}
zone->nr_isolate_pageblock++;
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
return 0;
}
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
if (mode == PB_ISOLATE_MODE_MEM_OFFLINE) {
/*
* printk() with zone->lock held will likely trigger a
@@ -229,7 +230,7 @@ static void unset_migratetype_isolate(struct page *page)
struct page *buddy;
zone = page_zone(page);
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
if (!is_migrate_isolate_page(page))
goto out;
@@ -280,7 +281,7 @@ static void unset_migratetype_isolate(struct page *page)
}
zone->nr_isolate_pageblock--;
out:
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
}
static inline struct page *
@@ -641,9 +642,9 @@ int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn,
/* Check all pages are free or marked as ISOLATED */
zone = page_zone(page);
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
pfn = __test_page_isolated_in_pageblock(start_pfn, end_pfn, mode);
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
ret = pfn < end_pfn ? -EBUSY : 0;
diff --git a/mm/page_reporting.c b/mm/page_reporting.c
index f0042d5743af..37e54e16538b 100644
--- a/mm/page_reporting.c
+++ b/mm/page_reporting.c
@@ -7,6 +7,7 @@
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/scatterlist.h>
+#include <linux/zone_lock.h>
#include "page_reporting.h"
#include "internal.h"
@@ -161,7 +162,7 @@ page_reporting_cycle(struct page_reporting_dev_info *prdev, struct zone *zone,
if (list_empty(list))
return err;
- spin_lock_irq(&zone->lock);
+ zone_lock_irq(zone);
/*
* Limit how many calls we will be making to the page reporting
@@ -219,7 +220,7 @@ page_reporting_cycle(struct page_reporting_dev_info *prdev, struct zone *zone,
list_rotate_to_front(&page->lru, list);
/* release lock before waiting on report processing */
- spin_unlock_irq(&zone->lock);
+ zone_unlock_irq(zone);
/* begin processing pages in local list */
err = prdev->report(prdev, sgl, PAGE_REPORTING_CAPACITY);
@@ -231,7 +232,7 @@ page_reporting_cycle(struct page_reporting_dev_info *prdev, struct zone *zone,
budget--;
/* reacquire zone lock and resume processing */
- spin_lock_irq(&zone->lock);
+ zone_lock_irq(zone);
/* flush reported pages from the sg list */
page_reporting_drain(prdev, sgl, PAGE_REPORTING_CAPACITY, !err);
@@ -251,7 +252,7 @@ page_reporting_cycle(struct page_reporting_dev_info *prdev, struct zone *zone,
if (!list_entry_is_head(next, list, lru) && !list_is_first(&next->lru, list))
list_rotate_to_front(&next->lru, list);
- spin_unlock_irq(&zone->lock);
+ zone_unlock_irq(zone);
return err;
}
@@ -296,9 +297,9 @@ page_reporting_process_zone(struct page_reporting_dev_info *prdev,
err = prdev->report(prdev, sgl, leftover);
/* flush any remaining pages out from the last report */
- spin_lock_irq(&zone->lock);
+ zone_lock_irq(zone);
page_reporting_drain(prdev, sgl, leftover, !err);
- spin_unlock_irq(&zone->lock);
+ zone_unlock_irq(zone);
}
return err;
diff --git a/mm/show_mem.c b/mm/show_mem.c
index 24078ac3e6bc..245beca127af 100644
--- a/mm/show_mem.c
+++ b/mm/show_mem.c
@@ -14,6 +14,7 @@
#include <linux/mmzone.h>
#include <linux/swap.h>
#include <linux/vmstat.h>
+#include <linux/zone_lock.h>
#include "internal.h"
#include "swap.h"
@@ -363,7 +364,7 @@ static void show_free_areas(unsigned int filter, nodemask_t *nodemask, int max_z
show_node(zone);
printk(KERN_CONT "%s: ", zone->name);
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
for (order = 0; order < NR_PAGE_ORDERS; order++) {
struct free_area *area = &zone->free_area[order];
int type;
@@ -377,7 +378,7 @@ static void show_free_areas(unsigned int filter, nodemask_t *nodemask, int max_z
types[order] |= 1 << type;
}
}
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
for (order = 0; order < NR_PAGE_ORDERS; order++) {
printk(KERN_CONT "%lu*%lukB ",
nr[order], K(1UL) << order);
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 0fc9373e8251..b369e00e8415 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -58,6 +58,7 @@
#include <linux/random.h>
#include <linux/mmu_notifier.h>
#include <linux/parser.h>
+#include <linux/zone_lock.h>
#include <asm/tlbflush.h>
#include <asm/div64.h>
@@ -7139,9 +7140,9 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int highest_zoneidx)
/* Increments are under the zone lock */
zone = pgdat->node_zones + i;
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
zone->watermark_boost -= min(zone->watermark_boost, zone_boosts[i]);
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
}
/*
diff --git a/mm/vmstat.c b/mm/vmstat.c
index 86b14b0f77b5..299b461a6b4b 100644
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
@@ -28,6 +28,7 @@
#include <linux/mm_inline.h>
#include <linux/page_owner.h>
#include <linux/sched/isolation.h>
+#include <linux/zone_lock.h>
#include "internal.h"
@@ -1535,10 +1536,10 @@ static void walk_zones_in_node(struct seq_file *m, pg_data_t *pgdat,
continue;
if (!nolock)
- spin_lock_irqsave(&zone->lock, flags);
+ zone_lock_irqsave(zone, flags);
print(m, pgdat, zone);
if (!nolock)
- spin_unlock_irqrestore(&zone->lock, flags);
+ zone_unlock_irqrestore(zone, flags);
}
}
#endif
@@ -1603,9 +1604,9 @@ static void pagetypeinfo_showfree_print(struct seq_file *m,
}
}
seq_printf(m, "%s%6lu ", overflow ? ">" : "", freecount);
- spin_unlock_irq(&zone->lock);
+ zone_unlock_irq(zone);
cond_resched();
- spin_lock_irq(&zone->lock);
+ zone_lock_irq(zone);
}
seq_putc(m, '\n');
}
--
2.47.3
^ permalink raw reply related
* [PATCH v3 0/5] mm: zone lock tracepoint instrumentation
From: Dmitry Ilvokhin @ 2026-02-26 18:26 UTC (permalink / raw)
To: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Axel Rasmussen, Yuanchu Xie,
Wei Xu, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Brendan Jackman, Johannes Weiner, Zi Yan, Oscar Salvador,
Qi Zheng, Shakeel Butt
Cc: linux-kernel, linux-mm, linux-trace-kernel, linux-cxl,
kernel-team, Benjamin Cheatham, Dmitry Ilvokhin
Zone lock contention can significantly impact allocation and
reclaim latency, as it is a central synchronization point in
the page allocator and reclaim paths. Improved visibility into
its behavior is therefore important for diagnosing performance
issues in memory-intensive workloads.
On some production workloads at Meta, we have observed noticeable
zone lock contention. Deeper analysis of lock holders and waiters
is currently difficult with existing instrumentation.
While generic lock contention_begin/contention_end tracepoints
cover the slow path, they do not provide sufficient visibility
into lock hold times. In particular, the lack of a release-side
event makes it difficult to identify long lock holders and
correlate them with waiters. As a result, distinguishing between
short bursts of contention and pathological long hold times
requires additional instrumentation.
This patch series adds dedicated tracepoint instrumentation to
zone lock, following the existing mmap_lock tracing model.
The goal is to enable detailed holder/waiter analysis and lock
hold time measurements without affecting the fast path when
tracing is disabled.
The series is structured as follows:
1. Introduce zone lock wrappers.
2. Mechanically convert zone lock users to the wrappers.
3. Convert compaction to use the wrappers (requires minor
restructuring of compact_lock_irqsave()).
4. Rename zone->lock to zone->_lock.
5. Add zone lock tracepoints.
The tracepoints are added via lightweight inline helpers in the
wrappers. When tracing is disabled, the fast path remains
unchanged.
Changes in v3:
- Split compact_lock_irqsave() to compact_zone_lock_irqsave() and
compact_lruvec_lock_irqsave().
- Rename zone->lock to zone->_lock.
Changes in v2:
- Move mecanical changes from mm/compaction.c to different commit.
- Removed compact_do_zone_trylock() and compact_do_raw_trylock_irqsave().
v1: https://lore.kernel.org/all/cover.1770821420.git.d@ilvokhin.com/
v2: https://lore.kernel.org/all/cover.1772030186.git.d@ilvokhin.com/
Dmitry Ilvokhin (5):
mm: introduce zone lock wrappers
mm: convert zone lock users to wrappers
mm: convert compaction to zone lock wrappers
mm: rename zone->lock to zone->_lock
mm: add tracepoints for zone lock
MAINTAINERS | 3 +
include/linux/mmzone.h | 7 ++-
include/linux/zone_lock.h | 100 +++++++++++++++++++++++++++++++
include/trace/events/zone_lock.h | 64 ++++++++++++++++++++
mm/Makefile | 2 +-
mm/compaction.c | 58 +++++++++++-------
mm/internal.h | 2 +-
mm/memory_hotplug.c | 9 +--
mm/mm_init.c | 3 +-
mm/page_alloc.c | 89 +++++++++++++--------------
mm/page_isolation.c | 23 +++----
mm/page_owner.c | 2 +-
mm/page_reporting.c | 13 ++--
mm/show_mem.c | 5 +-
mm/vmscan.c | 5 +-
mm/vmstat.c | 9 +--
mm/zone_lock.c | 31 ++++++++++
17 files changed, 326 insertions(+), 99 deletions(-)
create mode 100644 include/linux/zone_lock.h
create mode 100644 include/trace/events/zone_lock.h
create mode 100644 mm/zone_lock.c
--
2.47.3
^ permalink raw reply
* [PATCH v3 1/5] mm: introduce zone lock wrappers
From: Dmitry Ilvokhin @ 2026-02-26 18:26 UTC (permalink / raw)
To: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Axel Rasmussen, Yuanchu Xie,
Wei Xu, Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Brendan Jackman, Johannes Weiner, Zi Yan, Oscar Salvador,
Qi Zheng, Shakeel Butt
Cc: linux-kernel, linux-mm, linux-trace-kernel, linux-cxl,
kernel-team, Benjamin Cheatham, Dmitry Ilvokhin
In-Reply-To: <cover.1772129168.git.d@ilvokhin.com>
Add thin wrappers around zone lock acquire/release operations. This
prepares the code for future tracepoint instrumentation without
modifying individual call sites.
Centralizing zone lock operations behind wrappers allows future
instrumentation or debugging hooks to be added without touching
all users.
No functional change intended. The wrappers are introduced in
preparation for subsequent patches and are not yet used.
Signed-off-by: Dmitry Ilvokhin <d@ilvokhin.com>
Acked-by: Shakeel Butt <shakeel.butt@linux.dev>
---
MAINTAINERS | 1 +
include/linux/zone_lock.h | 38 ++++++++++++++++++++++++++++++++++++++
2 files changed, 39 insertions(+)
create mode 100644 include/linux/zone_lock.h
diff --git a/MAINTAINERS b/MAINTAINERS
index 55af015174a5..61e3d1f5bf43 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -16680,6 +16680,7 @@ F: include/linux/pgtable.h
F: include/linux/ptdump.h
F: include/linux/vmpressure.h
F: include/linux/vmstat.h
+F: include/linux/zone_lock.h
F: kernel/fork.c
F: mm/Kconfig
F: mm/debug.c
diff --git a/include/linux/zone_lock.h b/include/linux/zone_lock.h
new file mode 100644
index 000000000000..c531e26280e6
--- /dev/null
+++ b/include/linux/zone_lock.h
@@ -0,0 +1,38 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _LINUX_ZONE_LOCK_H
+#define _LINUX_ZONE_LOCK_H
+
+#include <linux/mmzone.h>
+#include <linux/spinlock.h>
+
+static inline void zone_lock_init(struct zone *zone)
+{
+ spin_lock_init(&zone->lock);
+}
+
+#define zone_lock_irqsave(zone, flags) \
+do { \
+ spin_lock_irqsave(&(zone)->lock, flags); \
+} while (0)
+
+#define zone_trylock_irqsave(zone, flags) \
+({ \
+ spin_trylock_irqsave(&(zone)->lock, flags); \
+})
+
+static inline void zone_unlock_irqrestore(struct zone *zone, unsigned long flags)
+{
+ spin_unlock_irqrestore(&zone->lock, flags);
+}
+
+static inline void zone_lock_irq(struct zone *zone)
+{
+ spin_lock_irq(&zone->lock);
+}
+
+static inline void zone_unlock_irq(struct zone *zone)
+{
+ spin_unlock_irq(&zone->lock);
+}
+
+#endif /* _LINUX_ZONE_LOCK_H */
--
2.47.3
^ permalink raw reply related
* Re: [RFC PATCH bpf-next v2 2/3] ftrace: Use kallsyms binary search for single-symbol lookup
From: bot+bpf-ci @ 2026-02-26 18:24 UTC (permalink / raw)
To: andrey.grodzovsky, bpf, linux-open-source
Cc: ast, daniel, andrii, jolsa, rostedt, linux-trace-kernel, ast,
andrii, daniel, martin.lau, eddyz87, yonghong.song, clm,
ihor.solodrai
In-Reply-To: <20260226173342.3565919-3-andrey.grodzovsky@crowdstrike.com>
[-- Attachment #1: Type: text/plain, Size: 2769 bytes --]
> diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
> index 827fb9a0bf0d..cfa0c7ad7cbf 100644
> --- a/kernel/trace/ftrace.c
> +++ b/kernel/trace/ftrace.c
[ ... ]
> @@ -9270,6 +9279,19 @@ int ftrace_lookup_symbols(const char **sorted_syms, size_t cnt, unsigned long *a
> struct kallsyms_data args;
> int found_all;
>
> + /* Fast path: single symbol uses O(log N) binary search */
> + if (cnt == 1) {
> + addrs[0] = kallsyms_lookup_name(sorted_syms[0]);
> + if (addrs[0] && ftrace_location(addrs[0]))
> + return 0;
> + /*
> + * Binary lookup can fail for duplicate symbol names
> + * where the first match is not ftrace-instrumented,
> + * or for module symbols. Retry with linear scan.
> + */
Is "or for module symbols" accurate here as a separate failure case?
kallsyms_lookup_name() falls back to module_kallsyms_lookup_name()
when the vmlinux lookup fails:
kernel/kallsyms.c:kallsyms_lookup_name() {
...
ret = kallsyms_lookup_names(name, &i, NULL);
if (!ret)
return kallsyms_sym_address(get_symbol_seq(i));
return module_kallsyms_lookup_name(name);
}
So for a symbol that exists only in a module, the fast path finds
it through module_kallsyms_lookup_name() and succeeds if
ftrace_location() confirms it.
The only module-related failure case is when a vmlinux symbol with
the same name shadows the module symbol in the binary search, but
that is already covered by "duplicate symbol names where the first
match is not ftrace-instrumented."
The same phrasing appears in the commit message:
> If binary lookup fails (duplicate symbol names where the first match
> is not ftrace-instrumented, or module symbols), the function falls
> through to the existing linear scan path.
Would something like "for duplicate symbol names where the first
match is not ftrace-instrumented (including cases where a vmlinux
symbol shadows an ftrace-instrumented module symbol)" be more
precise?
> + }
> +
> + /* Batch path: single-pass O(N) linear scan */
> memset(addrs, 0, sizeof(*addrs) * cnt);
---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md
CI run summary: https://github.com/kernel-patches/bpf/actions/runs/22453951811
AI-authorship-score: low
AI-authorship-explanation: Domain-specific kernel expertise with precise empirical benchmarks and standard kernel patch conventions consistent with a human developer optimizing a real-world bottleneck.
issues-found: 1
issue-severity-score: low
issue-severity-explanation: Misleading comment and commit message claim module symbols cause fast path fallback, but kallsyms_lookup_name() handles module-only symbols correctly via module_kallsyms_lookup_name().
^ permalink raw reply
* Re: [PATCH 28/61] ecryptfs: update format strings for u64 i_ino
From: Tyler Hicks @ 2026-02-26 18:21 UTC (permalink / raw)
To: Jeff Layton
Cc: Alexander Viro, Christian Brauner, Jan Kara, Steven Rostedt,
Masami Hiramatsu, Mathieu Desnoyers, Dan Williams, Matthew Wilcox,
Eric Biggers, Theodore Y. Ts'o, Muchun Song, Oscar Salvador,
David Hildenbrand, David Howells, Paulo Alcantara, Andreas Dilger,
Jan Kara, Jaegeuk Kim, Chao Yu, Trond Myklebust, Anna Schumaker,
Chuck Lever, NeilBrown, Olga Kornievskaia, Dai Ngo, Tom Talpey,
Steve French, Ronnie Sahlberg, Shyam Prasad N, Bharath SM,
Alexander Aring, Ryusuke Konishi, Viacheslav Dubeyko,
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, David Sterba, Marc Dionne, Ian Kent,
Luis de Bethencourt, Salah Triki, Tigran A. Aivazian,
Ilya Dryomov, Alex Markuze, Jan Harkes, coda, Nicolas Pitre,
Amir Goldstein, Christoph Hellwig, John Paul Adrian Glaubitz,
Yangtao Li, Mikulas Patocka, David Woodhouse, Richard Weinberger,
Dave Kleikamp, Konstantin Komarov, Mark Fasheh, Joel Becker,
Joseph Qi, Mike Marshall, Martin Brandenburg, Miklos Szeredi,
Anders Larsen, Zhihao Cheng, Damien Le Moal, Naohiro Aota,
Johannes Thumshirn, John Johansen, Paul Moore, James Morris,
Serge E. Hallyn, Mimi Zohar, Roberto Sassu, Dmitry Kasatkin,
Eric Snowberg, Fan Wu, Stephen Smalley, Ondrej Mosnacek,
Casey Schaufler, Alex Deucher, Christian König, David Airlie,
Simona Vetter, Sumit Semwal, Eric Dumazet, Kuniyuki Iwashima,
Paolo Abeni, Willem de Bruijn, David S. Miller, Jakub Kicinski,
Simon Horman, Oleg Nesterov, Peter Zijlstra, Ingo Molnar,
Arnaldo Carvalho de Melo, Namhyung Kim, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
James Clark, Darrick J. Wong, Martin Schiller, linux-fsdevel,
linux-kernel, linux-trace-kernel, nvdimm, fsverity, linux-mm,
netfs, linux-ext4, linux-f2fs-devel, linux-nfs, linux-cifs,
samba-technical, linux-nilfs, v9fs, linux-afs, autofs, ceph-devel,
codalist, ecryptfs, linux-mtd, jfs-discussion, ntfs3, ocfs2-devel,
devel, linux-unionfs, apparmor, linux-security-module,
linux-integrity, selinux, amd-gfx, dri-devel, linux-media,
linaro-mm-sig, netdev, linux-perf-users, linux-fscrypt, linux-xfs,
linux-hams, linux-x25
In-Reply-To: <20260226-iino-u64-v1-28-ccceff366db9@kernel.org>
On 2026-02-26 10:55:30, Jeff Layton wrote:
> Update format strings and local variable types in ecryptfs for the
> i_ino type change from unsigned long to u64.
>
> Signed-off-by: Jeff Layton <jlayton@kernel.org>
Acked-by: Tyler Hicks <code@tyhicks.com>
Tyler
> ---
> fs/ecryptfs/crypto.c | 6 +++---
> fs/ecryptfs/file.c | 2 +-
> 2 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c
> index 3b59346d68c594fcd7e27bae87849d3e19eff56e..f25c9a49e251a591695a143f64d1a81c5211ec18 100644
> --- a/fs/ecryptfs/crypto.c
> +++ b/fs/ecryptfs/crypto.c
> @@ -1313,7 +1313,7 @@ int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry)
> rc = ecryptfs_read_xattr_region(page_virt, ecryptfs_inode);
> if (rc) {
> printk(KERN_DEBUG "Valid eCryptfs headers not found in "
> - "file header region or xattr region, inode %lu\n",
> + "file header region or xattr region, inode %llu\n",
> ecryptfs_inode->i_ino);
> rc = -EINVAL;
> goto out;
> @@ -1323,7 +1323,7 @@ int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry)
> ECRYPTFS_DONT_VALIDATE_HEADER_SIZE);
> if (rc) {
> printk(KERN_DEBUG "Valid eCryptfs headers not found in "
> - "file xattr region either, inode %lu\n",
> + "file xattr region either, inode %llu\n",
> ecryptfs_inode->i_ino);
> rc = -EINVAL;
> }
> @@ -1335,7 +1335,7 @@ int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry)
> "crypto metadata only in the extended attribute "
> "region, but eCryptfs was mounted without "
> "xattr support enabled. eCryptfs will not treat "
> - "this like an encrypted file, inode %lu\n",
> + "this like an encrypted file, inode %llu\n",
> ecryptfs_inode->i_ino);
> rc = -EINVAL;
> }
> diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c
> index 7929411837cf5b2e98e1d4288791d2e07c44a4eb..49b0fbe0428a2d202434ce4b5fd7d82d2a63cf58 100644
> --- a/fs/ecryptfs/file.c
> +++ b/fs/ecryptfs/file.c
> @@ -253,7 +253,7 @@ static int ecryptfs_open(struct inode *inode, struct file *file)
> if (rc)
> goto out_put;
> ecryptfs_printk(KERN_DEBUG, "inode w/ addr = [0x%p], i_ino = "
> - "[0x%.16lx] size: [0x%.16llx]\n", inode, inode->i_ino,
> + "[0x%.16llx] size: [0x%.16llx]\n", inode, inode->i_ino,
> (unsigned long long)i_size_read(inode));
> goto out;
> out_put:
>
> --
> 2.53.0
>
^ permalink raw reply
* Re: [PATCH 1/4] mm: introduce zone lock wrappers
From: Dmitry Ilvokhin @ 2026-02-26 17:55 UTC (permalink / raw)
To: Steven Rostedt
Cc: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Masami Hiramatsu,
Mathieu Desnoyers, Brendan Jackman, Johannes Weiner, Zi Yan,
Oscar Salvador, Qi Zheng, Shakeel Butt, Axel Rasmussen,
Yuanchu Xie, Wei Xu, linux-kernel, linux-mm, linux-trace-kernel,
linux-cxl, kernel-team
In-Reply-To: <20260225175105.7777c514@fedora>
On Wed, Feb 25, 2026 at 05:51:05PM -0500, Steven Rostedt wrote:
> On Wed, 11 Feb 2026 15:22:13 +0000
> Dmitry Ilvokhin <d@ilvokhin.com> wrote:
>
>
> > diff --git a/include/linux/zone_lock.h b/include/linux/zone_lock.h
> > new file mode 100644
> > index 000000000000..c531e26280e6
> > --- /dev/null
> > +++ b/include/linux/zone_lock.h
> > @@ -0,0 +1,38 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
> > +#ifndef _LINUX_ZONE_LOCK_H
> > +#define _LINUX_ZONE_LOCK_H
> > +
> > +#include <linux/mmzone.h>
> > +#include <linux/spinlock.h>
> > +
> > +static inline void zone_lock_init(struct zone *zone)
> > +{
> > + spin_lock_init(&zone->lock);
> > +}
> > +
> > +#define zone_lock_irqsave(zone, flags) \
> > +do { \
> > + spin_lock_irqsave(&(zone)->lock, flags); \
> > +} while (0)
> > +
> > +#define zone_trylock_irqsave(zone, flags) \
> > +({ \
> > + spin_trylock_irqsave(&(zone)->lock, flags); \
> > +})
> > +
> > +static inline void zone_unlock_irqrestore(struct zone *zone, unsigned long flags)
> > +{
> > + spin_unlock_irqrestore(&zone->lock, flags);
> > +}
> > +
> > +static inline void zone_lock_irq(struct zone *zone)
> > +{
> > + spin_lock_irq(&zone->lock);
> > +}
> > +
> > +static inline void zone_unlock_irq(struct zone *zone)
> > +{
> > + spin_unlock_irq(&zone->lock);
> > +}
> > +
> > +#endif /* _LINUX_ZONE_LOCK_H */
>
> Have you thought about adding guards as well. It could make the code simpler:
>
> (Not tested)
>
> #include <linux/cleanup.h>
> [..]
>
> DEFINE_LOCK_GUARD_1(zonelock_irqsave, struct zone *,
> zone_lock_irqsave(_T->lock, _T->flags),
> zone_unlock_irqrestore(_T->lock, _T->flags),
> unsigned long flags)
> DECLARE_LOCK_GUARD_1_ATTRS(zonelock_irqsave, __acquires(_T), __releases(*(struct zone ***)_T))
> #define class_zonelock_irqsave_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(zonelock_irqsave, _T)
>
> DEFINE_LOCK_GUARD_1(zonelock_irq, struct zone *,
> zone_lock_irq(_T->lock),
> zone_unlock_irq(_T->lock))
> DECLARE_LOCK_GUARD_1_ATTRS(zonelock_irq, __acquires(_T), __releases(*(struct zone ***)_T))
> #define class_zonelock_irq_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(zonelock_irq, _T)
>
> Then you could even remove the "flags" variables from the C code, and some goto unlocks.
>
Thanks, Steve.
I like the idea: guards could indeed simplify parts of the
locking and reduce some of the explicit flags handling.
For this series, though, I'd prefer to keep the changes mostly
mechanical and focused on introducing the wrappers and tracepoints.
Converting to guards would make the transformation less mechanical
and potentially harder to review.
I'd be happy to follow up with a separate patch to explore adding
guards for zone locks and see whether we can simplify the existing
logic further.
> -- Steve
^ permalink raw reply
* Re: [PATCH v6 14/16] sched_ext: Export task_is_scx_enabled() for verification
From: Tejun Heo @ 2026-02-26 17:54 UTC (permalink / raw)
To: Gabriele Monaco
Cc: linux-kernel, Andrea Righi, Joel Fernandes, Steven Rostedt,
Nam Cao, Juri Lelli, Ingo Molnar, Peter Zijlstra, sched-ext,
Tomas Glozar, Clark Williams, John Kacur, linux-trace-kernel
In-Reply-To: <deb203ab-7564-4bef-b4bf-053c6ec08f27@redhat.com>
Hello,
On Thu, Feb 26, 2026 at 04:25:59PM +0000, Gabriele Monaco wrote:
> 2026-02-26T15:48:11Z Tejun Heo <tj@kernel.org>:
>
> > On Thu, Feb 26, 2026 at 04:42:34PM +0100, Gabriele Monaco wrote:
> >> scx_enabled() might as well be exported (together with its static key), but I'm
> >> not sure exporting the sched_class is the right thing, since all those scheduler
> >> things are quite private.
> >
> > Don't you just need the sched_class pointer? Can't you get that from
> > kallsyms?
>
> Yes that pointer would do. Do you mean getting it in a task_on_scx() reimplementation I would just use in RV?
> I could do that but I was looking for a more standard solution.
> While very likely the pointer to the class and the class field are here to stay, having a function like task_on_scx() directly available in include/linux/sched/ext.h is less error prone and future observability tools might need it too.
>
> But let's rewind it a bit, if it is a big issue not to have it inlined (which probably isn't), we could just go on with something like _task_on_scx() (inlined, for the scheduler code) and task_on_scx() for other users. Wouldn't that be acceptable?
So, I don't know how rv works (searched a bit just now) but from kernel's
POV, it seems to look mostly like an additional tracing framework, and
testing p->sched_class against exported pointer value seems like a good fit
for the use case, no? It's not like task_on_scx() or state testing is going
to give you a "better" result anyway and it's actually rather confusing to
use them outside scheduler proper as these are expected to be used while the
task's rq lock is held. I don't think rv wants to (or even can) synchronize
against scheduler internals. Using external observability mechanism seems
like the better fit here.
Thanks.
--
tejun
^ permalink raw reply
* Re: [PATCH 03/61] trace: update VFS-layer trace events for u64 i_ino
From: Jeff Layton @ 2026-02-26 17:53 UTC (permalink / raw)
To: Jan Kara
Cc: Alexander Viro, Christian Brauner, Steven Rostedt,
Masami Hiramatsu, Mathieu Desnoyers, Dan Williams, Matthew Wilcox,
Eric Biggers, Theodore Y. Ts'o, Muchun Song, Oscar Salvador,
David Hildenbrand, David Howells, Paulo Alcantara, Andreas Dilger,
Jan Kara, Jaegeuk Kim, Chao Yu, Trond Myklebust, Anna Schumaker,
Chuck Lever, NeilBrown, Olga Kornievskaia, Dai Ngo, Tom Talpey,
Steve French, Ronnie Sahlberg, Shyam Prasad N, Bharath SM,
Alexander Aring, Ryusuke Konishi, Viacheslav Dubeyko,
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, David Sterba, Marc Dionne, Ian Kent,
Luis de Bethencourt, Salah Triki, Tigran A. Aivazian,
Ilya Dryomov, Alex Markuze, Jan Harkes, coda, Nicolas Pitre,
Tyler Hicks, Amir Goldstein, Christoph Hellwig,
John Paul Adrian Glaubitz, Yangtao Li, Mikulas Patocka,
David Woodhouse, Richard Weinberger, Dave Kleikamp,
Konstantin Komarov, Mark Fasheh, Joel Becker, Joseph Qi,
Mike Marshall, Martin Brandenburg, Miklos Szeredi, Anders Larsen,
Zhihao Cheng, Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
John Johansen, Paul Moore, James Morris, Serge E. Hallyn,
Mimi Zohar, Roberto Sassu, Dmitry Kasatkin, Eric Snowberg, Fan Wu,
Stephen Smalley, Ondrej Mosnacek, Casey Schaufler, Alex Deucher,
Christian König, David Airlie, Simona Vetter, Sumit Semwal,
Eric Dumazet, Kuniyuki Iwashima, Paolo Abeni, Willem de Bruijn,
David S. Miller, Jakub Kicinski, Simon Horman, Oleg Nesterov,
Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, James Clark, Darrick J. Wong,
Martin Schiller, linux-fsdevel, linux-kernel, linux-trace-kernel,
nvdimm, fsverity, linux-mm, netfs, linux-ext4, linux-f2fs-devel,
linux-nfs, linux-cifs, samba-technical, linux-nilfs, v9fs,
linux-afs, autofs, ceph-devel, codalist, ecryptfs, linux-mtd,
jfs-discussion, ntfs3, ocfs2-devel, devel, linux-unionfs,
apparmor, linux-security-module, linux-integrity, selinux,
amd-gfx, dri-devel, linux-media, linaro-mm-sig, netdev,
linux-perf-users, linux-fscrypt, linux-xfs, linux-hams, linux-x25
In-Reply-To: <6exhq5gjvef5obfsqwkxfcpl2sjqmlv7klrzolodzpcjolgrmd@ds42ulhod7pw>
On Thu, 2026-02-26 at 18:11 +0100, Jan Kara wrote:
> On Thu 26-02-26 10:55:05, Jeff Layton wrote:
> > Update trace event definitions in VFS-layer trace headers to use u64
> > instead of ino_t/unsigned long for inode number fields, and change
> > format strings from %lu/%lx to %llu/%llx to match.
> >
> > This is needed because i_ino is now u64. Changing trace event field
> > types changes the binary trace format, but the self-describing format
> > metadata handles this transparently for modern trace-cmd and perf.
> >
> > Files updated:
> > - cachefiles.h, filelock.h, filemap.h, fs_dax.h, fsverity.h,
> > hugetlbfs.h, netfs.h, readahead.h, timestamp.h, writeback.h
> >
> > Signed-off-by: Jeff Layton <jlayton@kernel.org>
>
> ...
>
> > diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h
> > index 4d3d8c8f3a1bc3e5ef10fc96e3c6dbbd0cf00c98..cc7651749eb3ce1123cb3ea9496f0803a0f4c1a0 100644
> > --- a/include/trace/events/writeback.h
> > +++ b/include/trace/events/writeback.h
> > @@ -67,7 +67,7 @@ DECLARE_EVENT_CLASS(writeback_folio_template,
> >
> > TP_STRUCT__entry (
> > __array(char, name, 32)
> > - __field(ino_t, ino)
> > + __field(u64, ino)
> > __field(pgoff_t, index)
> > ),
> >
> > @@ -79,9 +79,9 @@ DECLARE_EVENT_CLASS(writeback_folio_template,
> > __entry->index = folio->index;
> > ),
> >
> > - TP_printk("bdi %s: ino=%lu index=%lu",
> > + TP_printk("bdi %s: ino=%llu index=%lu",
> > __entry->name,
> > - (unsigned long)__entry->ino,
> > + (unsigned long long)__entry->ino,
>
> No need for explicit typing to ULL?
>
> > __entry->index
> > )
> > );
> > @@ -108,7 +108,7 @@ DECLARE_EVENT_CLASS(writeback_dirty_inode_template,
> >
> > TP_STRUCT__entry (
> > __array(char, name, 32)
> > - __field(ino_t, ino)
> > + __field(u64, ino)
> > __field(unsigned long, state)
> > __field(unsigned long, flags)
> > ),
> > @@ -123,9 +123,9 @@ DECLARE_EVENT_CLASS(writeback_dirty_inode_template,
> > __entry->flags = flags;
> > ),
> >
> > - TP_printk("bdi %s: ino=%lu state=%s flags=%s",
> > + TP_printk("bdi %s: ino=%llu state=%s flags=%s",
> > __entry->name,
> > - (unsigned long)__entry->ino,
> > + (unsigned long long)__entry->ino,
>
> And here as well? And many times below as well...
>
> Honza
Good catch. I'll clean those up.
Thanks,
--
Jeff Layton <jlayton@kernel.org>
^ permalink raw reply
* Re: [PATCH 03/61] trace: update VFS-layer trace events for u64 i_ino
From: Steven Rostedt @ 2026-02-26 17:48 UTC (permalink / raw)
To: Jeff Layton
Cc: Alexander Viro, Christian Brauner, Jan Kara, Masami Hiramatsu,
Mathieu Desnoyers, Dan Williams, Matthew Wilcox, Eric Biggers,
Theodore Y. Ts'o, Muchun Song, Oscar Salvador,
David Hildenbrand, David Howells, Paulo Alcantara, Andreas Dilger,
Jan Kara, Jaegeuk Kim, Chao Yu, Trond Myklebust, Anna Schumaker,
Chuck Lever, NeilBrown, Olga Kornievskaia, Dai Ngo, Tom Talpey,
Steve French, Ronnie Sahlberg, Shyam Prasad N, Bharath SM,
Alexander Aring, Ryusuke Konishi, Viacheslav Dubeyko,
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, David Sterba, Marc Dionne, Ian Kent,
Luis de Bethencourt, Salah Triki, Tigran A. Aivazian,
Ilya Dryomov, Alex Markuze, Jan Harkes, coda, Nicolas Pitre,
Tyler Hicks, Amir Goldstein, Christoph Hellwig,
John Paul Adrian Glaubitz, Yangtao Li, Mikulas Patocka,
David Woodhouse, Richard Weinberger, Dave Kleikamp,
Konstantin Komarov, Mark Fasheh, Joel Becker, Joseph Qi,
Mike Marshall, Martin Brandenburg, Miklos Szeredi, Anders Larsen,
Zhihao Cheng, Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
John Johansen, Paul Moore, James Morris, Serge E. Hallyn,
Mimi Zohar, Roberto Sassu, Dmitry Kasatkin, Eric Snowberg, Fan Wu,
Stephen Smalley, Ondrej Mosnacek, Casey Schaufler, Alex Deucher,
Christian König, David Airlie, Simona Vetter, Sumit Semwal,
Eric Dumazet, Kuniyuki Iwashima, Paolo Abeni, Willem de Bruijn,
David S. Miller, Jakub Kicinski, Simon Horman, Oleg Nesterov,
Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, James Clark, Darrick J. Wong,
Martin Schiller, linux-fsdevel, linux-kernel, linux-trace-kernel,
nvdimm, fsverity, linux-mm, netfs, linux-ext4, linux-f2fs-devel,
linux-nfs, linux-cifs, samba-technical, linux-nilfs, v9fs,
linux-afs, autofs, ceph-devel, codalist, ecryptfs, linux-mtd,
jfs-discussion, ntfs3, ocfs2-devel, devel, linux-unionfs,
apparmor, linux-security-module, linux-integrity, selinux,
amd-gfx, dri-devel, linux-media, linaro-mm-sig, netdev,
linux-perf-users, linux-fscrypt, linux-xfs, linux-hams, linux-x25
In-Reply-To: <20260226-iino-u64-v1-3-ccceff366db9@kernel.org>
On Thu, 26 Feb 2026 10:55:05 -0500
Jeff Layton <jlayton@kernel.org> wrote:
> Update trace event definitions in VFS-layer trace headers to use u64
> instead of ino_t/unsigned long for inode number fields, and change
> format strings from %lu/%lx to %llu/%llx to match.
>
> This is needed because i_ino is now u64. Changing trace event field
> types changes the binary trace format, but the self-describing format
> metadata handles this transparently for modern trace-cmd and perf.
>
> Files updated:
> - cachefiles.h, filelock.h, filemap.h, fs_dax.h, fsverity.h,
> hugetlbfs.h, netfs.h, readahead.h, timestamp.h, writeback.h
>
Hmm, on 32 bit systems, this will likely cause "holes" in a lot of these
events.
> Signed-off-by: Jeff Layton <jlayton@kernel.org>
> ---
> include/trace/events/cachefiles.h | 18 ++---
> include/trace/events/filelock.h | 16 ++---
> include/trace/events/filemap.h | 20 +++---
> include/trace/events/fs_dax.h | 20 +++---
> include/trace/events/fsverity.h | 30 ++++----
> include/trace/events/hugetlbfs.h | 28 ++++----
> include/trace/events/netfs.h | 4 +-
> include/trace/events/readahead.h | 12 ++--
> include/trace/events/timestamp.h | 12 ++--
> include/trace/events/writeback.h | 148 +++++++++++++++++++-------------------
> 10 files changed, 154 insertions(+), 154 deletions(-)
>
> diff --git a/include/trace/events/cachefiles.h b/include/trace/events/cachefiles.h
> index a743b2a35ea7001447b3e05d41539cb88013bc7f..f967027711ee823f224abc1b8ab03f63da06ae6f 100644
> --- a/include/trace/events/cachefiles.h
> +++ b/include/trace/events/cachefiles.h
> @@ -251,8 +251,8 @@ TRACE_EVENT(cachefiles_lookup,
> TP_STRUCT__entry(
> __field(unsigned int, obj)
> __field(short, error)
There was already a 2 byte hole here, but that's not a big deal.
> - __field(unsigned long, dino)
> - __field(unsigned long, ino)
> + __field(u64, dino)
> + __field(u64, ino)
> ),
>
> TP_fast_assign(
> @@ -263,7 +263,7 @@ TRACE_EVENT(cachefiles_lookup,
> __entry->error = IS_ERR(de) ? PTR_ERR(de) : 0;
> ),
>
> - TP_printk("o=%08x dB=%lx B=%lx e=%d",
> + TP_printk("o=%08x dB=%llx B=%llx e=%d",
> __entry->obj, __entry->dino, __entry->ino, __entry->error)
> );
>
> @@ -579,7 +579,7 @@ TRACE_EVENT(cachefiles_mark_active,
> /* Note that obj may be NULL */
> TP_STRUCT__entry(
> __field(unsigned int, obj)
> - __field(ino_t, inode)
> + __field(u64, inode)
Might be better to reorder any of these that have int first.
u64 inode;
int obj;
Will be packed tighter than:
int obj
u64 inode;
Probably should have changed that before anyway.
> ),
>
> TP_fast_assign(
> @@ -587,7 +587,7 @@ TRACE_EVENT(cachefiles_mark_active,
> __entry->inode = inode->i_ino;
> ),
>
> - TP_printk("o=%08x B=%lx",
> + TP_printk("o=%08x B=%llx",
> __entry->obj, __entry->inode)
> );
>
> @@ -600,7 +600,7 @@ TRACE_EVENT(cachefiles_mark_failed,
> /* Note that obj may be NULL */
> TP_STRUCT__entry(
> __field(unsigned int, obj)
> - __field(ino_t, inode)
> + __field(u64, inode)
Is ino_t being changed? Why the update here?
> ),
>
> TP_fast_assign(
> @@ -608,7 +608,7 @@ TRACE_EVENT(cachefiles_mark_failed,
> __entry->inode = inode->i_ino;
> ),
>
> - TP_printk("o=%08x B=%lx",
> + TP_printk("o=%08x B=%llx",
> __entry->obj, __entry->inode)
> );
>
> @@ -621,7 +621,7 @@ TRACE_EVENT(cachefiles_mark_inactive,
> /* Note that obj may be NULL */
> TP_STRUCT__entry(
> __field(unsigned int, obj)
> - __field(ino_t, inode)
> + __field(u64, inode)
Ditto.
> ),
>
> TP_fast_assign(
> @@ -629,7 +629,7 @@ TRACE_EVENT(cachefiles_mark_inactive,
> __entry->inode = inode->i_ino;
> ),
>
> - TP_printk("o=%08x B=%lx",
> + TP_printk("o=%08x B=%llx",
> __entry->obj, __entry->inode)
> );
>
> diff --git a/include/trace/events/filelock.h b/include/trace/events/filelock.h
> index 370016c38a5bbc07d5ba6c102030b49c9eb6424d..41bc752616b25d6cd7955203e2c604029d0b440c 100644
> --- a/include/trace/events/filelock.h
> +++ b/include/trace/events/filelock.h
> @@ -42,7 +42,7 @@ TRACE_EVENT(locks_get_lock_context,
> TP_ARGS(inode, type, ctx),
>
> TP_STRUCT__entry(
> - __field(unsigned long, i_ino)
> + __field(u64, i_ino)
> __field(dev_t, s_dev)
> __field(unsigned char, type)
> __field(struct file_lock_context *, ctx)
> @@ -55,7 +55,7 @@ TRACE_EVENT(locks_get_lock_context,
> __entry->ctx = ctx;
> ),
>
> - TP_printk("dev=0x%x:0x%x ino=0x%lx type=%s ctx=%p",
> + TP_printk("dev=0x%x:0x%x ino=0x%llx type=%s ctx=%p",
> MAJOR(__entry->s_dev), MINOR(__entry->s_dev),
> __entry->i_ino, show_fl_type(__entry->type), __entry->ctx)
> );
> @@ -67,7 +67,7 @@ DECLARE_EVENT_CLASS(filelock_lock,
>
> TP_STRUCT__entry(
> __field(struct file_lock *, fl)
> - __field(unsigned long, i_ino)
> + __field(u64, i_ino)
Having u64 before a pointer would be tighter on 32 bit systems, and leaves
out any holes in the trace.
> __field(dev_t, s_dev)
> __field(struct file_lock_core *, blocker)
> __field(fl_owner_t, owner)
> @@ -93,7 +93,7 @@ DECLARE_EVENT_CLASS(filelock_lock,
> __entry->ret = ret;
> ),
>
> - TP_printk("fl=%p dev=0x%x:0x%x ino=0x%lx fl_blocker=%p fl_owner=%p fl_pid=%u fl_flags=%s fl_type=%s fl_start=%lld fl_end=%lld ret=%d",
> + TP_printk("fl=%p dev=0x%x:0x%x ino=0x%llx fl_blocker=%p fl_owner=%p fl_pid=%u fl_flags=%s fl_type=%s fl_start=%lld fl_end=%lld ret=%d",
> __entry->fl, MAJOR(__entry->s_dev), MINOR(__entry->s_dev),
> __entry->i_ino, __entry->blocker, __entry->owner,
> __entry->pid, show_fl_flags(__entry->flags),
> @@ -124,7 +124,7 @@ DECLARE_EVENT_CLASS(filelock_lease,
>
> TP_STRUCT__entry(
> __field(struct file_lease *, fl)
> - __field(unsigned long, i_ino)
> + __field(u64, i_ino)
Same here.
> __field(dev_t, s_dev)
> __field(struct file_lock_core *, blocker)
> __field(fl_owner_t, owner)
> @@ -146,7 +146,7 @@ DECLARE_EVENT_CLASS(filelock_lease,
> __entry->downgrade_time = fl ? fl->fl_downgrade_time : 0;
> ),
>
> - TP_printk("fl=%p dev=0x%x:0x%x ino=0x%lx fl_blocker=%p fl_owner=%p fl_flags=%s fl_type=%s fl_break_time=%lu fl_downgrade_time=%lu",
> + TP_printk("fl=%p dev=0x%x:0x%x ino=0x%llx fl_blocker=%p fl_owner=%p fl_flags=%s fl_type=%s fl_break_time=%lu fl_downgrade_time=%lu",
> __entry->fl, MAJOR(__entry->s_dev), MINOR(__entry->s_dev),
> __entry->i_ino, __entry->blocker, __entry->owner,
> show_fl_flags(__entry->flags),
> @@ -175,7 +175,7 @@ TRACE_EVENT(generic_add_lease,
> TP_ARGS(inode, fl),
>
> TP_STRUCT__entry(
> - __field(unsigned long, i_ino)
> + __field(u64, i_ino)
> __field(int, wcount)
> __field(int, rcount)
> __field(int, icount)
> @@ -196,7 +196,7 @@ TRACE_EVENT(generic_add_lease,
> __entry->type = fl->c.flc_type;
> ),
>
> - TP_printk("dev=0x%x:0x%x ino=0x%lx wcount=%d rcount=%d icount=%d fl_owner=%p fl_flags=%s fl_type=%s",
> + TP_printk("dev=0x%x:0x%x ino=0x%llx wcount=%d rcount=%d icount=%d fl_owner=%p fl_flags=%s fl_type=%s",
> MAJOR(__entry->s_dev), MINOR(__entry->s_dev),
> __entry->i_ino, __entry->wcount, __entry->rcount,
> __entry->icount, __entry->owner,
> diff --git a/include/trace/events/filemap.h b/include/trace/events/filemap.h
> index f48fe637bfd25885dc6daaf09336ab60626b4944..153491e57cce6df73e30ddee60a52ed7d8923c24 100644
> --- a/include/trace/events/filemap.h
> +++ b/include/trace/events/filemap.h
> @@ -21,7 +21,7 @@ DECLARE_EVENT_CLASS(mm_filemap_op_page_cache,
>
> TP_STRUCT__entry(
> __field(unsigned long, pfn)
> - __field(unsigned long, i_ino)
> + __field(u64, i_ino)
Again, this would cause a 32 bit hole.
> __field(unsigned long, index)
> __field(dev_t, s_dev)
> __field(unsigned char, order)
> @@ -38,7 +38,7 @@ DECLARE_EVENT_CLASS(mm_filemap_op_page_cache,
> __entry->order = folio_order(folio);
> ),
>
> - TP_printk("dev %d:%d ino %lx pfn=0x%lx ofs=%lu order=%u",
> + TP_printk("dev %d:%d ino %llx pfn=0x%lx ofs=%lu order=%u",
> MAJOR(__entry->s_dev), MINOR(__entry->s_dev),
> __entry->i_ino,
> __entry->pfn,
> @@ -67,7 +67,7 @@ DECLARE_EVENT_CLASS(mm_filemap_op_page_cache_range,
> TP_ARGS(mapping, index, last_index),
>
> TP_STRUCT__entry(
> - __field(unsigned long, i_ino)
> + __field(u64, i_ino)
> __field(dev_t, s_dev)
> __field(unsigned long, index)
> __field(unsigned long, last_index)
> @@ -85,7 +85,7 @@ DECLARE_EVENT_CLASS(mm_filemap_op_page_cache_range,
> ),
>
> TP_printk(
> - "dev=%d:%d ino=%lx ofs=%lld-%lld",
> + "dev=%d:%d ino=%llx ofs=%lld-%lld",
> MAJOR(__entry->s_dev),
> MINOR(__entry->s_dev), __entry->i_ino,
> ((loff_t)__entry->index) << PAGE_SHIFT,
> @@ -117,7 +117,7 @@ TRACE_EVENT(mm_filemap_fault,
> TP_ARGS(mapping, index),
>
> TP_STRUCT__entry(
> - __field(unsigned long, i_ino)
> + __field(u64, i_ino)
> __field(dev_t, s_dev)
> __field(unsigned long, index)
> ),
> @@ -133,7 +133,7 @@ TRACE_EVENT(mm_filemap_fault,
> ),
>
> TP_printk(
> - "dev=%d:%d ino=%lx ofs=%lld",
> + "dev=%d:%d ino=%llx ofs=%lld",
> MAJOR(__entry->s_dev),
> MINOR(__entry->s_dev), __entry->i_ino,
> ((loff_t)__entry->index) << PAGE_SHIFT
> @@ -146,7 +146,7 @@ TRACE_EVENT(filemap_set_wb_err,
> TP_ARGS(mapping, eseq),
>
> TP_STRUCT__entry(
> - __field(unsigned long, i_ino)
> + __field(u64, i_ino)
> __field(dev_t, s_dev)
> __field(errseq_t, errseq)
> ),
> @@ -160,7 +160,7 @@ TRACE_EVENT(filemap_set_wb_err,
> __entry->s_dev = mapping->host->i_rdev;
> ),
>
> - TP_printk("dev=%d:%d ino=0x%lx errseq=0x%x",
> + TP_printk("dev=%d:%d ino=0x%llx errseq=0x%x",
> MAJOR(__entry->s_dev), MINOR(__entry->s_dev),
> __entry->i_ino, __entry->errseq)
> );
> @@ -172,7 +172,7 @@ TRACE_EVENT(file_check_and_advance_wb_err,
>
> TP_STRUCT__entry(
> __field(struct file *, file)
> - __field(unsigned long, i_ino)
> + __field(u64, i_ino)
Having a pointer after the u64 is better.
> __field(dev_t, s_dev)
> __field(errseq_t, old)
> __field(errseq_t, new)
> @@ -191,7 +191,7 @@ TRACE_EVENT(file_check_and_advance_wb_err,
> __entry->new = file->f_wb_err;
> ),
>
> - TP_printk("file=%p dev=%d:%d ino=0x%lx old=0x%x new=0x%x",
> + TP_printk("file=%p dev=%d:%d ino=0x%llx old=0x%x new=0x%x",
> __entry->file, MAJOR(__entry->s_dev),
> MINOR(__entry->s_dev), __entry->i_ino, __entry->old,
> __entry->new)
> diff --git a/include/trace/events/fs_dax.h b/include/trace/events/fs_dax.h
> index 50ebc1290ab062a9c30ab00049fb96691f9a0f23..11121baa8ece7928c653b4f874fb10ffbdd02fd0 100644
> --- a/include/trace/events/fs_dax.h
> +++ b/include/trace/events/fs_dax.h
> @@ -12,7 +12,7 @@ DECLARE_EVENT_CLASS(dax_pmd_fault_class,
> pgoff_t max_pgoff, int result),
> TP_ARGS(inode, vmf, max_pgoff, result),
> TP_STRUCT__entry(
> - __field(unsigned long, ino)
> + __field(u64, ino)
> __field(unsigned long, vm_start)
> __field(unsigned long, vm_end)
> __field(vm_flags_t, vm_flags)
> @@ -35,7 +35,7 @@ DECLARE_EVENT_CLASS(dax_pmd_fault_class,
> __entry->max_pgoff = max_pgoff;
> __entry->result = result;
> ),
> - TP_printk("dev %d:%d ino %#lx %s %s address %#lx vm_start "
> + TP_printk("dev %d:%d ino %#llx %s %s address %#lx vm_start "
> "%#lx vm_end %#lx pgoff %#lx max_pgoff %#lx %s",
> MAJOR(__entry->dev),
> MINOR(__entry->dev),
> @@ -66,7 +66,7 @@ DECLARE_EVENT_CLASS(dax_pmd_load_hole_class,
> void *radix_entry),
> TP_ARGS(inode, vmf, zero_folio, radix_entry),
> TP_STRUCT__entry(
> - __field(unsigned long, ino)
> + __field(u64, ino)
> __field(vm_flags_t, vm_flags)
> __field(unsigned long, address)
> __field(struct folio *, zero_folio)
> @@ -81,7 +81,7 @@ DECLARE_EVENT_CLASS(dax_pmd_load_hole_class,
> __entry->zero_folio = zero_folio;
> __entry->radix_entry = radix_entry;
> ),
> - TP_printk("dev %d:%d ino %#lx %s address %#lx zero_folio %p "
> + TP_printk("dev %d:%d ino %#llx %s address %#lx zero_folio %p "
> "radix_entry %#lx",
> MAJOR(__entry->dev),
> MINOR(__entry->dev),
> @@ -106,7 +106,7 @@ DECLARE_EVENT_CLASS(dax_pte_fault_class,
> TP_PROTO(struct inode *inode, struct vm_fault *vmf, int result),
> TP_ARGS(inode, vmf, result),
> TP_STRUCT__entry(
> - __field(unsigned long, ino)
> + __field(u64, ino)
> __field(vm_flags_t, vm_flags)
> __field(unsigned long, address)
> __field(pgoff_t, pgoff)
> @@ -123,7 +123,7 @@ DECLARE_EVENT_CLASS(dax_pte_fault_class,
> __entry->pgoff = vmf->pgoff;
> __entry->result = result;
> ),
> - TP_printk("dev %d:%d ino %#lx %s %s address %#lx pgoff %#lx %s",
> + TP_printk("dev %d:%d ino %#llx %s %s address %#lx pgoff %#lx %s",
> MAJOR(__entry->dev),
> MINOR(__entry->dev),
> __entry->ino,
> @@ -150,7 +150,7 @@ DECLARE_EVENT_CLASS(dax_writeback_range_class,
> TP_PROTO(struct inode *inode, pgoff_t start_index, pgoff_t end_index),
> TP_ARGS(inode, start_index, end_index),
> TP_STRUCT__entry(
> - __field(unsigned long, ino)
> + __field(u64, ino)
> __field(pgoff_t, start_index)
> __field(pgoff_t, end_index)
> __field(dev_t, dev)
> @@ -161,7 +161,7 @@ DECLARE_EVENT_CLASS(dax_writeback_range_class,
> __entry->start_index = start_index;
> __entry->end_index = end_index;
> ),
> - TP_printk("dev %d:%d ino %#lx pgoff %#lx-%#lx",
> + TP_printk("dev %d:%d ino %#llx pgoff %#lx-%#lx",
> MAJOR(__entry->dev),
> MINOR(__entry->dev),
> __entry->ino,
> @@ -182,7 +182,7 @@ TRACE_EVENT(dax_writeback_one,
> TP_PROTO(struct inode *inode, pgoff_t pgoff, pgoff_t pglen),
> TP_ARGS(inode, pgoff, pglen),
> TP_STRUCT__entry(
> - __field(unsigned long, ino)
> + __field(u64, ino)
> __field(pgoff_t, pgoff)
> __field(pgoff_t, pglen)
> __field(dev_t, dev)
> @@ -193,7 +193,7 @@ TRACE_EVENT(dax_writeback_one,
> __entry->pgoff = pgoff;
> __entry->pglen = pglen;
> ),
> - TP_printk("dev %d:%d ino %#lx pgoff %#lx pglen %#lx",
> + TP_printk("dev %d:%d ino %#llx pgoff %#lx pglen %#lx",
> MAJOR(__entry->dev),
> MINOR(__entry->dev),
> __entry->ino,
> diff --git a/include/trace/events/fsverity.h b/include/trace/events/fsverity.h
> index a8c52f21cbd5eb010c7e7b2fdb8f9de49c8ea326..4477c17e05748360965c4e1840590efe96d6335e 100644
> --- a/include/trace/events/fsverity.h
> +++ b/include/trace/events/fsverity.h
> @@ -16,7 +16,7 @@ TRACE_EVENT(fsverity_enable,
> const struct merkle_tree_params *params),
> TP_ARGS(inode, params),
> TP_STRUCT__entry(
> - __field(ino_t, ino)
> + __field(u64, ino)
Do you need to convert all these ino_t's?
> __field(u64, data_size)
> __field(u64, tree_size)
> __field(unsigned int, merkle_block)
> @@ -29,8 +29,8 @@ TRACE_EVENT(fsverity_enable,
> __entry->merkle_block = params->block_size;
> __entry->num_levels = params->num_levels;
> ),
> - TP_printk("ino %lu data_size %llu tree_size %llu merkle_block %u levels %u",
> - (unsigned long) __entry->ino,
> + TP_printk("ino %llu data_size %llu tree_size %llu merkle_block %u levels %u",
> + __entry->ino,
> __entry->data_size,
> __entry->tree_size,
> __entry->merkle_block,
> @@ -42,7 +42,7 @@ TRACE_EVENT(fsverity_tree_done,
> const struct merkle_tree_params *params),
> TP_ARGS(inode, vi, params),
> TP_STRUCT__entry(
> - __field(ino_t, ino)
> + __field(u64, ino)
> __field(u64, data_size)
> __field(u64, tree_size)
> __field(unsigned int, merkle_block)
> @@ -59,8 +59,8 @@ TRACE_EVENT(fsverity_tree_done,
> memcpy(__get_dynamic_array(root_hash), vi->root_hash, __get_dynamic_array_len(root_hash));
> memcpy(__get_dynamic_array(file_digest), vi->file_digest, __get_dynamic_array_len(file_digest));
> ),
> - TP_printk("ino %lu data_size %llu tree_size %lld merkle_block %u levels %u root_hash %s digest %s",
> - (unsigned long) __entry->ino,
> + TP_printk("ino %llu data_size %llu tree_size %lld merkle_block %u levels %u root_hash %s digest %s",
> + __entry->ino,
> __entry->data_size,
> __entry->tree_size,
> __entry->merkle_block,
> @@ -75,7 +75,7 @@ TRACE_EVENT(fsverity_verify_data_block,
> u64 data_pos),
> TP_ARGS(inode, params, data_pos),
> TP_STRUCT__entry(
> - __field(ino_t, ino)
> + __field(u64, ino)
> __field(u64, data_pos)
> __field(unsigned int, merkle_block)
> ),
> @@ -84,8 +84,8 @@ TRACE_EVENT(fsverity_verify_data_block,
> __entry->data_pos = data_pos;
> __entry->merkle_block = params->block_size;
> ),
> - TP_printk("ino %lu data_pos %llu merkle_block %u",
> - (unsigned long) __entry->ino,
> + TP_printk("ino %llu data_pos %llu merkle_block %u",
> + __entry->ino,
> __entry->data_pos,
> __entry->merkle_block)
> );
> @@ -96,7 +96,7 @@ TRACE_EVENT(fsverity_merkle_hit,
> unsigned int hidx),
> TP_ARGS(inode, data_pos, hblock_idx, level, hidx),
> TP_STRUCT__entry(
> - __field(ino_t, ino)
> + __field(u64, ino)
> __field(u64, data_pos)
Heh, this actually removed a hole, but again, why convert ino_t?
Anyway, I stopped here. But you get the idea.
-- Steve
> __field(unsigned long, hblock_idx)
> __field(unsigned int, level)
^ permalink raw reply
* Re: [PATCH v2 3/4] mm: convert compaction to zone lock wrappers
From: Dmitry Ilvokhin @ 2026-02-26 17:45 UTC (permalink / raw)
To: Andrew Morton
Cc: David Hildenbrand, Lorenzo Stoakes, Liam R. Howlett,
Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Brendan Jackman, Johannes Weiner, Zi Yan, Oscar Salvador,
Qi Zheng, Shakeel Butt, Axel Rasmussen, Yuanchu Xie, Wei Xu,
linux-kernel, linux-mm, linux-trace-kernel, linux-cxl,
kernel-team, Benjamin Cheatham
In-Reply-To: <20260225121252.7c6519a857c1a8c56ba5206f@linux-foundation.org>
On Wed, Feb 25, 2026 at 12:12:52PM -0800, Andrew Morton wrote:
> On Wed, 25 Feb 2026 14:43:05 +0000 Dmitry Ilvokhin <d@ilvokhin.com> wrote:
>
> > Compaction uses compact_lock_irqsave(), which currently operates
> > on a raw spinlock_t pointer so that it can be used for both
> > zone->lock and lru_lock. Since zone lock operations are now wrapped,
> > compact_lock_irqsave() can no longer operate directly on a spinlock_t
> > when the lock belongs to a zone.
> >
> > Introduce struct compact_lock to abstract the underlying lock type. The
> > structure carries a lock type enum and a union holding either a zone
> > pointer or a raw spinlock_t pointer, and dispatches to the appropriate
> > lock/unlock helper.
>
> It's regrettable that adds overhead - increased .text, increased
> instructions.
>
> Thing is, compact_lock_irqsave() has only two callsites. One knows
> that it's dealing with the zone lock, the other knows that it's dealing
> with the lruvec lock.
>
> Would it not be simpler and more efficient to copy/paste/edit two
> versions of compact_lock_irqsave()? A compact_zone_lock_irqsave() and a
> compact_lruvec_lock_irqsave()?
>
Thanks for the feedback, Andrew.
My initial goal was to reduce code duplication by keeping the logic
centralized, but your rationale makes sense. Given that there are only
two call sites and both statically know the lock type, splitting the
helper avoids unnecessary abstraction.
I'll introduce compact_zone_lock_irqsave() and
compact_lruvec_lock_irqsave() in v3.
^ permalink raw reply
* Re: [PATCH v4 3/3] ring-buffer: Skip invalid sub-buffers when validating persistent ring buffer
From: Steven Rostedt @ 2026-02-26 17:36 UTC (permalink / raw)
To: Masami Hiramatsu (Google)
Cc: Mathieu Desnoyers, linux-kernel, linux-trace-kernel
In-Reply-To: <20260226215833.4ad4f07f2cd06c9ccf5c1afa@kernel.org>
On Thu, 26 Feb 2026 21:58:33 +0900
Masami Hiramatsu (Google) <mhiramat@kernel.org> wrote:
> > --- a/kernel/trace/ring_buffer.c
> > +++ b/kernel/trace/ring_buffer.c
> > @@ -2058,17 +2058,18 @@ static void rb_meta_validate_events(struct ring_buffer_per_cpu *cpu_buffer)
> > if (ret < 0) {
> > pr_info("Ring buffer meta [%d] invalid buffer page\n",
> > cpu_buffer->cpu);
>
> This pr_info() should be removed too, because multiple pages
> can be discarded.
I wouldn't discard it, but instead add a "once" variable, where it shows it
only once per CPU.
-- Steve
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox