Linux EXT4 FS development
 help / color / mirror / Atom feed
* Re: [patch 07/38] treewide: Consolidate cycles_t
From: Thomas Gleixner @ 2026-04-16 19:32 UTC (permalink / raw)
  To: Christophe Leroy (CS GROUP), LKML
  Cc: Arnd Bergmann, x86, Lu Baolu, iommu, Michael Grzeschik, netdev,
	linux-wireless, Herbert Xu, linux-crypto, Vlastimil Babka,
	linux-mm, David Woodhouse, Bernie Thompson, linux-fbdev,
	Theodore Tso, linux-ext4, Andrew Morton, Uladzislau Rezki,
	Marco Elver, Dmitry Vyukov, kasan-dev, Andrey Ryabinin,
	Thomas Sailer, linux-hams, Jason A. Donenfeld, Richard Henderson,
	linux-alpha, Russell King, linux-arm-kernel, Catalin Marinas,
	Huacai Chen, loongarch, Geert Uytterhoeven, linux-m68k,
	Dinh Nguyen, Jonas Bonn, linux-openrisc, Helge Deller,
	linux-parisc, Michael Ellerman, linuxppc-dev, Paul Walmsley,
	linux-riscv, Heiko Carstens, linux-s390, David S. Miller,
	sparclinux
In-Reply-To: <0758843e-8f75-4c82-b9c0-25fab502e62f@kernel.org>

On Wed, Apr 15 2026 at 08:43, Christophe Leroy wrote:
>> -typedef unsigned long cycles_t;
>> -
>> -static inline cycles_t get_cycles(void)
>> +ostatic inline cycles_t get_cycles(void)
>
> What is 'ostatic' ?

That's a really good question :)

^ permalink raw reply

* Re: [patch 35/38] s390: Select ARCH_HAS_RANDOM_ENTROPY
From: Thomas Gleixner @ 2026-04-16 19:29 UTC (permalink / raw)
  To: Heiko Carstens
  Cc: LKML, linux-s390, Arnd Bergmann, x86, Lu Baolu, iommu,
	Michael Grzeschik, netdev, linux-wireless, Herbert Xu,
	linux-crypto, Vlastimil Babka, linux-mm, David Woodhouse,
	Bernie Thompson, linux-fbdev, Theodore Tso, linux-ext4,
	Andrew Morton, Uladzislau Rezki, Marco Elver, Dmitry Vyukov,
	kasan-dev, Andrey Ryabinin, Thomas Sailer, linux-hams,
	Jason A. Donenfeld, Richard Henderson, linux-alpha, Russell King,
	linux-arm-kernel, Catalin Marinas, Huacai Chen, loongarch,
	Geert Uytterhoeven, linux-m68k, Dinh Nguyen, Jonas Bonn,
	linux-openrisc, Helge Deller, linux-parisc, Michael Ellerman,
	linuxppc-dev, Paul Walmsley, linux-riscv, David S. Miller,
	sparclinux
In-Reply-To: <20260416134238.9230Ba6-hca@linux.ibm.com>

On Thu, Apr 16 2026 at 15:42, Heiko Carstens wrote:
> On Fri, Apr 10, 2026 at 02:21:19PM +0200, Thomas Gleixner wrote:
>> The only remaining non-architecture usage of get_cycles() is to provide
>> random_get_entropy().
>> 
>> Switch s390 over to the new scheme of selecting ARCH_HAS_RANDOM_ENTROPY and
>> providing random_get_entropy() in asm/random.h.
>> 
>> Add 'asm/timex.h' includes to the relevant files, so the global include can
>> be removed once all architectures are converted over.
>> 
>> Signed-off-by: Thomas Gleixner <tglx@kernel.org>
>> Cc: Heiko Carstens <hca@linux.ibm.com>
>> Cc: linux-s390@vger.kernel.org
>> ---
>>  arch/s390/Kconfig              |    1 +
>>  arch/s390/include/asm/random.h |   12 ++++++++++++
>>  arch/s390/include/asm/timex.h  |    6 ------
>>  arch/s390/kernel/time.c        |    1 +
>>  arch/s390/kernel/vtime.c       |    1 +
>>  5 files changed, 15 insertions(+), 6 deletions(-)
>
> Acked-by: Heiko Carstens <hca@linux.ibm.com>
>
> Thomas, would you mind adding the below as minor improvement to this
> series?

Sure. I'll respin it next week.

^ permalink raw reply

* Re: [PATCH 4/6] generic/765: Ignore mkfs warning
From: Zorro Lang @ 2026-04-16 15:55 UTC (permalink / raw)
  To: Theodore Tso
  Cc: Darrick J. Wong, Ojaswin Mujoo, Zorro Lang, fstests, fdmanana,
	ritesh.list, naohiro.aota, wqu, Disha Goel, linux-ext4
In-Reply-To: <20260413204215.GA5461@macsyma-wired.lan>

On Mon, Apr 13, 2026 at 04:42:15PM -0400, Theodore Tso wrote:
> > > > > > The output can get corrupted with warnings like below because clustersize
> > > > > > more than 16xbs is experimental:
> > > > > > 
> > > > > > + 16 times the block size is considered experimental
> > > > > > 
> > > > > > Hence pipe these to seqres.full to avoid false negatives.
> 
> You could also suppress the warnings using the -q option, for example:
> 
> mke2fs -Fq -t ext4 -O bigalloc,quota -b 4096 -C 131072 /tmp/foo.img 4G
> 
> > > Futher, mke2fs has multiple instances where we print warnings to stderr,
> > > should we go and fix all of them as well?
> > 
> > "stderr" meaning "standard error", I'd say that errors are anything that
> > prohibits the format from completing, and only errors should go there.
> 
> Sure, I'll accept those changes.  But adding -q will allow the test to
> pass using older versions of e2fsprogs, while still allowing stderr to
> go out the expected output.

Aha, good point! Thanks Ted :)

> 
> 					- Ted
> 

^ permalink raw reply

* Re: [PATCH] iomap: avoid memset iomap when iter is done
From: Darrick J. Wong @ 2026-04-16 15:27 UTC (permalink / raw)
  To: Brian Foster
  Cc: Fengnan Chang, brauner, hch, linux-xfs, linux-fsdevel, linux-ext4,
	lidiangang, Fengnan Chang
In-Reply-To: <aeDjui2LGSidEHcJ@bfoster>

On Thu, Apr 16, 2026 at 09:27:22AM -0400, Brian Foster wrote:
> On Thu, Apr 16, 2026 at 11:06:42AM +0800, Fengnan Chang wrote:
> > When iomap_iter() finishes its iteration (returns <= 0), it is no longer
> > necessary to memset the entire iomap and srcmap structures.
> > 
> > In high-IOPS scenarios (like 4k randread NVMe polling with io_uring),
> > where the majority of I/Os complete in a single extent map, this wasted
> > memory write bandwidth, as the caller will just discard the iterator.
> > 
> > Use this command to test:
> > taskset -c 30 ./t/io_uring -p1 -d512 -b4096 -s32 -c32 -F1 -B1 -R1 -X1
> > -n1 -P1 /mnt/testfile
> > IOPS improve about 5% on ext4 and XFS.
> > 
> > However, we MUST still call iomap_iter_reset_iomap() to release the
> > folio_batch if IOMAP_F_FOLIO_BATCH is set, otherwise we leak page
> > references. Therefore, split the cleanup logic: always release the
> > folio_batch, but skip the memset() when ret <= 0.
> > 
> > Signed-off-by: Fengnan Chang <changfengnan@bytedance.com>
> > ---
> >  fs/iomap/iter.c | 5 +++--
> >  1 file changed, 3 insertions(+), 2 deletions(-)
> > 
> > diff --git a/fs/iomap/iter.c b/fs/iomap/iter.c
> > index c04796f6e57f..91eb5e6165ff 100644
> > --- a/fs/iomap/iter.c
> > +++ b/fs/iomap/iter.c
> > @@ -15,8 +15,6 @@ static inline void iomap_iter_reset_iomap(struct iomap_iter *iter)
> >  	}
> >  
> >  	iter->status = 0;
> > -	memset(&iter->iomap, 0, sizeof(iter->iomap));
> > -	memset(&iter->srcmap, 0, sizeof(iter->srcmap));
> >  }
> >  
> >  /* Advance the current iterator position and decrement the remaining length */
> > @@ -106,6 +104,9 @@ int iomap_iter(struct iomap_iter *iter, const struct iomap_ops *ops)
> >  	if (ret <= 0)
> >  		return ret;
> >  
> > +	memset(&iter->iomap, 0, sizeof(iter->iomap));
> > +	memset(&iter->srcmap, 0, sizeof(iter->srcmap));
> > +
> 
> This seems reasonable to me in principle, but it feels a little odd to
> leave a reset helper that doesn't really do a "reset." I wonder if this
> should be refactored into an iomap_iter_complete() (i.e. "complete an
> iteration") helper that includes the ret assignment logic just above the
> reset call and returns it, and then maybe leave a oneline comment above
> the memset so somebody doesn't blindly fold it back in the future. So
> for example:
> 
> 	ret = iomap_iter_complete(iter);
> 	if (ret <= 0)
> 		return ret;
> 
> 	/* save cycles and only clear the mappings if we plan to iterate */
> 	memset(..);
> 	...
> 
> We'd probably have to recheck some of the iter state within the new
> helper, but that doesn't seem like a big deal to me. Thoughts?

What kind of computer is this where there's a 5% hit to iops from a
memset of ~150 bytes?

--D

> Brian
> 
> >  begin:
> >  	ret = ops->iomap_begin(iter->inode, iter->pos, iter->len, iter->flags,
> >  			       &iter->iomap, &iter->srcmap);
> > -- 
> > 2.39.5 (Apple Git-154)
> > 
> > 
> 

^ permalink raw reply

* Re: [PATCH v2 3/3] ext4: derive f_fsid from block device to avoid collisions
From: Anand Jain @ 2026-04-16 15:21 UTC (permalink / raw)
  To: Theodore Tso
  Cc: Christoph Hellwig, Darrick J. Wong, linux-ext4, linux-btrfs,
	linux-xfs, Anand Jain, dsterba
In-Reply-To: <20260409131238.GC18443@macsyma-wired.lan>



On 9/4/26 21:12, Theodore Tso wrote:
> On Thu, Apr 09, 2026 at 05:45:24PM +0800, Anand Jain wrote:
>>
>> Got it. Do you mean that since both filesystems are identical,
>> statfs(A) and statfs(B) can legitimately return the same values?
> 
> Yes.  f_Fsid can legitimately always be zero (which I believe is the
> case for FreeBSD, but I understand that there are some programs, like
> systemd, which subscribe to the heresy, "All the World's Linux", which
> is a variant of the "All the World's a Vax" or "All the World's SunOS"
> at the beginning of my career :-).
> 
>> I'm not entirely sure what the correct expectation for f_fsid
>> should be.
> 
> That's my point, there *is* no correct expectation, and I don't
> believe there can or should be.  What we should be doing instead is
> actively discouraging people from using f_fsid.  I suspect that's one
> of the reasons why FreeBSD may have chosen to just return zero.
> 
> Which is why I don't think we should be testing this in xfstests's
> generic/791, either.  (Unless we get consensus across file system
> developers abnd willing to make it be a documented behavior as of a
> particular kernel version, and we then adjust the test to skip it if
> it's older than that kernel version, so it doesn't break LTS kernel
> tests.  See below....)
> 

Yes, the idea for generic/79[0-5] was really just to make sure
we don't accidentally change s_uuid or f_fsid behavior without
realizing it. It gives us a baseline for current and LTS kernels
if f_fsid/s_uuid is changed. (Some of the submitted test cases
may still need revision).

>> My initial idea was to make f_fsid behavior consistent across
>> major filesystems so that user space benefits from predictable
>> semantics.
> 
> I'm OK with that, so long as it's unconditional across all file system
> types (ideally) or unconditionally across all major file systems (xfs,
> btrfs, ext4, f2fs) as of a particular kernel version (which is
> probably much more realistic), *and* it is documented in the Linux man
> pages as this is the standard behavior starting with 7.1 (or
> whatever), and that the man page further cautions that programs that
> expect to be portable to other OS's (MacOS, FreeBSD, Solaris, etc.)
> should not count on this behavior.
> 

On second thought, we should perhaps consider a more robust ID,
let's call it `f_fsid_v2`. More on `f_fsid_v2` below.

> But given that you originally stumbled across this with Overlayfs,
> because it was originally using s_uuid, and that didn't work well for
> btrfs, why not change overlayfs to just use s_uuid plus kdev_t in its
> xattr, and just fix the problem for overlayfs?  That has the benefit
> that it will work for all file system types in Linux, not just for
> those where we have changed what f_fsid does.

Using `kdev_t` (or any derivation of it) for persistent storage, such
as Overlayfs xattrs, is problematic. Since `kdev_t` is transient and
inconsistent across reboots or device re-discovery, it could lead to
broken associations.


It seems we've reached the functional limits of f_fsid.
If we want to solve this properly for Overlayfs, NFS handles, or a
complex system monitoring..etc, we need a new identifier let's call
it f_fsid_v2, that meets the following requirements:

  System-wide Uniqueness: Must distinguish between cloned filesystems.

  Persistence: Must remain consistent across reboots/HW re-enumeration.

  Non-On-Disk: Must not be stored on-disk.


One possible implementation for f_fsid_v2 could be:

   f_fsid_v2 =  hash(s_uuid, block_device_serial, [subvol_id])

For pseudo block devices (virtio-blk, loop, nbd, brd,..),
the serial could be derived recursively:

   serial_number = hash(backing_file.f_fsid_v2, backing_file.ino)

Note on Hardware Serials:
 Standard storage protocols (T10, NVMe, SAS) mandate unique,
 persistent serials per LUN. While I've seen T10 protocol
 violations during my time authoring Solaris HBA drivers, I
 believe these outliers shouldn't dictate the design.

This approach provides a system-wide unique ID that is persistent
without being stored on-disk. Effectively solving the cloned
filesystem identity crisis.

Thoughts ?

Thanks, Anand



^ permalink raw reply

* Re: [patch 35/38] s390: Select ARCH_HAS_RANDOM_ENTROPY
From: Heiko Carstens @ 2026-04-16 13:42 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, linux-s390, Arnd Bergmann, x86, Lu Baolu, iommu,
	Michael Grzeschik, netdev, linux-wireless, Herbert Xu,
	linux-crypto, Vlastimil Babka, linux-mm, David Woodhouse,
	Bernie Thompson, linux-fbdev, Theodore Tso, linux-ext4,
	Andrew Morton, Uladzislau Rezki, Marco Elver, Dmitry Vyukov,
	kasan-dev, Andrey Ryabinin, Thomas Sailer, linux-hams,
	Jason A. Donenfeld, Richard Henderson, linux-alpha, Russell King,
	linux-arm-kernel, Catalin Marinas, Huacai Chen, loongarch,
	Geert Uytterhoeven, linux-m68k, Dinh Nguyen, Jonas Bonn,
	linux-openrisc, Helge Deller, linux-parisc, Michael Ellerman,
	linuxppc-dev, Paul Walmsley, linux-riscv, David S. Miller,
	sparclinux
In-Reply-To: <20260410120319.924028412@kernel.org>

On Fri, Apr 10, 2026 at 02:21:19PM +0200, Thomas Gleixner wrote:
> The only remaining non-architecture usage of get_cycles() is to provide
> random_get_entropy().
> 
> Switch s390 over to the new scheme of selecting ARCH_HAS_RANDOM_ENTROPY and
> providing random_get_entropy() in asm/random.h.
> 
> Add 'asm/timex.h' includes to the relevant files, so the global include can
> be removed once all architectures are converted over.
> 
> Signed-off-by: Thomas Gleixner <tglx@kernel.org>
> Cc: Heiko Carstens <hca@linux.ibm.com>
> Cc: linux-s390@vger.kernel.org
> ---
>  arch/s390/Kconfig              |    1 +
>  arch/s390/include/asm/random.h |   12 ++++++++++++
>  arch/s390/include/asm/timex.h  |    6 ------
>  arch/s390/kernel/time.c        |    1 +
>  arch/s390/kernel/vtime.c       |    1 +
>  5 files changed, 15 insertions(+), 6 deletions(-)

Acked-by: Heiko Carstens <hca@linux.ibm.com>

Thomas, would you mind adding the below as minor improvement to this
series?

From 7072e5d66b99a7fa666d17c6ad8cb254f2d8f473 Mon Sep 17 00:00:00 2001
From: Heiko Carstens <hca@linux.ibm.com>
Date: Thu, 16 Apr 2026 15:08:15 +0200
Subject: [PATCH] s390: Use get_tod_clock_fast() for random_get_entropy()

Use get_tod_clock_fast() instead of get_tod_clock_monotonic() to implement
random_get_entropy().

There is no need for random_get_entropy() to provide monotonic increasing
values, nor is there any need to provide (close to) nanosecond granularity
timestamps by shifting the result.

This slightly reduces the execution time of random_get_entropy() and adds
two bits of randomness.

Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
---
 arch/s390/include/asm/random.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/s390/include/asm/random.h b/arch/s390/include/asm/random.h
index 7daf42dbed32..f6d9312efdbf 100644
--- a/arch/s390/include/asm/random.h
+++ b/arch/s390/include/asm/random.h
@@ -6,7 +6,7 @@
 
 static inline unsigned long random_get_entropy(void)
 {
-	return (unsigned long)get_tod_clock_monotonic() >> 2;
+	return get_tod_clock_fast();
 }
 
 #endif
-- 
2.51.0


^ permalink raw reply related

* Re: [PATCH] iomap: avoid memset iomap when iter is done
From: Brian Foster @ 2026-04-16 13:27 UTC (permalink / raw)
  To: Fengnan Chang
  Cc: brauner, djwong, hch, linux-xfs, linux-fsdevel, linux-ext4,
	lidiangang, Fengnan Chang
In-Reply-To: <20260416030642.26744-1-changfengnan@bytedance.com>

On Thu, Apr 16, 2026 at 11:06:42AM +0800, Fengnan Chang wrote:
> When iomap_iter() finishes its iteration (returns <= 0), it is no longer
> necessary to memset the entire iomap and srcmap structures.
> 
> In high-IOPS scenarios (like 4k randread NVMe polling with io_uring),
> where the majority of I/Os complete in a single extent map, this wasted
> memory write bandwidth, as the caller will just discard the iterator.
> 
> Use this command to test:
> taskset -c 30 ./t/io_uring -p1 -d512 -b4096 -s32 -c32 -F1 -B1 -R1 -X1
> -n1 -P1 /mnt/testfile
> IOPS improve about 5% on ext4 and XFS.
> 
> However, we MUST still call iomap_iter_reset_iomap() to release the
> folio_batch if IOMAP_F_FOLIO_BATCH is set, otherwise we leak page
> references. Therefore, split the cleanup logic: always release the
> folio_batch, but skip the memset() when ret <= 0.
> 
> Signed-off-by: Fengnan Chang <changfengnan@bytedance.com>
> ---
>  fs/iomap/iter.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/iomap/iter.c b/fs/iomap/iter.c
> index c04796f6e57f..91eb5e6165ff 100644
> --- a/fs/iomap/iter.c
> +++ b/fs/iomap/iter.c
> @@ -15,8 +15,6 @@ static inline void iomap_iter_reset_iomap(struct iomap_iter *iter)
>  	}
>  
>  	iter->status = 0;
> -	memset(&iter->iomap, 0, sizeof(iter->iomap));
> -	memset(&iter->srcmap, 0, sizeof(iter->srcmap));
>  }
>  
>  /* Advance the current iterator position and decrement the remaining length */
> @@ -106,6 +104,9 @@ int iomap_iter(struct iomap_iter *iter, const struct iomap_ops *ops)
>  	if (ret <= 0)
>  		return ret;
>  
> +	memset(&iter->iomap, 0, sizeof(iter->iomap));
> +	memset(&iter->srcmap, 0, sizeof(iter->srcmap));
> +

This seems reasonable to me in principle, but it feels a little odd to
leave a reset helper that doesn't really do a "reset." I wonder if this
should be refactored into an iomap_iter_complete() (i.e. "complete an
iteration") helper that includes the ret assignment logic just above the
reset call and returns it, and then maybe leave a oneline comment above
the memset so somebody doesn't blindly fold it back in the future. So
for example:

	ret = iomap_iter_complete(iter);
	if (ret <= 0)
		return ret;

	/* save cycles and only clear the mappings if we plan to iterate */
	memset(..);
	...

We'd probably have to recheck some of the iter state within the new
helper, but that doesn't seem like a big deal to me. Thoughts?

Brian

>  begin:
>  	ret = ops->iomap_begin(iter->inode, iter->pos, iter->len, iter->flags,
>  			       &iter->iomap, &iter->srcmap);
> -- 
> 2.39.5 (Apple Git-154)
> 
> 


^ permalink raw reply

* Re: [PATCH 01/61] Coccinelle: Prefer IS_ERR_OR_NULL over manual NULL check
From: Krzysztof Kozlowski @ 2026-04-16 12:30 UTC (permalink / raw)
  To: Philipp Hahn, amd-gfx, apparmor, bpf, ceph-devel, cocci, dm-devel,
	dri-devel, gfs2, intel-gfx, intel-wired-lan, iommu, kvm,
	linux-arm-kernel, linux-block, linux-bluetooth, linux-btrfs,
	linux-cifs, linux-clk, linux-erofs, linux-ext4, linux-fsdevel,
	linux-gpio, linux-hyperv, linux-input, linux-kernel, linux-leds,
	linux-media, linux-mips, linux-mm, linux-modules, linux-mtd,
	linux-nfs, linux-omap, linux-phy, linux-pm, linux-rockchip,
	linux-s390, linux-scsi, linux-sctp, linux-security-module,
	linux-sh, linux-sound, linux-stm32, linux-trace-kernel, linux-usb,
	linux-wireless, netdev, ntfs3, samba-technical, sched-ext,
	target-devel, tipc-discussion, v9fs
  Cc: Julia Lawall, Nicolas Palix
In-Reply-To: <20260310-b4-is_err_or_null-v1-1-bd63b656022d@avm.de>

On 10/03/2026 12:48, Philipp Hahn wrote:
> Find and convert uses of IS_ERR() plus NULL check to IS_ERR_OR_NULL().
> 
> There are several cases where `!ptr && WARN_ON[_ONCE](IS_ERR(ptr))` is
> used:
> - arch/x86/kernel/callthunks.c:215 WARN_ON_ONCE
> - drivers/clk/clk.c:4561 WARN_ON_ONCE
> - drivers/interconnect/core.c:793 WARN_ON
> - drivers/reset/core.c:718 WARN_ON
> The change is not 100% semantical equivalent as the warning will now
> also happen when the pointer is NULL.
> 
> To: Julia Lawall <Julia.Lawall@inria.fr>
> To: Nicolas Palix <nicolas.palix@imag.fr>
> Cc: cocci@inria.fr
> Cc: linux-kernel@vger.kernel.org
> 
> ---
> drivers/clocksource/mips-gic-timer.c:283 looks suspicious: ret != clk,
> but Daniel Lezcano verified it as cottect.
> 
> There are some cases where the checks are part of a larger expression:
> - mm/kmemleak.c:1095
> - mm/kmemleak.c:1155
> - mm/kmemleak.c:1173
> - mm/kmemleak.c:1290
> - mm/kmemleak.c:1328
> - mm/kmemleak.c:1241
> - mm/kmemleak.c:1310
> - mm/kmemleak.c:1258
> - net/netlink/af_netlink.c:2670
> Thanks to Julia Lawall for the help to also handle them.
> 
> Signed-off-by: Philipp Hahn <phahn-oss@avm.de>
> ---
>  scripts/coccinelle/api/is_err_or_null.cocci | 125 ++++++++++++++++++++++++++++
>  1 file changed, 125 insertions(+)
> 

Neither this, nor try from 2011, nor any future try should be accepted,
because it creates impression IS_ERR_OR_NULL is somehow okay. No, it is
not okay, it is a discouraged pattern leading to less readable and
maintainable code. We should not have therefore any tools suggesting
usage of IS_ERR_OR_NULL, because people will be converting poor code
into that, instead of fixing that poor code.

Best regards,
Krzysztof

^ permalink raw reply

* Re: [PATCH 55/61] interconnect: Prefer IS_ERR_OR_NULL over manual NULL check
From: Krzysztof Kozlowski @ 2026-04-16 12:24 UTC (permalink / raw)
  To: Philipp Hahn, amd-gfx, apparmor, bpf, ceph-devel, cocci, dm-devel,
	dri-devel, gfs2, intel-gfx, intel-wired-lan, iommu, kvm,
	linux-arm-kernel, linux-block, linux-bluetooth, linux-btrfs,
	linux-cifs, linux-clk, linux-erofs, linux-ext4, linux-fsdevel,
	linux-gpio, linux-hyperv, linux-input, linux-kernel, linux-leds,
	linux-media, linux-mips, linux-mm, linux-modules, linux-mtd,
	linux-nfs, linux-omap, linux-phy, linux-pm, linux-rockchip,
	linux-s390, linux-scsi, linux-sctp, linux-security-module,
	linux-sh, linux-sound, linux-stm32, linux-trace-kernel, linux-usb,
	linux-wireless, netdev, ntfs3, samba-technical, sched-ext,
	target-devel, tipc-discussion, v9fs
  Cc: Georgi Djakov
In-Reply-To: <20260310-b4-is_err_or_null-v1-55-bd63b656022d@avm.de>

On 10/03/2026 12:49, Philipp Hahn wrote:
> Prefer using IS_ERR_OR_NULL() over using IS_ERR() and a manual NULL
> check.
> 
> Semantich change: Previously the code only printed the warning on error,
> but not when the pointer was NULL. Now the warning is printed in both
> cases!

NAK, read the code

> 
> Change found with coccinelle.
> 
> To: Georgi Djakov <djakov@kernel.org>
> Cc: linux-pm@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org
> Signed-off-by: Philipp Hahn <phahn-oss@avm.de>
> ---
>  drivers/interconnect/core.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/interconnect/core.c b/drivers/interconnect/core.c
> index 8569b78a18517b33abeafac091978b25cbc1acc7..22e92b30f73853d5bd2e05b4f52cb5aa22556468 100644
> --- a/drivers/interconnect/core.c
> +++ b/drivers/interconnect/core.c
> @@ -790,7 +790,7 @@ void icc_put(struct icc_path *path)
>  	size_t i;
>  	int ret;
>  
> -	if (!path || WARN_ON(IS_ERR(path)))
> +	if (WARN_ON(IS_ERR_OR_NULL(path)))

IS_ERR_OR_NULL is simply discouraged, but beside of code preference, you
just added bug here. This is clearly not equivalent and you emit warn on
perfectly valid case!

Best regards,
Krzysztof

^ permalink raw reply

* Re: [PATCH] jbd2: enforce power-of-two default revoke hash size at compile time
From: Theodore Tso @ 2026-04-16 11:54 UTC (permalink / raw)
  To: Jan Kara; +Cc: Andreas Dilger, Milos Nikic, linux-ext4, linux-kernel
In-Reply-To: <gq6n6m75h47lcr2hvmtlun7revnyf3bx3aanndglbh6djmrjcp@jmxhl7kf7bwu>

On Thu, Apr 16, 2026 at 12:16:05PM +0200, Jan Kara wrote:
> 
> Yes, I know. But there is already a runtime assertion in
> jbd2_journal_init_revoke() making sure the passed value is a power of two
> which is verifying also other callers that aren't using
> JOURNAL_REVOKE_DEFAULT_HASH value. I don't see a value in the *additional*
> BUILD_BUG_ON when we already have that runtime check.

... and if a developer doesn't run regression tests before bothering
the list with a patch... that's not a developer we want to cater to.

Milos, my recommended to workflow is to use kvm-xfstests[1], and just do:

% install-kconfig
% kbuild
% kvm-xfstests smoke

[1] https://github.com/tytso/xfstests-bld/blob/master/Documentation/kvm-quickstart.md

For a successful run, "kvm-xfstests smoke" will run take 15-20
minutes.  In the case of screwing up the default power-of-two default
revoke hash size, "kvm-xfstests smoke" will report a failure in less
than a minute.

						- Ted

^ permalink raw reply

* Re: [patch 07/38] treewide: Consolidate cycles_t
From: Geert Uytterhoeven @ 2026-04-16 11:22 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Arnd Bergmann, x86, Lu Baolu, iommu, Michael Grzeschik,
	netdev, linux-wireless, Herbert Xu, linux-crypto, Vlastimil Babka,
	linux-mm, David Woodhouse, Bernie Thompson, linux-fbdev,
	Theodore Tso, linux-ext4, Andrew Morton, Uladzislau Rezki,
	Marco Elver, Dmitry Vyukov, kasan-dev, Andrey Ryabinin,
	Thomas Sailer, linux-hams, Jason A. Donenfeld, Richard Henderson,
	linux-alpha, Russell King, linux-arm-kernel, Catalin Marinas,
	Huacai Chen, loongarch, Dinh Nguyen, Jonas Bonn, linux-openrisc,
	Helge Deller, linux-parisc, Michael Ellerman, linuxppc-dev,
	Paul Walmsley, linux-riscv, Heiko Carstens, linux-s390,
	David S. Miller, sparclinux
In-Reply-To: <20260410120318.045532623@kernel.org>

On Fri, 10 Apr 2026 at 14:19, Thomas Gleixner <tglx@kernel.org> wrote:
> Most architectures define cycles_t as unsigned long execpt:
>
>  - x86 requires it to be 64-bit independent of the 32-bit/64-bit build.
>
>  - parisc and mips define it as unsigned int
>
>    parisc has no real reason to do so as there are only a few usage sites
>    which either expand it to a 64-bit value or utilize only the lower
>    32bits.
>
>    mips has no real requirement either.
>
> Move the typedef to types.h and provide a config switch to enforce the
> 64-bit type for x86.
>
> Signed-off-by: Thomas Gleixner <tglx@kernel.org>

>  arch/m68k/include/asm/timex.h      |    2 --

Acked-by: Geert Uytterhoeven <geert@linux-m68k.org> # m68k

Gr{oetje,eeting}s,

                        Geert


--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply

* Re: [patch 05/38] treewide: Remove CLOCK_TICK_RATE
From: Geert Uytterhoeven @ 2026-04-16 11:22 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Arnd Bergmann, x86, Lu Baolu, iommu, Michael Grzeschik,
	netdev, linux-wireless, Herbert Xu, linux-crypto, Vlastimil Babka,
	linux-mm, David Woodhouse, Bernie Thompson, linux-fbdev,
	Theodore Tso, linux-ext4, Andrew Morton, Uladzislau Rezki,
	Marco Elver, Dmitry Vyukov, kasan-dev, Andrey Ryabinin,
	Thomas Sailer, linux-hams, Jason A. Donenfeld, Richard Henderson,
	linux-alpha, Russell King, linux-arm-kernel, Catalin Marinas,
	Huacai Chen, loongarch, linux-m68k, Dinh Nguyen, Jonas Bonn,
	linux-openrisc, Helge Deller, linux-parisc, Michael Ellerman,
	linuxppc-dev, Paul Walmsley, linux-riscv, Heiko Carstens,
	linux-s390, David S. Miller, sparclinux
In-Reply-To: <20260410120317.910770161@kernel.org>

On Fri, 10 Apr 2026 at 14:18, Thomas Gleixner <tglx@kernel.org> wrote:
> This has been scheduled for removal more than a decade ago and the comments
> related to it have been dutifully ignored. The last dependencies are gone.
>
> Remove it along with various now empty asm/timex.h files.
>
> Signed-off-by: Thomas Gleixner <tglx@kernel.org>

>  arch/m68k/include/asm/timex.h       |   15 ---------------

Acked-by: Geert Uytterhoeven <geert@linux-m68k.org> # m68k

Gr{oetje,eeting}s,

                        Geert


--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply

* Re: [patch 27/38] m68k: Select ARCH_HAS_RANDOM_ENTROPY
From: Geert Uytterhoeven @ 2026-04-16 11:22 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, linux-m68k, Arnd Bergmann, x86, Lu Baolu, iommu,
	Michael Grzeschik, netdev, linux-wireless, Herbert Xu,
	linux-crypto, Vlastimil Babka, linux-mm, David Woodhouse,
	Bernie Thompson, linux-fbdev, Theodore Tso, linux-ext4,
	Andrew Morton, Uladzislau Rezki, Marco Elver, Dmitry Vyukov,
	kasan-dev, Andrey Ryabinin, Thomas Sailer, linux-hams,
	Jason A. Donenfeld, Richard Henderson, linux-alpha, Russell King,
	linux-arm-kernel, Catalin Marinas, Huacai Chen, loongarch,
	Dinh Nguyen, Jonas Bonn, linux-openrisc, Helge Deller,
	linux-parisc, Michael Ellerman, linuxppc-dev, Paul Walmsley,
	linux-riscv, Heiko Carstens, linux-s390, David S. Miller,
	sparclinux
In-Reply-To: <20260410120319.397219631@kernel.org>

On Fri, 10 Apr 2026 at 14:20, Thomas Gleixner <tglx@kernel.org> wrote:
> The only remaining usage of get_cycles() is to provide
> random_get_entropy().
>
> Switch m68k over to the new scheme of selecting ARCH_HAS_RANDOM_ENTROPY and
> providing random_get_entropy() in asm/random.h.
>
> Remove asm/timex.h as it has no functionality anymore.
>
> Signed-off-by: Thomas Gleixner <tglx@kernel.org>

Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>

Gr{oetje,eeting}s,

                        Geert


--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply

* Re: [patch 18/38] lib/tests: Replace get_cycles() with ktime_get()
From: Geert Uytterhoeven @ 2026-04-16 10:24 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: LKML, Andrew Morton, Uladzislau Rezki, linux-mm, Arnd Bergmann,
	x86, Lu Baolu, iommu, Michael Grzeschik, netdev, linux-wireless,
	Herbert Xu, linux-crypto, Vlastimil Babka, David Woodhouse,
	Bernie Thompson, linux-fbdev, Theodore Tso, linux-ext4,
	Marco Elver, Dmitry Vyukov, kasan-dev, Andrey Ryabinin,
	Thomas Sailer, linux-hams, Jason A. Donenfeld, Richard Henderson,
	linux-alpha, Russell King, linux-arm-kernel, Catalin Marinas,
	Huacai Chen, loongarch, linux-m68k, Dinh Nguyen, Jonas Bonn,
	linux-openrisc, Helge Deller, linux-parisc, Michael Ellerman,
	linuxppc-dev, Paul Walmsley, linux-riscv, Heiko Carstens,
	linux-s390, David S. Miller, sparclinux
In-Reply-To: <20260410120318.794680738@kernel.org>

Hi Thomas,

On Fri, 10 Apr 2026 at 14:20, Thomas Gleixner <tglx@kernel.org> wrote:
> get_cycles() is the historical access to a fine grained time source, but it
> is a suboptimal choice for two reasons:
>
>    - get_cycles() is not guaranteed to be supported and functional on all
>      systems/platforms. If not supported or not functional it returns 0,
>      which makes benchmarking moot.
>
>    - get_cycles() returns the raw counter value of whatever the
>      architecture platform provides. The original x86 Time Stamp Counter
>      (TSC) was despite its name tied to the actual CPU core frequency.
>      That's not longer the case. So the counter value is only meaningful
>      when the CPU operates at the same frequency as the TSC or the value is
>      adjusted to the actual CPU frequency. Other architectures and
>      platforms provide similar disjunct counters via get_cycles(), so the
>      result is operations per BOGO-cycles, which is not really meaningful.
>
> Use ktime_get() instead which provides nanosecond timestamps with the
> granularity of the underlying hardware counter, which is not different to
> the variety of get_cycles() implementations.
>
> This provides at least understandable metrics, i.e. operations/nanoseconds,
> and is available on all platforms. As with get_cycles() the result might
> have to be put into relation with the CPU operating frequency, but that's
> not any different.
>
> This is part of a larger effort to remove get_cycles() usage from
> non-architecture code.
>
> Signed-off-by: Thomas Gleixner <tglx@kernel.org>

Thanks for your patch!

> --- a/lib/interval_tree_test.c
> +++ b/lib/interval_tree_test.c
> @@ -65,13 +65,13 @@ static void init(void)
>  static int basic_check(void)
>  {
>         int i, j;
> -       cycles_t time1, time2, time;
> +       ktime_t time1, time2, time;
>
>         printk(KERN_ALERT "interval tree insert/remove");
>
>         init();
>
> -       time1 = get_cycles();
> +       time1 = ktime_get();
>
>         for (i = 0; i < perf_loops; i++) {
>                 for (j = 0; j < nnodes; j++)
> @@ -80,11 +80,11 @@ static int basic_check(void)
>                         interval_tree_remove(nodes + j, &root);
>         }
>
> -       time2 = get_cycles();
> +       time2 = ktime_get();
>         time = time2 - time1;
>
>         time = div_u64(time, perf_loops);
> -       printk(" -> %llu cycles\n", (unsigned long long)time);
> +       printk(" -> %llu nsecs\n", (unsigned long long)time);

While cycles_t was unsigned long or long long, ktime_t is always s64,
so "%lld", and the cast can be dropped (everywhere).

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply

* Re: [PATCH] jbd2: enforce power-of-two default revoke hash size at compile time
From: Jan Kara @ 2026-04-16 10:16 UTC (permalink / raw)
  To: Andreas Dilger; +Cc: Jan Kara, Milos Nikic, tytso, linux-ext4, linux-kernel
In-Reply-To: <C27553C0-0A8E-4BCF-8C6F-1D62A69841C1@dilger.ca>

Hi!

On Wed 15-04-26 19:35:21, Andreas Dilger wrote:
> On Apr 14, 2026, at 06:59, Jan Kara <jack@suse.cz> wrote:
> > On Mon 13-04-26 14:27:24, Milos Nikic wrote:
> >> The jbd2 revoke table relies on bitwise AND operations for fast hash
> >> indexing, which requires the hash table size to be a strict power of two.
> >> 
> >> Currently, this requirement is only enforced at runtime via a J_ASSERT
> >> in jbd2_journal_init_revoke(). While this successfully catches invalid
> >> dynamic allocations, it means a developer accidentally modifying the
> >> hardcoded JOURNAL_REVOKE_DEFAULT_HASH macro will experience a system
> >> panic upon mounting the filesystem during testing.
> >> 
> >> Add a BUILD_BUG_ON() in journal_init_common() to validate the default
> >> macro at compile time. This acts as an immediate, zero-overhead
> >> safeguard, preventing compilation entirely if the default hash size is
> >> mathematically invalid.
> >> 
> >> Signed-off-by: Milos Nikic <nikic.milos@gmail.com>
> > 
> > Eh, if you modify JOURNAL_REVOKE_DEFAULT_HASH you should better know what
> > you are doing and if you mess up, then the kernel failing with assertion
> > isn't that difficult to diagnose. So sorry I don't think this "cleanup" is
> > useful either.
> 
> Jan,
> this is a BUILD_BUG_ON() so it won't cause any runtime assertion.

Yes, I know. But there is already a runtime assertion in
jbd2_journal_init_revoke() making sure the passed value is a power of two
which is verifying also other callers that aren't using
JOURNAL_REVOKE_DEFAULT_HASH value. I don't see a value in the *additional*
BUILD_BUG_ON when we already have that runtime check.

								Honza

-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

^ permalink raw reply

* Re: [PATCH v1] ext4: add mb_stats_clear for mballoc statistics
From: Zhang Yi @ 2026-04-16  8:53 UTC (permalink / raw)
  To: Baolin Liu, tytso, adilger.kernel
  Cc: linux-ext4, linux-kernel, wangguanyu, Baolin Liu
In-Reply-To: <20260414100212.95209-1-liubaolin12138@163.com>

On 4/14/2026 6:02 PM, Baolin Liu wrote:
> From: Baolin Liu <liubaolin@kylinos.cn>
> 
> Add a write-only mb_stats_clear sysfs knob to reset ext4 mballoc
> runtime statistics.This makes it easier to inspect allocator
> activity for a specific workload instead of using counters
> accumulated since mount.
> 
> Signed-off-by: Baolin Liu <liubaolin@kylinos.cn>

Looks good to me!

Reviewed-by: Zhang Yi <yi.zhang@huawei.com>

> ---
>  fs/ext4/ext4.h    |  1 +
>  fs/ext4/mballoc.c | 31 +++++++++++++++++++++++++++++++
>  fs/ext4/sysfs.c   | 24 ++++++++++++++++++++++++
>  3 files changed, 56 insertions(+)
> 
> diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
> index 7617e2d454ea..3a32e1a515dd 100644
> --- a/fs/ext4/ext4.h
> +++ b/fs/ext4/ext4.h
> @@ -2995,6 +2995,7 @@ int ext4_fc_record_regions(struct super_block *sb, int ino,
>  extern const struct seq_operations ext4_mb_seq_groups_ops;
>  extern const struct seq_operations ext4_mb_seq_structs_summary_ops;
>  extern int ext4_seq_mb_stats_show(struct seq_file *seq, void *offset);
> +extern void ext4_mb_stats_clear(struct ext4_sb_info *sbi);
>  extern int ext4_mb_init(struct super_block *);
>  extern void ext4_mb_release(struct super_block *);
>  extern ext4_fsblk_t ext4_mb_new_blocks(handle_t *,
> diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
> index bb58eafb87bc..382c91586b26 100644
> --- a/fs/ext4/mballoc.c
> +++ b/fs/ext4/mballoc.c
> @@ -3219,6 +3219,8 @@ int ext4_seq_mb_stats_show(struct seq_file *seq, void *offset)
>  	}
>  	seq_printf(seq, "\treqs: %u\n", atomic_read(&sbi->s_bal_reqs));
>  	seq_printf(seq, "\tsuccess: %u\n", atomic_read(&sbi->s_bal_success));
> +	seq_printf(seq, "\tblocks_allocated: %u\n",
> +		   atomic_read(&sbi->s_bal_allocated));
>  
>  	seq_printf(seq, "\tgroups_scanned: %u\n",
>  		   atomic_read(&sbi->s_bal_groups_scanned));
> @@ -4721,6 +4723,35 @@ static void ext4_mb_collect_stats(struct ext4_allocation_context *ac)
>  		trace_ext4_mballoc_prealloc(ac);
>  }
>  
> +void ext4_mb_stats_clear(struct ext4_sb_info *sbi)
> +{
> +	int i;
> +
> +	atomic_set(&sbi->s_bal_reqs, 0);
> +	atomic_set(&sbi->s_bal_success, 0);
> +	atomic_set(&sbi->s_bal_allocated, 0);
> +	atomic_set(&sbi->s_bal_groups_scanned, 0);
> +
> +	for (i = 0; i < EXT4_MB_NUM_CRS; i++) {
> +		atomic64_set(&sbi->s_bal_cX_hits[i], 0);
> +		atomic64_set(&sbi->s_bal_cX_groups_considered[i], 0);
> +		atomic_set(&sbi->s_bal_cX_ex_scanned[i], 0);
> +		atomic64_set(&sbi->s_bal_cX_failed[i], 0);
> +	}
> +
> +	atomic_set(&sbi->s_bal_ex_scanned, 0);
> +	atomic_set(&sbi->s_bal_goals, 0);
> +	atomic_set(&sbi->s_bal_stream_goals, 0);
> +	atomic_set(&sbi->s_bal_len_goals, 0);
> +	atomic_set(&sbi->s_bal_2orders, 0);
> +	atomic_set(&sbi->s_bal_breaks, 0);
> +	atomic_set(&sbi->s_mb_lost_chunks, 0);
> +	atomic_set(&sbi->s_mb_buddies_generated, 0);
> +	atomic64_set(&sbi->s_mb_generation_time, 0);
> +	atomic_set(&sbi->s_mb_preallocated, 0);
> +	atomic_set(&sbi->s_mb_discarded, 0);
> +}
> +
>  /*
>   * Called on failure; free up any blocks from the inode PA for this
>   * context.  We don't need this for MB_GROUP_PA because we only change
> diff --git a/fs/ext4/sysfs.c b/fs/ext4/sysfs.c
> index 923b375e017f..a5bd88a99f22 100644
> --- a/fs/ext4/sysfs.c
> +++ b/fs/ext4/sysfs.c
> @@ -41,6 +41,7 @@ typedef enum {
>  	attr_pointer_atomic,
>  	attr_journal_task,
>  	attr_err_report_sec,
> +	attr_mb_stats_clear,
>  } attr_id_t;
>  
>  typedef enum {
> @@ -161,6 +162,25 @@ static ssize_t err_report_sec_store(struct ext4_sb_info *sbi,
>  	return count;
>  }
>  
> +static ssize_t mb_stats_clear_store(struct ext4_sb_info *sbi,
> +				    const char *buf, size_t count)
> +{
> +	int val;
> +	int ret;
> +
> +	if (!capable(CAP_SYS_ADMIN))
> +		return -EPERM;
> +
> +	ret = kstrtoint(skip_spaces(buf), 0, &val);
> +	if (ret)
> +		return ret;
> +	if (val != 1)
> +		return -EINVAL;
> +
> +	ext4_mb_stats_clear(sbi);
> +	return count;
> +}
> +
>  static ssize_t journal_task_show(struct ext4_sb_info *sbi, char *buf)
>  {
>  	if (!sbi->s_journal)
> @@ -251,6 +271,7 @@ EXT4_ATTR_OFFSET(mb_best_avail_max_trim_order, 0644, mb_order,
>  EXT4_ATTR_OFFSET(err_report_sec, 0644, err_report_sec, ext4_sb_info, s_err_report_sec);
>  EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal);
>  EXT4_RW_ATTR_SBI_UI(mb_stats, s_mb_stats);
> +EXT4_ATTR(mb_stats_clear, 0200, mb_stats_clear);
>  EXT4_RW_ATTR_SBI_UI(mb_max_to_scan, s_mb_max_to_scan);
>  EXT4_RW_ATTR_SBI_UI(mb_min_to_scan, s_mb_min_to_scan);
>  EXT4_RW_ATTR_SBI_UI(mb_order2_req, s_mb_order2_reqs);
> @@ -301,6 +322,7 @@ static struct attribute *ext4_attrs[] = {
>  	ATTR_LIST(inode_readahead_blks),
>  	ATTR_LIST(inode_goal),
>  	ATTR_LIST(mb_stats),
> +	ATTR_LIST(mb_stats_clear),
>  	ATTR_LIST(mb_max_to_scan),
>  	ATTR_LIST(mb_min_to_scan),
>  	ATTR_LIST(mb_order2_req),
> @@ -561,6 +583,8 @@ static ssize_t ext4_attr_store(struct kobject *kobj,
>  		return trigger_test_error(sbi, buf, len);
>  	case attr_err_report_sec:
>  		return err_report_sec_store(sbi, buf, len);
> +	case attr_mb_stats_clear:
> +		return mb_stats_clear_store(sbi, buf, len);
>  	default:
>  		return ext4_generic_attr_store(a, sbi, buf, len);
>  	}


^ permalink raw reply

* Re: [PATCH v1] ext4: add mb_stats_clear for mballoc statistics
From: liubaolin @ 2026-04-16  7:16 UTC (permalink / raw)
  To: Ritesh Harjani (IBM), tytso, adilger.kernel
  Cc: linux-ext4, linux-kernel, wangguanyu, Baolin Liu
In-Reply-To: <mrz3u1a4.ritesh.list@gmail.com>

> Dear Ritesh,
> Thank you for your review. I will revise the patch according to Andreas's comments and submit a second version. 
> When the second version is submitted, you are welcome to review it. 
> Once the patch is finalized, the maintainer will add the Reviewed-by tag.
> 
> Regards,
> Baolin



在 2026/4/16 9:44, Ritesh Harjani (IBM) 写道:
> Baolin Liu <liubaolin12138@163.com> writes:
> 
>> From: Baolin Liu <liubaolin@kylinos.cn>
>>
>> Add a write-only mb_stats_clear sysfs knob to reset ext4 mballoc
>> runtime statistics.This makes it easier to inspect allocator
>> activity for a specific workload instead of using counters
>> accumulated since mount.
>>
>> Signed-off-by: Baolin Liu <liubaolin@kylinos.cn>
> 
> Make sense to me. The changes looks good and works fine at my end.
> So please feel free to add:
> 
> Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>


^ permalink raw reply

* Re: [PATCH v1] ext4: add mb_stats_clear for mballoc statistics
From: liubaolin @ 2026-04-16  7:11 UTC (permalink / raw)
  To: Andreas Dilger; +Cc: tytso, linux-ext4, linux-kernel, wangguanyu, Baolin Liu
In-Reply-To: <C713AA9C-D640-4C5B-98BF-A5D88AE3B2A0@dilger.ca>

> Dear Andreas,
>    Alright, thank you for your review. 
>    I will revise the patch according to your suggestions and submit a second version as soon as possible.
> 
> Regards,
> Baolin



在 2026/4/16 9:14, Andreas Dilger 写道:
> On Apr 14, 2026, at 04:02, Baolin Liu <liubaolin12138@163.com> wrote:
>>
>> From: Baolin Liu <liubaolin@kylinos.cn>
>>
>> Add a write-only mb_stats_clear sysfs knob to reset ext4 mballoc
>> runtime statistics. This makes it easier to inspect allocator
>> activity for a specific workload instead of using counters
>> accumulated since mount.
> 
> Rather than having a read-only "mb_stats" procfs file and a separate
> write-only "mb_stats_clear" sysfs file to clear "mb_stats", IMHO it
> would be more obvious to write directly to "/proc/fs/ext4/DEV/mb_stats"
> file to clear it.  Writing "0" would be logical to zero out the stats.
> 
> Cheers, Andreas
> 
>>
>> Signed-off-by: Baolin Liu <liubaolin@kylinos.cn>
>> ---
>> fs/ext4/ext4.h    |  1 +
>> fs/ext4/mballoc.c | 31 +++++++++++++++++++++++++++++++
>> fs/ext4/sysfs.c   | 24 ++++++++++++++++++++++++
>> 3 files changed, 56 insertions(+)
>>
>> diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
>> index 7617e2d454ea..3a32e1a515dd 100644
>> --- a/fs/ext4/ext4.h
>> +++ b/fs/ext4/ext4.h
>> @@ -2995,6 +2995,7 @@ int ext4_fc_record_regions(struct super_block *sb, int ino,
>> extern const struct seq_operations ext4_mb_seq_groups_ops;
>> extern const struct seq_operations ext4_mb_seq_structs_summary_ops;
>> extern int ext4_seq_mb_stats_show(struct seq_file *seq, void *offset);
>> +extern void ext4_mb_stats_clear(struct ext4_sb_info *sbi);
>> extern int ext4_mb_init(struct super_block *);
>> extern void ext4_mb_release(struct super_block *);
>> extern ext4_fsblk_t ext4_mb_new_blocks(handle_t *,
>> diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
>> index bb58eafb87bc..382c91586b26 100644
>> --- a/fs/ext4/mballoc.c
>> +++ b/fs/ext4/mballoc.c
>> @@ -3219,6 +3219,8 @@ int ext4_seq_mb_stats_show(struct seq_file *seq, void *offset)
>> }
>> seq_printf(seq, "\treqs: %u\n", atomic_read(&sbi->s_bal_reqs));
>> seq_printf(seq, "\tsuccess: %u\n", atomic_read(&sbi->s_bal_success));
>> + seq_printf(seq, "\tblocks_allocated: %u\n",
>> +   atomic_read(&sbi->s_bal_allocated));
>>
>> seq_printf(seq, "\tgroups_scanned: %u\n",
>>    atomic_read(&sbi->s_bal_groups_scanned));
>> @@ -4721,6 +4723,35 @@ static void ext4_mb_collect_stats(struct ext4_allocation_context *ac)
>> trace_ext4_mballoc_prealloc(ac);
>> }
>>
>> +void ext4_mb_stats_clear(struct ext4_sb_info *sbi)
>> +{
>> + int i;
>> +
>> + atomic_set(&sbi->s_bal_reqs, 0);
>> + atomic_set(&sbi->s_bal_success, 0);
>> + atomic_set(&sbi->s_bal_allocated, 0);
>> + atomic_set(&sbi->s_bal_groups_scanned, 0);
>> +
>> + for (i = 0; i < EXT4_MB_NUM_CRS; i++) {
>> + atomic64_set(&sbi->s_bal_cX_hits[i], 0);
>> + atomic64_set(&sbi->s_bal_cX_groups_considered[i], 0);
>> + atomic_set(&sbi->s_bal_cX_ex_scanned[i], 0);
>> + atomic64_set(&sbi->s_bal_cX_failed[i], 0);
>> + }
>> +
>> + atomic_set(&sbi->s_bal_ex_scanned, 0);
>> + atomic_set(&sbi->s_bal_goals, 0);
>> + atomic_set(&sbi->s_bal_stream_goals, 0);
>> + atomic_set(&sbi->s_bal_len_goals, 0);
>> + atomic_set(&sbi->s_bal_2orders, 0);
>> + atomic_set(&sbi->s_bal_breaks, 0);
>> + atomic_set(&sbi->s_mb_lost_chunks, 0);
>> + atomic_set(&sbi->s_mb_buddies_generated, 0);
>> + atomic64_set(&sbi->s_mb_generation_time, 0);
>> + atomic_set(&sbi->s_mb_preallocated, 0);
>> + atomic_set(&sbi->s_mb_discarded, 0);
>> +}
>> +
>> /*
>>   * Called on failure; free up any blocks from the inode PA for this
>>   * context.  We don't need this for MB_GROUP_PA because we only change
>> diff --git a/fs/ext4/sysfs.c b/fs/ext4/sysfs.c
>> index 923b375e017f..a5bd88a99f22 100644
>> --- a/fs/ext4/sysfs.c
>> +++ b/fs/ext4/sysfs.c
>> @@ -41,6 +41,7 @@ typedef enum {
>> attr_pointer_atomic,
>> attr_journal_task,
>> attr_err_report_sec,
>> + attr_mb_stats_clear,
>> } attr_id_t;
>>
>> typedef enum {
>> @@ -161,6 +162,25 @@ static ssize_t err_report_sec_store(struct ext4_sb_info *sbi,
>> return count;
>> }
>>
>> +static ssize_t mb_stats_clear_store(struct ext4_sb_info *sbi,
>> +    const char *buf, size_t count)
>> +{
>> + int val;
>> + int ret;
>> +
>> + if (!capable(CAP_SYS_ADMIN))
>> + return -EPERM;
>> +
>> + ret = kstrtoint(skip_spaces(buf), 0, &val);
>> + if (ret)
>> + return ret;
>> + if (val != 1)
>> + return -EINVAL;
>> +
>> + ext4_mb_stats_clear(sbi);
>> + return count;
>> +}
>> +
>> static ssize_t journal_task_show(struct ext4_sb_info *sbi, char *buf)
>> {
>> if (!sbi->s_journal)
>> @@ -251,6 +271,7 @@ EXT4_ATTR_OFFSET(mb_best_avail_max_trim_order, 0644, mb_order,
>> EXT4_ATTR_OFFSET(err_report_sec, 0644, err_report_sec, ext4_sb_info, s_err_report_sec);
>> EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal);
>> EXT4_RW_ATTR_SBI_UI(mb_stats, s_mb_stats);
>> +EXT4_ATTR(mb_stats_clear, 0200, mb_stats_clear);
>> EXT4_RW_ATTR_SBI_UI(mb_max_to_scan, s_mb_max_to_scan);
>> EXT4_RW_ATTR_SBI_UI(mb_min_to_scan, s_mb_min_to_scan);
>> EXT4_RW_ATTR_SBI_UI(mb_order2_req, s_mb_order2_reqs);
>> @@ -301,6 +322,7 @@ static struct attribute *ext4_attrs[] = {
>> ATTR_LIST(inode_readahead_blks),
>> ATTR_LIST(inode_goal),
>> ATTR_LIST(mb_stats),
>> + ATTR_LIST(mb_stats_clear),
>> ATTR_LIST(mb_max_to_scan),
>> ATTR_LIST(mb_min_to_scan),
>> ATTR_LIST(mb_order2_req),
>> @@ -561,6 +583,8 @@ static ssize_t ext4_attr_store(struct kobject *kobj,
>> return trigger_test_error(sbi, buf, len);
>> case attr_err_report_sec:
>> return err_report_sec_store(sbi, buf, len);
>> + case attr_mb_stats_clear:
>> + return mb_stats_clear_store(sbi, buf, len);
>> default:
>> return ext4_generic_attr_store(a, sbi, buf, len);
>> }
>> -- 
>> 2.51.0
>>
> 
> 
> Cheers, Andreas
> 
> 
> 
> 


^ permalink raw reply

* Re: [PATCH v1] ext4: add mb_stats_clear for mballoc statistics
From: liubaolin @ 2026-04-16  7:07 UTC (permalink / raw)
  To: Ojaswin Mujoo
  Cc: tytso, adilger.kernel, linux-ext4, linux-kernel, wangguanyu,
	Baolin Liu
In-Reply-To: <ad_mguIqaOT-pEmh@li-dc0c254c-257c-11b2-a85c-98b6c1322444.ibm.com>

> Dear ojaswin,
>    Alright, thank you for your review. I will revise the patch according to Andreas's comments and submit a second version. 
>    When submitting the second version, I will also update the relevant files under the Documentation directory according to your suggestions to add explanations.
> 
> Regards,
> Baolin



在 2026/4/16 3:26, Ojaswin Mujoo 写道:
> On Tue, Apr 14, 2026 at 06:02:11PM +0800, Baolin Liu wrote:
>> From: Baolin Liu <liubaolin@kylinos.cn>
>>
>> Add a write-only mb_stats_clear sysfs knob to reset ext4 mballoc
>> runtime statistics.This makes it easier to inspect allocator
>> activity for a specific workload instead of using counters
>> accumulated since mount.
>>
>> Signed-off-by: Baolin Liu <liubaolin@kylinos.cn>
> 
> The patch looks good to me Baolin. We just need to add documentation of
> this to the Documentation/ABI/testing/sysfs-fs-ext4 file so that the
> users know what it is and the fact that the only value we allow to write
> is 1.
> 
> Regards,
> ojaswin


^ permalink raw reply

* Re: [RFC v2 0/1] ext4: fail fast on repeated buffer_head reads after IO failure
From: Diangang Li @ 2026-04-16  3:54 UTC (permalink / raw)
  To: Theodore Tso, Diangang Li
  Cc: adilger.kernel, linux-ext4, linux-fsdevel, linux-kernel,
	changfengnan, yizhang089, willy
In-Reply-To: <20260413124703.GA20496@macsyma-wired.lan>

On 4/13/26 8:47 PM, Theodore Tso wrote:
> On Mon, Apr 13, 2026 at 02:24:59PM +0800, Diangang Li wrote:
>> From: Diangang Li <lidiangang@bytedance.com>
>>
>> A production system reported hung tasks blocked for 300s+ in ext4
>> buffer_head paths....
>>
>>    [Tue Mar 24 14:16:24 2026] blk_update_request: I/O error, dev sdi,
>>        sector 10704150288 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
>>    [Tue Mar 24 14:16:25 2026] blk_update_request: I/O error, dev sdi,
>>        sector 10704488160 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
>>    [Tue Mar 24 14:16:26 2026] blk_update_request: I/O error, dev sdi,
>>        sector 10704382912 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
> 
> I wonder whether the ext4 layer is the right place to be handle this
> sort of issue.  For example, it could be handled by having a subsystem
> scanning dmesg (or by wiring up notifications so block device errors
> get sent to a userspace daemon), and when certain criteria is met, the
> machine is automatically sent to hardware operations to run
> diagnostics and (most likey) replace the failing disk.
> 
> It could also be handled in the driver or SCSI layer so the "fail
> fast" semantics are handled there, so that it supports all file
> systems, not just ext4.  The SCSI layer also has more information
> about the type of error; you might want to handle things like media
> errors differently from Fibre Channel or iSCSI timeouts (which might
> be something where "fast fast" is not appropriate).
> 
> By the time the error gets propagated up to the buffer head, we lose a
> lot of detail about why the error took place.  Also, in the long term
> we will hopefully be moving away from using buffer cache.
> 
>     		     	    	      	    - Ted

Hi Ted,

What about moving the fail-fast check into the buffer-head path 
(submit_bh_wbc) so it is not ext4-specific. We can update a BH_Read_EIO 
bit in end_bio_bh_io_sync, and add a per-bdev/per-partition sysfs knob 
for the retry window. That turns it into a generic guard for buffer-head 
users, and it naturally goes away as buffer-head usage shrinks.

We did think about doing this in the block layer (submit_bio) or in 
SCSI/NVMe, but a generic solution there seems to need a per-device table 
to cache the error LBAs. With buffer-head, we can keep the error state 
on the bh itself.

I also checked f2fs (no buffer-head). It tracks repeated EIOs on 
metadata/node pages to avoid infinite retry loops. How do you see that 
compared with a buffer-head retry window? Are either of these directions 
worth exploring further?

Thanks,
Diangang

^ permalink raw reply

* Re: [RFC PATCH] iomap: add fast read path for small direct I/O
From: changfengnan @ 2026-04-16  3:22 UTC (permalink / raw)
  To: Ojaswin Mujoo
  Cc: Fengnan Chang, brauner, djwong, linux-xfs, linux-fsdevel,
	linux-ext4, lidiangang
In-Reply-To: <ad_h0JMX2Jo-QODG@li-dc0c254c-257c-11b2-a85c-98b6c1322444.ibm.com>

[-- Attachment #1: Type: text/plain, Size: 8463 bytes --]


> From: "Ojaswin Mujoo"<ojaswin@linux.ibm.com>
> Date:  Thu, Apr 16, 2026, 03:07
> Subject:  Re: [RFC PATCH] iomap: add fast read path for small direct I/O
> To: "Fengnan Chang"<fengnanchang@gmail.com>
> Cc: <brauner@kernel.org>, <djwong@kernel.org>, <linux-xfs@vger.kernel.org>, <linux-fsdevel@vger.kernel.org>, <linux-ext4@vger.kernel.org>, <lidiangang@bytedance.com>, "Fengnan Chang"<changfengnan@bytedance.com>
> On Tue, Apr 14, 2026 at 08:26:47PM +0800, Fengnan Chang wrote:
> > When running 4K random read workloads on high-performance Gen5 NVMe
> > SSDs, the software overhead in the iomap direct I/O path
> > (__iomap_dio_rw) becomes a significant bottleneck.
> > 
> > Using io_uring with poll mode for a 4K randread test on a raw block
> > device:
> > taskset -c 30 ./t/io_uring -p1 -d512 -b4096 -s32 -c32 -F1 -B1 -R1 -X1
> > -n1 -P1 /dev/nvme10n1
> > Result: ~3.2M IOPS
> > 
> > Running the exact same workload on ext4 and XFS:
> > taskset -c 30 ./t/io_uring -p1 -d512 -b4096 -s32 -c32 -F1 -B1 -R1 -X1
> > -n1 -P1 /mnt/testfile
> > Result: ~1.9M IOPS
> 
> Hi Fengnan, interesting optimization! 
> Which test suite are you using here for the io_uring tests? 
This is test 4k randread with QD 512 in io_uring poll mode. 
If you use fio, almost like this, but ./t/io_uring  can get higher IOPS.
fio \
  --name=io_uring_test \
  --ioengine=io_uring \
  --filename=/mnt/testfile \
  --direct=1 \
  --rw=randread \
  --bs=4096 \
  --iodepth=512 \
  --iodepth_batch_submit=32 \
  --iodepth_batch_complete_min=32 \
  --hipri=1 \
  --fixedbufs=1 \
  --registerfiles=1 \
  --nonvectored=1 \
  --sqthread_poll=1

> > 
> > Profiling the ext4 workload reveals that a significant portion of CPU
> > time is spent on memory allocation and the iomap state machine
> > iteration:
> >   5.33%  [kernel]  [k] __iomap_dio_rw
> >   3.26%  [kernel]  [k] iomap_iter
> >   2.37%  [kernel]  [k] iomap_dio_bio_iter
> >   2.35%  [kernel]  [k] kfree
> >   1.33%  [kernel]  [k] iomap_dio_complete
> 
> Hmm read is usually under a shared lock for inode as well as extent
> lookup so we should ideally not be blocking too much there. Can you
> share a bit more detailed perf report. I'd be interested to see where
> in iomap_iter() are you seeing the regression?
Are there enough images of the flame diagram? I’ve attached them.
ext4_poll_7.svg is without this patch, iomap_fast.svg is with this patch.

> > 
> > I attempted several incremental optimizations in the __iomap_dio_rw()
> > path to close the gap:
> > 1. Allocating the `bio` and `struct iomap_dio` together to avoid a
> >    separate kmalloc. However, because `struct iomap_dio` is relatively
> >    large and the main path is complex, this yielded almost no
> >    performance improvement.
> > 2. Reducing unnecessary state resets in the iomap state machine (e.g.,
> >    skipping `iomap_iter_reset_iomap` where safe). This provided a ~5%
> >    IOPS boost, which is helpful but still falls far short of closing
> >    the gap with the raw block device.
> > 
> 
> <...>
> 
> >  
> > +static bool iomap_dio_fast_read_enabled = true;
> > +
> > +struct iomap_dio_fast_read {
> > +        struct kiocb        *iocb;
> > +        size_t                size;
> > +        bool                should_dirty;
> > +        struct work_struct        work;
> > +        struct bio        bio ____cacheline_aligned_in_smp;
> 
> As Christoph pointed out, were you seeing any performance loss due to
> not aligning to cacheline? Architectures like powerpc have a 128byte
> cacheline and we could end up wasting significant space here.
Get your point. I'll check.

> 
> > +};
> > +
> > +static struct bio_set iomap_dio_fast_read_pool;
> > +
> > +static void iomap_dio_fast_read_complete_work(struct work_struct *work)
> > +{
> 
> <...>
> 
> > +
> > +static inline bool iomap_dio_fast_read_supported(struct kiocb *iocb,
> > +                                          struct iov_iter *iter,
> > +                                          unsigned int dio_flags,
> > +                                          size_t done_before)
> > +{
> > +        struct inode *inode = file_inode(iocb->ki_filp);
> > +        size_t count = iov_iter_count(iter);
> > +        unsigned int alignment;
> > +
> > +        if (!iomap_dio_fast_read_enabled)
> > +                return false;
> > +        if (iov_iter_rw(iter) != READ)
> > +                return false;
> > +
> > +        /*
> > +         * Fast read is an optimization for small IO. Filter out large IO early
> > +         * as it's the most common case to fail for typical direct IO workloads.
> > +         */
> > +        if (count > inode->i_sb->s_blocksize)
> > +                return false;
> > +
> > +        if (is_sync_kiocb(iocb) || done_before)
> 
> Did you try this for sync reads as well? I think we should be seeing
> similar benefits with sync reads too. Further, if the fast path helps us
> reduce the critical section under inode lock, it could be a good win for
> mixed read write workloads.
Get. sync read will support in next version.
> 
> > +                return false;
> > +        if (dio_flags & (IOMAP_DIO_FORCE_WAIT | IOMAP_DIO_BOUNCE))
> > +                return false;
> > +        if (iocb->ki_pos + count > i_size_read(inode))
> > +                return false;
> > +        if (IS_ENCRYPTED(inode) || fsverity_active(inode))
> > +                return false;
> > +
> > +        if (count < bdev_logical_block_size(inode->i_sb->s_bdev))
> > +                return false;
> > +
> > +        if (dio_flags & IOMAP_DIO_FSBLOCK_ALIGNED)
> > +                alignment = i_blocksize(inode);
> > +        else
> > +                alignment = bdev_logical_block_size(inode->i_sb->s_bdev);
> > +
> > +        if ((iocb->ki_pos | count) & (alignment - 1))
> > +                return false;
> > +
> > +        return true;
> > +}
> > +
> > +static ssize_t iomap_dio_fast_read_async(struct kiocb *iocb,
> 
> <...>
> 
> > +static ssize_t fast_read_enable_store(struct kobject *kobj,
> > +                                      struct kobj_attribute *attr,
> > +                                      const char *buf, size_t count)
> > +{
> > +        bool enable;
> > +        int ret;
> > +
> > +        ret = kstrtobool(buf, &enable);
> > +        if (ret)
> > +                return ret;
> > +
> > +        iomap_dio_fast_read_enabled = enable;
> > +        return count;
> > +}
> > +
> > +static struct kobj_attribute fast_read_enable_attr =
> > +        __ATTR(fast_read_enable, 0644, fast_read_enable_show, fast_read_enable_store);
> > +
> > +static struct kobject *iomap_kobj;
> > +
> > +static int __init iomap_dio_sysfs_init(void)
> 
> Since we do more than sysfs work here, maybe we can have a more generic
> name like iomap_dio_init(void) or iomap_dio_fast/simple_read_init().
Sounds good.

> 
> 
> > +{
> > +        int ret;
> > +
> > +        ret = bioset_init(&iomap_dio_fast_read_pool, 4,
> > +                          offsetof(struct iomap_dio_fast_read, bio),
> > +                          BIOSET_NEED_BVECS | BIOSET_PERCPU_CACHE);
> > +        if (ret)
> > +                return ret;
> > +
> > +        iomap_kobj = kobject_create_and_add("iomap", fs_kobj);
> > +        if (!iomap_kobj) {
> > +                bioset_exit(&iomap_dio_fast_read_pool);
> > +                return -ENOMEM;
> > +        }
> > +
> > +        if (sysfs_create_file(iomap_kobj, &fast_read_enable_attr.attr)) {
> > +                kobject_put(iomap_kobj);
> > +                bioset_exit(&iomap_dio_fast_read_pool);
> > +                return -ENOMEM;
> > +        }
> > +
> > +        return 0;
> > +}
> > +fs_initcall(iomap_dio_sysfs_init);
> > -- 
> 
> Regards,
> ojaswin
> 
> > 2.39.5 (Apple Git-154)
> >
> 

[-- Attachment #2: ext4_poll_7.svg --]
[-- Type: application/octet-stream, Size: 78314 bytes --]

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" width="1200" height="2134" onload="init(evt)" viewBox="0 0 1200 2134" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Flame graph stack visualization. See https://github.com/brendangregg/FlameGraph for latest version, and http://www.brendangregg.com/flamegraphs.html for examples. -->
<!-- NOTES:  -->
<defs>
	<linearGradient id="background" y1="0" y2="1" x1="0" x2="0" >
		<stop stop-color="#eeeeee" offset="5%" />
		<stop stop-color="#eeeeb0" offset="95%" />
	</linearGradient>
</defs>
<style type="text/css">
	text { font-family:Verdana; font-size:12px; fill:rgb(0,0,0); }
	#search, #ignorecase { opacity:0.1; cursor:pointer; }
	#search:hover, #search.show, #ignorecase:hover, #ignorecase.show { opacity:1; }
	#subtitle { text-anchor:middle; font-color:rgb(160,160,160); }
	#title { text-anchor:middle; font-size:17px}
	#unzoom { cursor:pointer; }
	#frames > *:hover { stroke:black; stroke-width:0.5; cursor:pointer; }
	.hide { display:none; }
	.parent { opacity:0.5; }
</style>
<script type="text/ecmascript">
<![CDATA[
	"use strict";
	var details, searchbtn, unzoombtn, matchedtxt, svg, searching, currentSearchTerm, ignorecase, ignorecaseBtn;
	function init(evt) {
		details = document.getElementById("details").firstChild;
		searchbtn = document.getElementById("search");
		ignorecaseBtn = document.getElementById("ignorecase");
		unzoombtn = document.getElementById("unzoom");
		matchedtxt = document.getElementById("matched");
		svg = document.getElementsByTagName("svg")[0];
		searching = 0;
		currentSearchTerm = null;

		// use GET parameters to restore a flamegraphs state.
		var params = get_params();
		if (params.x && params.y)
			zoom(find_group(document.querySelector('[x="' + params.x + '"][y="' + params.y + '"]')));
                if (params.s) search(params.s);
	}

	// event listeners
	window.addEventListener("click", function(e) {
		var target = find_group(e.target);
		if (target) {
			if (target.nodeName == "a") {
				if (e.ctrlKey === false) return;
				e.preventDefault();
			}
			if (target.classList.contains("parent")) unzoom(true);
			zoom(target);
			if (!document.querySelector('.parent')) {
				// we have basically done a clearzoom so clear the url
				var params = get_params();
				if (params.x) delete params.x;
				if (params.y) delete params.y;
				history.replaceState(null, null, parse_params(params));
				unzoombtn.classList.add("hide");
				return;
			}

			// set parameters for zoom state
			var el = target.querySelector("rect");
			if (el && el.attributes && el.attributes.y && el.attributes._orig_x) {
				var params = get_params()
				params.x = el.attributes._orig_x.value;
				params.y = el.attributes.y.value;
				history.replaceState(null, null, parse_params(params));
			}
		}
		else if (e.target.id == "unzoom") clearzoom();
		else if (e.target.id == "search") search_prompt();
		else if (e.target.id == "ignorecase") toggle_ignorecase();
	}, false)

	// mouse-over for info
	// show
	window.addEventListener("mouseover", function(e) {
		var target = find_group(e.target);
		if (target) details.nodeValue = "Function: " + g_to_text(target);
	}, false)

	// clear
	window.addEventListener("mouseout", function(e) {
		var target = find_group(e.target);
		if (target) details.nodeValue = ' ';
	}, false)

	// ctrl-F for search
	// ctrl-I to toggle case-sensitive search
	window.addEventListener("keydown",function (e) {
		if (e.keyCode === 114 || (e.ctrlKey && e.keyCode === 70)) {
			e.preventDefault();
			search_prompt();
		}
		else if (e.ctrlKey && e.keyCode === 73) {
			e.preventDefault();
			toggle_ignorecase();
		}
	}, false)

	// functions
	function get_params() {
		var params = {};
		var paramsarr = window.location.search.substr(1).split('&');
		for (var i = 0; i < paramsarr.length; ++i) {
			var tmp = paramsarr[i].split("=");
			if (!tmp[0] || !tmp[1]) continue;
			params[tmp[0]]  = decodeURIComponent(tmp[1]);
		}
		return params;
	}
	function parse_params(params) {
		var uri = "?";
		for (var key in params) {
			uri += key + '=' + encodeURIComponent(params[key]) + '&';
		}
		if (uri.slice(-1) == "&")
			uri = uri.substring(0, uri.length - 1);
		if (uri == '?')
			uri = window.location.href.split('?')[0];
		return uri;
	}
	function find_child(node, selector) {
		var children = node.querySelectorAll(selector);
		if (children.length) return children[0];
	}
	function find_group(node) {
		var parent = node.parentElement;
		if (!parent) return;
		if (parent.id == "frames") return node;
		return find_group(parent);
	}
	function orig_save(e, attr, val) {
		if (e.attributes["_orig_" + attr] != undefined) return;
		if (e.attributes[attr] == undefined) return;
		if (val == undefined) val = e.attributes[attr].value;
		e.setAttribute("_orig_" + attr, val);
	}
	function orig_load(e, attr) {
		if (e.attributes["_orig_"+attr] == undefined) return;
		e.attributes[attr].value = e.attributes["_orig_" + attr].value;
		e.removeAttribute("_orig_"+attr);
	}
	function g_to_text(e) {
		var text = find_child(e, "title").firstChild.nodeValue;
		return (text)
	}
	function g_to_func(e) {
		var func = g_to_text(e);
		// if there's any manipulation we want to do to the function
		// name before it's searched, do it here before returning.
		return (func);
	}
	function update_text(e) {
		var r = find_child(e, "rect");
		var t = find_child(e, "text");
		var w = parseFloat(r.attributes.width.value) -3;
		var txt = find_child(e, "title").textContent.replace(/\([^(]*\)$/,"");
		t.attributes.x.value = parseFloat(r.attributes.x.value) + 3;

		// Smaller than this size won't fit anything
		if (w < 2 * 12 * 0.59) {
			t.textContent = "";
			return;
		}

		t.textContent = txt;
		var sl = t.getSubStringLength(0, txt.length);
		// check if only whitespace or if we can fit the entire string into width w
		if (/^ *$/.test(txt) || sl < w)
			return;

		// this isn't perfect, but gives a good starting point
		// and avoids calling getSubStringLength too often
		var start = Math.floor((w/sl) * txt.length);
		for (var x = start; x > 0; x = x-2) {
			if (t.getSubStringLength(0, x + 2) <= w) {
				t.textContent = txt.substring(0, x) + "..";
				return;
			}
		}
		t.textContent = "";
	}

	// zoom
	function zoom_reset(e) {
		if (e.attributes != undefined) {
			orig_load(e, "x");
			orig_load(e, "width");
		}
		if (e.childNodes == undefined) return;
		for (var i = 0, c = e.childNodes; i < c.length; i++) {
			zoom_reset(c[i]);
		}
	}
	function zoom_child(e, x, ratio) {
		if (e.attributes != undefined) {
			if (e.attributes.x != undefined) {
				orig_save(e, "x");
				e.attributes.x.value = (parseFloat(e.attributes.x.value) - x - 10) * ratio + 10;
				if (e.tagName == "text")
					e.attributes.x.value = find_child(e.parentNode, "rect[x]").attributes.x.value + 3;
			}
			if (e.attributes.width != undefined) {
				orig_save(e, "width");
				e.attributes.width.value = parseFloat(e.attributes.width.value) * ratio;
			}
		}

		if (e.childNodes == undefined) return;
		for (var i = 0, c = e.childNodes; i < c.length; i++) {
			zoom_child(c[i], x - 10, ratio);
		}
	}
	function zoom_parent(e) {
		if (e.attributes) {
			if (e.attributes.x != undefined) {
				orig_save(e, "x");
				e.attributes.x.value = 10;
			}
			if (e.attributes.width != undefined) {
				orig_save(e, "width");
				e.attributes.width.value = parseInt(svg.width.baseVal.value) - (10 * 2);
			}
		}
		if (e.childNodes == undefined) return;
		for (var i = 0, c = e.childNodes; i < c.length; i++) {
			zoom_parent(c[i]);
		}
	}
	function zoom(node) {
		var attr = find_child(node, "rect").attributes;
		var width = parseFloat(attr.width.value);
		var xmin = parseFloat(attr.x.value);
		var xmax = parseFloat(xmin + width);
		var ymin = parseFloat(attr.y.value);
		var ratio = (svg.width.baseVal.value - 2 * 10) / width;

		// XXX: Workaround for JavaScript float issues (fix me)
		var fudge = 0.0001;

		unzoombtn.classList.remove("hide");

		var el = document.getElementById("frames").children;
		for (var i = 0; i < el.length; i++) {
			var e = el[i];
			var a = find_child(e, "rect").attributes;
			var ex = parseFloat(a.x.value);
			var ew = parseFloat(a.width.value);
			var upstack;
			// Is it an ancestor
			if (0 == 0) {
				upstack = parseFloat(a.y.value) > ymin;
			} else {
				upstack = parseFloat(a.y.value) < ymin;
			}
			if (upstack) {
				// Direct ancestor
				if (ex <= xmin && (ex+ew+fudge) >= xmax) {
					e.classList.add("parent");
					zoom_parent(e);
					update_text(e);
				}
				// not in current path
				else
					e.classList.add("hide");
			}
			// Children maybe
			else {
				// no common path
				if (ex < xmin || ex + fudge >= xmax) {
					e.classList.add("hide");
				}
				else {
					zoom_child(e, xmin, ratio);
					update_text(e);
				}
			}
		}
		search();
	}
	function unzoom(dont_update_text) {
		unzoombtn.classList.add("hide");
		var el = document.getElementById("frames").children;
		for(var i = 0; i < el.length; i++) {
			el[i].classList.remove("parent");
			el[i].classList.remove("hide");
			zoom_reset(el[i]);
			if(!dont_update_text) update_text(el[i]);
		}
		search();
	}
	function clearzoom() {
		unzoom();

		// remove zoom state
		var params = get_params();
		if (params.x) delete params.x;
		if (params.y) delete params.y;
		history.replaceState(null, null, parse_params(params));
	}

	// search
	function toggle_ignorecase() {
		ignorecase = !ignorecase;
		if (ignorecase) {
			ignorecaseBtn.classList.add("show");
		} else {
			ignorecaseBtn.classList.remove("show");
		}
		reset_search();
		search();
	}
	function reset_search() {
		var el = document.querySelectorAll("#frames rect");
		for (var i = 0; i < el.length; i++) {
			orig_load(el[i], "fill")
		}
		var params = get_params();
		delete params.s;
		history.replaceState(null, null, parse_params(params));
	}
	function search_prompt() {
		if (!searching) {
			var term = prompt("Enter a search term (regexp " +
			    "allowed, eg: ^ext4_)"
			    + (ignorecase ? ", ignoring case" : "")
			    + "\nPress Ctrl-i to toggle case sensitivity", "");
			if (term != null) search(term);
		} else {
			reset_search();
			searching = 0;
			currentSearchTerm = null;
			searchbtn.classList.remove("show");
			searchbtn.firstChild.nodeValue = "Search"
			matchedtxt.classList.add("hide");
			matchedtxt.firstChild.nodeValue = ""
		}
	}
	function search(term) {
		if (term) currentSearchTerm = term;
		if (currentSearchTerm === null) return;

		var re = new RegExp(currentSearchTerm, ignorecase ? 'i' : '');
		var el = document.getElementById("frames").children;
		var matches = new Object();
		var maxwidth = 0;
		for (var i = 0; i < el.length; i++) {
			var e = el[i];
			var func = g_to_func(e);
			var rect = find_child(e, "rect");
			if (func == null || rect == null)
				continue;

			// Save max width. Only works as we have a root frame
			var w = parseFloat(rect.attributes.width.value);
			if (w > maxwidth)
				maxwidth = w;

			if (func.match(re)) {
				// highlight
				var x = parseFloat(rect.attributes.x.value);
				orig_save(rect, "fill");
				rect.attributes.fill.value = "rgb(230,0,230)";

				// remember matches
				if (matches[x] == undefined) {
					matches[x] = w;
				} else {
					if (w > matches[x]) {
						// overwrite with parent
						matches[x] = w;
					}
				}
				searching = 1;
			}
		}
		if (!searching)
			return;
		var params = get_params();
		params.s = currentSearchTerm;
		history.replaceState(null, null, parse_params(params));

		searchbtn.classList.add("show");
		searchbtn.firstChild.nodeValue = "Reset Search";

		// calculate percent matched, excluding vertical overlap
		var count = 0;
		var lastx = -1;
		var lastw = 0;
		var keys = Array();
		for (k in matches) {
			if (matches.hasOwnProperty(k))
				keys.push(k);
		}
		// sort the matched frames by their x location
		// ascending, then width descending
		keys.sort(function(a, b){
			return a - b;
		});
		// Step through frames saving only the biggest bottom-up frames
		// thanks to the sort order. This relies on the tree property
		// where children are always smaller than their parents.
		var fudge = 0.0001;	// JavaScript floating point
		for (var k in keys) {
			var x = parseFloat(keys[k]);
			var w = matches[keys[k]];
			if (x >= lastx + lastw - fudge) {
				count += w;
				lastx = x;
				lastw = w;
			}
		}
		// display matched percent
		matchedtxt.classList.remove("hide");
		var pct = 100 * count / maxwidth;
		if (pct != 100) pct = pct.toFixed(1)
		matchedtxt.firstChild.nodeValue = "Matched: " + pct + "%";
	}
]]>
</script>
<rect x="0.0" y="0" width="1200.0" height="2134.0" fill="url(#background)"  />
<text id="title" x="600.00" y="24" >Flame Graph</text>
<text id="details" x="10.00" y="2117" > </text>
<text id="unzoom" x="10.00" y="24" class="hide">Reset Zoom</text>
<text id="search" x="1090.00" y="24" >Search</text>
<text id="ignorecase" x="1174.00" y="24" >ic</text>
<text id="matched" x="1090.00" y="2117" > </text>
<g id="frames">
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="949" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="959.5" ></text>
</g>
<g >
<title>_raw_spin_lock_irqsave (1,077,902,788 samples, 0.54%)</title><rect x="831.4" y="1765" width="6.3" height="15.0" fill="rgb(247,195,46)" rx="2" ry="2" />
<text  x="834.40" y="1775.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="725" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="735.5" ></text>
</g>
<g >
<title>__io_commit_cqring_flush (17,658,302 samples, 0.01%)</title><rect x="91.1" y="1941" width="0.1" height="15.0" fill="rgb(220,69,16)" rx="2" ry="2" />
<text  x="94.07" y="1951.5" ></text>
</g>
<g >
<title>__list_del_entry_valid_or_report (1,128,348,792 samples, 0.56%)</title><rect x="100.3" y="1957" width="6.6" height="15.0" fill="rgb(243,176,42)" rx="2" ry="2" />
<text  x="103.29" y="1967.5" ></text>
</g>
<g >
<title>entry_SYSCALL_64 (211,073,871 samples, 0.11%)</title><rect x="35.2" y="2037" width="1.2" height="15.0" fill="rgb(239,156,37)" rx="2" ry="2" />
<text  x="38.19" y="2047.5" ></text>
</g>
<g >
<title>__rcu_read_unlock (715,396,068 samples, 0.36%)</title><rect x="657.7" y="1829" width="4.2" height="15.0" fill="rgb(253,224,53)" rx="2" ry="2" />
<text  x="660.68" y="1839.5" ></text>
</g>
<g >
<title>bio_to_wbt_flags (431,359,461 samples, 0.22%)</title><rect x="865.9" y="1781" width="2.5" height="15.0" fill="rgb(235,138,33)" rx="2" ry="2" />
<text  x="868.89" y="1791.5" ></text>
</g>
<g >
<title>mempool_alloc_slab (56,036,252 samples, 0.03%)</title><rect x="710.0" y="1829" width="0.3" height="15.0" fill="rgb(241,167,40)" rx="2" ry="2" />
<text  x="712.99" y="1839.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1669" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1679.5" ></text>
</g>
<g >
<title>io_do_iopoll (44,109,247,618 samples, 21.99%)</title><rect x="39.1" y="1973" width="259.4" height="15.0" fill="rgb(246,191,45)" rx="2" ry="2" />
<text  x="42.08" y="1983.5" >io_do_iopoll</text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1621" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1631.5" ></text>
</g>
<g >
<title>ktime_get (43,750,141 samples, 0.02%)</title><rect x="227.9" y="1941" width="0.3" height="15.0" fill="rgb(207,10,2)" rx="2" ry="2" />
<text  x="230.90" y="1951.5" ></text>
</g>
<g >
<title>iomap_dio_alloc_bio (513,523,256 samples, 0.26%)</title><rect x="727.3" y="1861" width="3.0" height="15.0" fill="rgb(224,90,21)" rx="2" ry="2" />
<text  x="730.31" y="1871.5" ></text>
</g>
<g >
<title>io_file_supports_nowait (575,669,648 samples, 0.29%)</title><rect x="1127.6" y="1925" width="3.4" height="15.0" fill="rgb(247,196,47)" rx="2" ry="2" />
<text  x="1130.57" y="1935.5" ></text>
</g>
<g >
<title>__x64_sys_io_uring_enter (195,836,925,169 samples, 97.63%)</title><rect x="37.4" y="2005" width="1152.0" height="15.0" fill="rgb(210,27,6)" rx="2" ry="2" />
<text  x="40.37" y="2015.5" >__x64_sys_io_uring_enter</text>
</g>
<g >
<title>ext4_sb_block_valid (2,054,932,855 samples, 1.02%)</title><rect x="996.5" y="1813" width="12.1" height="15.0" fill="rgb(244,180,43)" rx="2" ry="2" />
<text  x="999.47" y="1823.5" ></text>
</g>
<g >
<title>__rcu_read_lock (600,292,682 samples, 0.30%)</title><rect x="691.6" y="1797" width="3.6" height="15.0" fill="rgb(220,69,16)" rx="2" ry="2" />
<text  x="694.62" y="1807.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1029" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1039.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1861" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1871.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="981" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="991.5" ></text>
</g>
<g >
<title>io_import_reg_buf (3,159,284,480 samples, 1.57%)</title><rect x="1159.4" y="1925" width="18.6" height="15.0" fill="rgb(216,52,12)" rx="2" ry="2" />
<text  x="1162.38" y="1935.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1141" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1151.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1413" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1423.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="293" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="303.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1189" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1199.5" ></text>
</g>
<g >
<title>io_iopoll_check (44,149,158,377 samples, 22.01%)</title><rect x="38.8" y="1989" width="259.7" height="15.0" fill="rgb(215,46,11)" rx="2" ry="2" />
<text  x="41.84" y="1999.5" >io_iopoll_check</text>
</g>
<g >
<title>barn_replace_full_sheaf.part.95 (115,133,106 samples, 0.06%)</title><rect x="227.2" y="1877" width="0.7" height="15.0" fill="rgb(233,131,31)" rx="2" ry="2" />
<text  x="230.22" y="1887.5" ></text>
</g>
<g >
<title>__kmalloc_cache_noprof (3,358,349,391 samples, 1.67%)</title><rect x="585.9" y="1877" width="19.8" height="15.0" fill="rgb(241,167,40)" rx="2" ry="2" />
<text  x="588.93" y="1887.5" ></text>
</g>
<g >
<title>wbt_done (786,016,446 samples, 0.39%)</title><rect x="166.4" y="1925" width="4.6" height="15.0" fill="rgb(222,81,19)" rx="2" ry="2" />
<text  x="169.42" y="1935.5" ></text>
</g>
<g >
<title>ext4_file_read_iter (109,833,513,600 samples, 54.75%)</title><rect x="481.5" y="1925" width="646.1" height="15.0" fill="rgb(244,180,43)" rx="2" ry="2" />
<text  x="484.49" y="1935.5" >ext4_file_read_iter</text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="789" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="799.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="885" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="895.5" ></text>
</g>
<g >
<title>mutex_unlock (1,729,415,866 samples, 0.86%)</title><rect x="1179.2" y="1989" width="10.2" height="15.0" fill="rgb(251,212,50)" rx="2" ry="2" />
<text  x="1182.19" y="1999.5" ></text>
</g>
<g >
<title>all (200,598,159,198 samples, 100%)</title><rect x="10.0" y="2085" width="1180.0" height="15.0" fill="rgb(213,39,9)" rx="2" ry="2" />
<text  x="13.00" y="2095.5" ></text>
</g>
<g >
<title>blk_mq_submit_bio (22,630,089,034 samples, 11.28%)</title><rect x="777.5" y="1829" width="133.1" height="15.0" fill="rgb(224,89,21)" rx="2" ry="2" />
<text  x="780.50" y="1839.5" >blk_mq_submit_bio</text>
</g>
<g >
<title>ext4_set_iomap (2,794,874,383 samples, 1.39%)</title><rect x="1074.2" y="1845" width="16.5" height="15.0" fill="rgb(229,110,26)" rx="2" ry="2" />
<text  x="1077.21" y="1855.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="421" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="431.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="213" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="223.5" ></text>
</g>
<g >
<title>bio_integrity_prep (317,001,236 samples, 0.16%)</title><rect x="868.4" y="1813" width="1.9" height="15.0" fill="rgb(220,69,16)" rx="2" ry="2" />
<text  x="871.44" y="1823.5" ></text>
</g>
<g >
<title>ext4_dio_alignment (1,498,360,433 samples, 0.75%)</title><rect x="508.0" y="1893" width="8.8" height="15.0" fill="rgb(236,146,35)" rx="2" ry="2" />
<text  x="510.99" y="1903.5" ></text>
</g>
<g >
<title>update_io_ticks (699,996,298 samples, 0.35%)</title><rect x="242.3" y="1941" width="4.1" height="15.0" fill="rgb(235,141,33)" rx="2" ry="2" />
<text  x="245.28" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (3,121,865,120 samples, 1.56%)</title><rect x="10.0" y="101" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="111.5" ></text>
</g>
<g >
<title>barn_replace_full_sheaf.part.95 (82,896,437 samples, 0.04%)</title><rect x="99.8" y="1909" width="0.5" height="15.0" fill="rgb(233,131,31)" rx="2" ry="2" />
<text  x="102.80" y="1919.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="565" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="575.5" ></text>
</g>
<g >
<title>kthread_blkcg (300,124,375 samples, 0.15%)</title><rect x="703.4" y="1813" width="1.8" height="15.0" fill="rgb(249,203,48)" rx="2" ry="2" />
<text  x="706.42" y="1823.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1589" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1599.5" ></text>
</g>
<g >
<title>dma_unmap_page_attrs (118,188,921 samples, 0.06%)</title><rect x="280.5" y="1941" width="0.7" height="15.0" fill="rgb(252,218,52)" rx="2" ry="2" />
<text  x="283.47" y="1951.5" ></text>
</g>
<g >
<title>jbd2_transaction_committed (238,727,314 samples, 0.12%)</title><rect x="1089.2" y="1829" width="1.5" height="15.0" fill="rgb(221,77,18)" rx="2" ry="2" />
<text  x="1092.25" y="1839.5" ></text>
</g>
<g >
<title>iomap_iter (30,121,285,568 samples, 15.02%)</title><rect x="913.5" y="1877" width="177.2" height="15.0" fill="rgb(233,132,31)" rx="2" ry="2" />
<text  x="916.46" y="1887.5" >iomap_iter</text>
</g>
<g >
<title>__rcu_read_unlock (393,009,962 samples, 0.20%)</title><rect x="178.0" y="1925" width="2.3" height="15.0" fill="rgb(253,224,53)" rx="2" ry="2" />
<text  x="181.03" y="1935.5" ></text>
</g>
<g >
<title>_raw_spin_lock_irqsave (53,730,791 samples, 0.03%)</title><rect x="351.1" y="1893" width="0.3" height="15.0" fill="rgb(247,195,46)" rx="2" ry="2" />
<text  x="354.11" y="1903.5" ></text>
</g>
<g >
<title>nvme_poll (3,620,839,902 samples, 1.81%)</title><rect x="255.7" y="1909" width="21.3" height="15.0" fill="rgb(234,135,32)" rx="2" ry="2" />
<text  x="258.72" y="1919.5" >n..</text>
</g>
<g >
<title>io_read (117,554,830,458 samples, 58.60%)</title><rect x="460.2" y="1957" width="691.5" height="15.0" fill="rgb(243,175,41)" rx="2" ry="2" />
<text  x="463.22" y="1967.5" >io_read</text>
</g>
<g >
<title>iomap_dio_complete (5,039,225,900 samples, 2.51%)</title><rect x="198.3" y="1925" width="29.6" height="15.0" fill="rgb(209,19,4)" rx="2" ry="2" />
<text  x="201.26" y="1935.5" >io..</text>
</g>
<g >
<title>bio_init (9,068,510,873 samples, 4.52%)</title><rect x="651.8" y="1845" width="53.4" height="15.0" fill="rgb(254,229,54)" rx="2" ry="2" />
<text  x="654.85" y="1855.5" >bio_i..</text>
</g>
<g >
<title>__sbitmap_queue_get_batch (2,184,777,880 samples, 1.09%)</title><rect x="825.9" y="1781" width="12.9" height="15.0" fill="rgb(253,221,53)" rx="2" ry="2" />
<text  x="828.94" y="1791.5" ></text>
</g>
<g >
<title>do_syscall_64 (195,975,860,660 samples, 97.70%)</title><rect x="36.8" y="2021" width="1152.8" height="15.0" fill="rgb(209,20,4)" rx="2" ry="2" />
<text  x="39.76" y="2031.5" >do_syscall_64</text>
</g>
<g >
<title>io_uring (200,598,159,198 samples, 100.00%)</title><rect x="10.0" y="2069" width="1180.0" height="15.0" fill="rgb(208,13,3)" rx="2" ry="2" />
<text  x="13.00" y="2079.5" >io_uring</text>
</g>
<g >
<title>read_tsc (143,544,904 samples, 0.07%)</title><rect x="905.3" y="1797" width="0.8" height="15.0" fill="rgb(206,7,1)" rx="2" ry="2" />
<text  x="908.29" y="1807.5" ></text>
</g>
<g >
<title>iov_iter_advance (1,608,089,543 samples, 0.80%)</title><rect x="717.9" y="1845" width="9.4" height="15.0" fill="rgb(248,197,47)" rx="2" ry="2" />
<text  x="720.85" y="1855.5" ></text>
</g>
<g >
<title>barn_replace_empty_sheaf (146,607,415 samples, 0.07%)</title><rect x="350.6" y="1909" width="0.9" height="15.0" fill="rgb(223,84,20)" rx="2" ry="2" />
<text  x="353.64" y="1919.5" ></text>
</g>
<g >
<title>read_tsc (28,398,438 samples, 0.01%)</title><rect x="228.0" y="1925" width="0.2" height="15.0" fill="rgb(206,7,1)" rx="2" ry="2" />
<text  x="230.99" y="1935.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1701" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1711.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="245" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="255.5" ></text>
</g>
<g >
<title>submitter_uring_fn (1,381,721,602 samples, 0.69%)</title><rect x="20.2" y="37" width="8.2" height="15.0" fill="rgb(218,61,14)" rx="2" ry="2" />
<text  x="23.24" y="47.5" ></text>
</g>
<g >
<title>[unknown] (3,124,600,077 samples, 1.56%)</title><rect x="10.0" y="2053" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="2063.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1445" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1455.5" ></text>
</g>
<g >
<title>blk_mq_start_request (2,734,221,559 samples, 1.36%)</title><rect x="381.2" y="1877" width="16.1" height="15.0" fill="rgb(242,172,41)" rx="2" ry="2" />
<text  x="384.19" y="1887.5" ></text>
</g>
<g >
<title>[unknown] (3,122,574,652 samples, 1.56%)</title><rect x="10.0" y="181" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="191.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1525" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1535.5" ></text>
</g>
<g >
<title>__io_submit_flush_completions (5,718,444,365 samples, 2.85%)</title><rect x="66.7" y="1957" width="33.6" height="15.0" fill="rgb(226,99,23)" rx="2" ry="2" />
<text  x="69.66" y="1967.5" >__..</text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="629" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="639.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="341" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="351.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1221" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1231.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1333" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1343.5" ></text>
</g>
<g >
<title>down_read_trylock (2,396,862,333 samples, 1.19%)</title><rect x="490.7" y="1909" width="14.1" height="15.0" fill="rgb(219,66,15)" rx="2" ry="2" />
<text  x="493.74" y="1919.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1061" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1071.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1829" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1839.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1781" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1791.5" ></text>
</g>
<g >
<title>rw_verify_area (1,599,725,526 samples, 0.80%)</title><rect x="1142.3" y="1925" width="9.4" height="15.0" fill="rgb(218,64,15)" rx="2" ry="2" />
<text  x="1145.31" y="1935.5" ></text>
</g>
<g >
<title>[unknown] (3,122,574,652 samples, 1.56%)</title><rect x="10.0" y="133" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="143.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="2021" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="2031.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="549" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="559.5" ></text>
</g>
<g >
<title>__rcu_read_unlock (20,728,599 samples, 0.01%)</title><rect x="825.5" y="1797" width="0.1" height="15.0" fill="rgb(253,224,53)" rx="2" ry="2" />
<text  x="828.45" y="1807.5" ></text>
</g>
<g >
<title>blk_rq_merge_ok (1,478,130,142 samples, 0.74%)</title><rect x="884.1" y="1781" width="8.7" height="15.0" fill="rgb(215,46,11)" rx="2" ry="2" />
<text  x="887.07" y="1791.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="501" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="511.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="901" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="911.5" ></text>
</g>
<g >
<title>blk_attempt_bio_merge (2,901,277,578 samples, 1.45%)</title><rect x="879.7" y="1797" width="17.1" height="15.0" fill="rgb(206,7,1)" rx="2" ry="2" />
<text  x="882.73" y="1807.5" ></text>
</g>
<g >
<title>io_cache_alloc_new (2,803,334,290 samples, 1.40%)</title><rect x="338.1" y="1957" width="16.5" height="15.0" fill="rgb(236,146,35)" rx="2" ry="2" />
<text  x="341.14" y="1967.5" ></text>
</g>
<g >
<title>io_rw_recycle (773,698,789 samples, 0.39%)</title><rect x="249.7" y="1941" width="4.5" height="15.0" fill="rgb(235,142,34)" rx="2" ry="2" />
<text  x="252.65" y="1951.5" ></text>
</g>
<g >
<title>kiocb_write_and_wait (597,211,034 samples, 0.30%)</title><rect x="1094.0" y="1877" width="3.5" height="15.0" fill="rgb(221,77,18)" rx="2" ry="2" />
<text  x="1097.00" y="1887.5" ></text>
</g>
<g >
<title>blk_mq_finish_request (511,225,423 samples, 0.25%)</title><rect x="185.4" y="1941" width="3.0" height="15.0" fill="rgb(206,6,1)" rx="2" ry="2" />
<text  x="188.37" y="1951.5" ></text>
</g>
<g >
<title>__radix_tree_lookup (1,215,074,118 samples, 0.61%)</title><rect x="684.5" y="1797" width="7.1" height="15.0" fill="rgb(253,222,53)" rx="2" ry="2" />
<text  x="687.47" y="1807.5" ></text>
</g>
<g >
<title>submit_bio_noacct_nocheck (25,760,357,611 samples, 12.84%)</title><rect x="761.9" y="1861" width="151.6" height="15.0" fill="rgb(225,95,22)" rx="2" ry="2" />
<text  x="764.93" y="1871.5" >submit_bio_noacct_n..</text>
</g>
<g >
<title>ktime_get (253,310,592 samples, 0.13%)</title><rect x="904.6" y="1813" width="1.5" height="15.0" fill="rgb(207,10,2)" rx="2" ry="2" />
<text  x="907.64" y="1823.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="325" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="335.5" ></text>
</g>
<g >
<title>__rcu_read_unlock (1,236,633,414 samples, 0.62%)</title><rect x="695.2" y="1797" width="7.2" height="15.0" fill="rgb(253,224,53)" rx="2" ry="2" />
<text  x="698.15" y="1807.5" ></text>
</g>
<g >
<title>kmem_cache_free (391,431,228 samples, 0.20%)</title><rect x="158.7" y="1909" width="2.3" height="15.0" fill="rgb(254,225,53)" rx="2" ry="2" />
<text  x="161.73" y="1919.5" ></text>
</g>
<g >
<title>submitter_uring_fn (197,473,434,122 samples, 98.44%)</title><rect x="28.4" y="2053" width="1161.6" height="15.0" fill="rgb(218,61,14)" rx="2" ry="2" />
<text  x="31.38" y="2063.5" >submitter_uring_fn</text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1909" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1919.5" ></text>
</g>
<g >
<title>bio_endio (1,998,035,513 samples, 1.00%)</title><rect x="171.1" y="1941" width="11.7" height="15.0" fill="rgb(217,55,13)" rx="2" ry="2" />
<text  x="174.05" y="1951.5" ></text>
</g>
<g >
<title>__iomap_dio_rw (98,268,516,766 samples, 48.99%)</title><rect x="519.5" y="1893" width="578.0" height="15.0" fill="rgb(212,35,8)" rx="2" ry="2" />
<text  x="522.45" y="1903.5" >__iomap_dio_rw</text>
</g>
<g >
<title>wbt_issue (344,664,823 samples, 0.17%)</title><rect x="391.3" y="1845" width="2.0" height="15.0" fill="rgb(226,98,23)" rx="2" ry="2" />
<text  x="394.30" y="1855.5" ></text>
</g>
<g >
<title>mempool_alloc_noprof (872,032,812 samples, 0.43%)</title><rect x="705.2" y="1845" width="5.1" height="15.0" fill="rgb(228,106,25)" rx="2" ry="2" />
<text  x="708.19" y="1855.5" ></text>
</g>
<g >
<title>__submit_bio (23,548,162,534 samples, 11.74%)</title><rect x="772.1" y="1845" width="138.5" height="15.0" fill="rgb(230,117,28)" rx="2" ry="2" />
<text  x="775.10" y="1855.5" >__submit_bio</text>
</g>
<g >
<title>blk_start_plug (389,947,699 samples, 0.19%)</title><rect x="611.0" y="1877" width="2.3" height="15.0" fill="rgb(217,56,13)" rx="2" ry="2" />
<text  x="613.97" y="1887.5" ></text>
</g>
<g >
<title>__blk_mq_alloc_requests (6,163,309,038 samples, 3.07%)</title><rect x="813.0" y="1813" width="36.2" height="15.0" fill="rgb(248,199,47)" rx="2" ry="2" />
<text  x="815.96" y="1823.5" >__b..</text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="437" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="447.5" ></text>
</g>
<g >
<title>blk_mq_complete_request_remote (574,948,329 samples, 0.29%)</title><rect x="273.6" y="1893" width="3.4" height="15.0" fill="rgb(235,140,33)" rx="2" ry="2" />
<text  x="276.63" y="1903.5" ></text>
</g>
<g >
<title>io_init_rw_fixed (3,995,997,026 samples, 1.99%)</title><rect x="1154.5" y="1941" width="23.5" height="15.0" fill="rgb(244,182,43)" rx="2" ry="2" />
<text  x="1157.46" y="1951.5" >i..</text>
</g>
<g >
<title>ext4_inode_block_valid (211,064,702 samples, 0.11%)</title><rect x="995.2" y="1813" width="1.3" height="15.0" fill="rgb(215,50,11)" rx="2" ry="2" />
<text  x="998.23" y="1823.5" ></text>
</g>
<g >
<title>sbitmap_queue_clear_batch (2,401,718,431 samples, 1.20%)</title><rect x="228.2" y="1941" width="14.1" height="15.0" fill="rgb(245,184,44)" rx="2" ry="2" />
<text  x="231.16" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1461" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1471.5" ></text>
</g>
<g >
<title>__check_block_validity.constprop.90 (3,012,094,778 samples, 1.50%)</title><rect x="990.8" y="1829" width="17.8" height="15.0" fill="rgb(233,129,30)" rx="2" ry="2" />
<text  x="993.84" y="1839.5" ></text>
</g>
<g >
<title>[unknown] (3,122,574,652 samples, 1.56%)</title><rect x="10.0" y="149" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="159.5" ></text>
</g>
<g >
<title>bio_uninit (188,828,177 samples, 0.09%)</title><rect x="157.3" y="1909" width="1.1" height="15.0" fill="rgb(238,154,36)" rx="2" ry="2" />
<text  x="160.30" y="1919.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1509" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1519.5" ></text>
</g>
<g >
<title>blk_mq_flush_plug_list (13,189,925,409 samples, 6.58%)</title><rect x="355.0" y="1941" width="77.6" height="15.0" fill="rgb(215,46,11)" rx="2" ry="2" />
<text  x="358.04" y="1951.5" >blk_mq_f..</text>
</g>
<g >
<title>ext4_es_lookup_extent (11,159,548,846 samples, 5.56%)</title><rect x="1008.6" y="1829" width="65.6" height="15.0" fill="rgb(222,80,19)" rx="2" ry="2" />
<text  x="1011.56" y="1839.5" >ext4_es..</text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="741" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="751.5" ></text>
</g>
<g >
<title>iomap_dio_complete_work (5,337,825,975 samples, 2.66%)</title><rect x="196.5" y="1941" width="31.4" height="15.0" fill="rgb(232,124,29)" rx="2" ry="2" />
<text  x="199.50" y="1951.5" >io..</text>
</g>
<g >
<title>io_vec_free (143,529,914 samples, 0.07%)</title><rect x="254.3" y="1957" width="0.8" height="15.0" fill="rgb(236,144,34)" rx="2" ry="2" />
<text  x="257.25" y="1967.5" ></text>
</g>
<g >
<title>entry_SYSCALL_64_safe_stack (36,079,163 samples, 0.02%)</title><rect x="1189.6" y="2037" width="0.2" height="15.0" fill="rgb(231,120,28)" rx="2" ry="2" />
<text  x="1192.57" y="2047.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1845" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1855.5" ></text>
</g>
<g >
<title>io_req_rw_cleanup (1,326,356,716 samples, 0.66%)</title><rect x="246.4" y="1957" width="7.8" height="15.0" fill="rgb(246,193,46)" rx="2" ry="2" />
<text  x="249.40" y="1967.5" ></text>
</g>
<g >
<title>mempool_free_slab (19,192,576 samples, 0.01%)</title><rect x="161.3" y="1909" width="0.1" height="15.0" fill="rgb(219,67,16)" rx="2" ry="2" />
<text  x="164.30" y="1919.5" ></text>
</g>
<g >
<title>blk_mq_get_tags (2,246,187,939 samples, 1.12%)</title><rect x="825.6" y="1797" width="13.2" height="15.0" fill="rgb(215,46,11)" rx="2" ry="2" />
<text  x="828.57" y="1807.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="661" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="671.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="709" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="719.5" ></text>
</g>
<g >
<title>ext4_should_use_dio.isra.16 (2,034,135,990 samples, 1.01%)</title><rect x="504.8" y="1909" width="12.0" height="15.0" fill="rgb(242,170,40)" rx="2" ry="2" />
<text  x="507.84" y="1919.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1541" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1551.5" ></text>
</g>
<g >
<title>__iomap_dio_bio_end_io (3,111,009,699 samples, 1.55%)</title><rect x="143.1" y="1941" width="18.3" height="15.0" fill="rgb(207,12,3)" rx="2" ry="2" />
<text  x="146.11" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="309" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="319.5" ></text>
</g>
<g >
<title>__rcu_read_unlock (68,317,548 samples, 0.03%)</title><rect x="355.6" y="1909" width="0.4" height="15.0" fill="rgb(253,224,53)" rx="2" ry="2" />
<text  x="358.61" y="1919.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1685" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1695.5" ></text>
</g>
<g >
<title>__pcs_replace_empty_main (299,382,124 samples, 0.15%)</title><rect x="603.9" y="1861" width="1.8" height="15.0" fill="rgb(229,114,27)" rx="2" ry="2" />
<text  x="606.92" y="1871.5" ></text>
</g>
<g >
<title>bio_uninit (33,777,546 samples, 0.02%)</title><rect x="153.7" y="1909" width="0.2" height="15.0" fill="rgb(238,154,36)" rx="2" ry="2" />
<text  x="156.72" y="1919.5" ></text>
</g>
<g >
<title>blk_integrity_merge_bio (325,428,207 samples, 0.16%)</title><rect x="890.8" y="1765" width="2.0" height="15.0" fill="rgb(209,20,5)" rx="2" ry="2" />
<text  x="893.85" y="1775.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1045" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1055.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1205" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1215.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1317" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1327.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="357" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="367.5" ></text>
</g>
<g >
<title>submit_bio (578,018,166 samples, 0.29%)</title><rect x="746.7" y="1861" width="3.4" height="15.0" fill="rgb(207,13,3)" rx="2" ry="2" />
<text  x="749.65" y="1871.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1749" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1759.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="229" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="239.5" ></text>
</g>
<g >
<title>iocb_bio_iopoll (3,730,626,666 samples, 1.86%)</title><rect x="255.1" y="1957" width="21.9" height="15.0" fill="rgb(208,16,3)" rx="2" ry="2" />
<text  x="258.10" y="1967.5" >i..</text>
</g>
<g >
<title>__rcu_read_unlock (18,421,988 samples, 0.01%)</title><rect x="849.3" y="1813" width="0.1" height="15.0" fill="rgb(253,224,53)" rx="2" ry="2" />
<text  x="852.29" y="1823.5" ></text>
</g>
<g >
<title>_raw_spin_lock_irqsave (35,305,622 samples, 0.02%)</title><rect x="100.0" y="1893" width="0.2" height="15.0" fill="rgb(247,195,46)" rx="2" ry="2" />
<text  x="103.01" y="1903.5" ></text>
</g>
<g >
<title>syscall_return_via_sysret (29,939,947 samples, 0.01%)</title><rect x="1189.8" y="2037" width="0.2" height="15.0" fill="rgb(229,113,27)" rx="2" ry="2" />
<text  x="1192.82" y="2047.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1397" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1407.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="581" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="591.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="821" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="831.5" ></text>
</g>
<g >
<title>_raw_read_lock (2,582,300,175 samples, 1.29%)</title><rect x="1034.0" y="1813" width="15.2" height="15.0" fill="rgb(233,132,31)" rx="2" ry="2" />
<text  x="1037.00" y="1823.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="869" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="879.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1269" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1279.5" ></text>
</g>
<g >
<title>update_io_ticks (762,283,326 samples, 0.38%)</title><rect x="906.1" y="1813" width="4.5" height="15.0" fill="rgb(235,141,33)" rx="2" ry="2" />
<text  x="909.13" y="1823.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1109" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1119.5" ></text>
</g>
<g >
<title>[unknown] (3,122,574,652 samples, 1.56%)</title><rect x="10.0" y="165" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="175.5" ></text>
</g>
<g >
<title>__rcu_read_lock (297,833,438 samples, 0.15%)</title><rect x="667.3" y="1813" width="1.7" height="15.0" fill="rgb(220,69,16)" rx="2" ry="2" />
<text  x="670.30" y="1823.5" ></text>
</g>
<g >
<title>[unknown] (3,122,574,652 samples, 1.56%)</title><rect x="10.0" y="197" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="207.5" ></text>
</g>
<g >
<title>blk_hctx_poll.isra.67 (3,662,306,567 samples, 1.83%)</title><rect x="255.5" y="1925" width="21.5" height="15.0" fill="rgb(209,22,5)" rx="2" ry="2" />
<text  x="258.47" y="1935.5" >b..</text>
</g>
<g >
<title>__list_add_valid_or_report (500,494,189 samples, 0.25%)</title><rect x="450.1" y="1957" width="3.0" height="15.0" fill="rgb(215,46,11)" rx="2" ry="2" />
<text  x="453.11" y="1967.5" ></text>
</g>
<g >
<title>__pcs_replace_full_main (198,806,521 samples, 0.10%)</title><rect x="226.7" y="1893" width="1.2" height="15.0" fill="rgb(230,119,28)" rx="2" ry="2" />
<text  x="229.73" y="1903.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1797" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1807.5" ></text>
</g>
<g >
<title>io_rw_init_file (1,930,476,081 samples, 0.96%)</title><rect x="1131.0" y="1925" width="11.3" height="15.0" fill="rgb(218,60,14)" rx="2" ry="2" />
<text  x="1133.96" y="1935.5" ></text>
</g>
<g >
<title>blk_mq_sched_bio_merge (1,333,242,881 samples, 0.66%)</title><rect x="896.8" y="1813" width="7.8" height="15.0" fill="rgb(210,26,6)" rx="2" ry="2" />
<text  x="899.80" y="1823.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="805" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="815.5" ></text>
</g>
<g >
<title>__rq_qos_done (1,185,940,827 samples, 0.59%)</title><rect x="164.1" y="1941" width="6.9" height="15.0" fill="rgb(226,98,23)" rx="2" ry="2" />
<text  x="167.07" y="1951.5" ></text>
</g>
<g >
<title>nvme_unmap_data (617,178,405 samples, 0.31%)</title><rect x="294.9" y="1941" width="3.6" height="15.0" fill="rgb(237,149,35)" rx="2" ry="2" />
<text  x="297.92" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="261" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="271.5" ></text>
</g>
<g >
<title>mutex_lock (86,721,107 samples, 0.04%)</title><rect x="1178.7" y="1989" width="0.5" height="15.0" fill="rgb(217,57,13)" rx="2" ry="2" />
<text  x="1181.68" y="1999.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1957" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1967.5" ></text>
</g>
<g >
<title>__rcu_read_unlock (601,805,813 samples, 0.30%)</title><rect x="1005.0" y="1797" width="3.6" height="15.0" fill="rgb(253,224,53)" rx="2" ry="2" />
<text  x="1008.02" y="1807.5" ></text>
</g>
<g >
<title>__rq_qos_done_bio (419,122,814 samples, 0.21%)</title><rect x="180.3" y="1925" width="2.5" height="15.0" fill="rgb(234,134,32)" rx="2" ry="2" />
<text  x="183.34" y="1935.5" ></text>
</g>
<g >
<title>[unknown] (3,121,865,120 samples, 1.56%)</title><rect x="10.0" y="53" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="63.5" ></text>
</g>
<g >
<title>__io_prep_rw (6,507,638,344 samples, 3.24%)</title><rect x="316.3" y="1973" width="38.3" height="15.0" fill="rgb(222,80,19)" rx="2" ry="2" />
<text  x="319.35" y="1983.5" >__i..</text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1573" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1583.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="693" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="703.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="373" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="383.5" ></text>
</g>
<g >
<title>iomap_iter_advance (568,776,951 samples, 0.28%)</title><rect x="1090.7" y="1877" width="3.3" height="15.0" fill="rgb(206,4,1)" rx="2" ry="2" />
<text  x="1093.65" y="1887.5" ></text>
</g>
<g >
<title>nvme_queue_rqs (13,025,651,367 samples, 6.49%)</title><rect x="356.0" y="1909" width="76.6" height="15.0" fill="rgb(250,211,50)" rx="2" ry="2" />
<text  x="359.01" y="1919.5" >nvme_que..</text>
</g>
<g >
<title>ext4_iomap_begin (22,794,302,344 samples, 11.36%)</title><rect x="956.6" y="1861" width="134.1" height="15.0" fill="rgb(233,133,31)" rx="2" ry="2" />
<text  x="959.56" y="1871.5" >ext4_iomap_begin</text>
</g>
<g >
<title>iomap_dio_bio_end_io (244,863,204 samples, 0.12%)</title><rect x="195.1" y="1941" width="1.4" height="15.0" fill="rgb(235,138,33)" rx="2" ry="2" />
<text  x="198.06" y="1951.5" ></text>
</g>
<g >
<title>__pcs_replace_empty_main (64,495,208 samples, 0.03%)</title><rect x="709.6" y="1813" width="0.4" height="15.0" fill="rgb(229,114,27)" rx="2" ry="2" />
<text  x="712.61" y="1823.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="965" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="975.5" ></text>
</g>
<g >
<title>iomap_dio_submit_bio (2,774,577,725 samples, 1.38%)</title><rect x="730.3" y="1861" width="16.4" height="15.0" fill="rgb(239,159,38)" rx="2" ry="2" />
<text  x="733.33" y="1871.5" ></text>
</g>
<g >
<title>__rcu_read_lock (203,410,843 samples, 0.10%)</title><rect x="1003.8" y="1797" width="1.2" height="15.0" fill="rgb(220,69,16)" rx="2" ry="2" />
<text  x="1006.82" y="1807.5" ></text>
</g>
<g >
<title>bio_alloc_bioset (12,138,171,216 samples, 6.05%)</title><rect x="638.9" y="1861" width="71.4" height="15.0" fill="rgb(206,5,1)" rx="2" ry="2" />
<text  x="641.92" y="1871.5" >bio_allo..</text>
</g>
<g >
<title>nvme_submit_cmds.part.55 (1,985,849,787 samples, 0.99%)</title><rect x="420.9" y="1893" width="11.7" height="15.0" fill="rgb(245,187,44)" rx="2" ry="2" />
<text  x="423.95" y="1903.5" ></text>
</g>
<g >
<title>entry_SYSCALL_64_after_hwframe (196,031,136,912 samples, 97.72%)</title><rect x="36.4" y="2037" width="1153.2" height="15.0" fill="rgb(218,63,15)" rx="2" ry="2" />
<text  x="39.43" y="2047.5" >entry_SYSCALL_64_after_hwframe</text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="613" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="623.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="853" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="863.5" ></text>
</g>
<g >
<title>blk_add_timer (670,164,765 samples, 0.33%)</title><rect x="393.3" y="1861" width="4.0" height="15.0" fill="rgb(224,91,21)" rx="2" ry="2" />
<text  x="396.34" y="1871.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1877" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1887.5" ></text>
</g>
<g >
<title>__list_del_entry_valid_or_report (27,630,743 samples, 0.01%)</title><rect x="605.1" y="1829" width="0.1" height="15.0" fill="rgb(243,176,42)" rx="2" ry="2" />
<text  x="608.08" y="1839.5" ></text>
</g>
<g >
<title>kfree (1,534,449,931 samples, 0.76%)</title><rect x="91.3" y="1941" width="9.0" height="15.0" fill="rgb(222,78,18)" rx="2" ry="2" />
<text  x="94.27" y="1951.5" ></text>
</g>
<g >
<title>mempool_free (511,180,276 samples, 0.25%)</title><rect x="158.4" y="1925" width="3.0" height="15.0" fill="rgb(233,131,31)" rx="2" ry="2" />
<text  x="161.41" y="1935.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="453" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="463.5" ></text>
</g>
<g >
<title>iov_iter_bvec (323,923,750 samples, 0.16%)</title><rect x="1176.1" y="1909" width="1.9" height="15.0" fill="rgb(224,90,21)" rx="2" ry="2" />
<text  x="1179.06" y="1919.5" ></text>
</g>
<g >
<title>_raw_spin_lock_irqsave (57,576,410 samples, 0.03%)</title><rect x="605.2" y="1829" width="0.4" height="15.0" fill="rgb(247,195,46)" rx="2" ry="2" />
<text  x="608.25" y="1839.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1973" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1983.5" ></text>
</g>
<g >
<title>_raw_spin_unlock_irqrestore (178,092,733 samples, 0.09%)</title><rect x="837.7" y="1765" width="1.1" height="15.0" fill="rgb(228,106,25)" rx="2" ry="2" />
<text  x="840.74" y="1775.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1429" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1439.5" ></text>
</g>
<g >
<title>_find_next_bit (36,857,567 samples, 0.02%)</title><rect x="910.4" y="1765" width="0.2" height="15.0" fill="rgb(230,116,27)" rx="2" ry="2" />
<text  x="913.40" y="1775.5" ></text>
</g>
<g >
<title>percpu_counter_add_batch (1,579,001,476 samples, 0.79%)</title><rect x="1064.9" y="1813" width="9.3" height="15.0" fill="rgb(241,166,39)" rx="2" ry="2" />
<text  x="1067.92" y="1823.5" ></text>
</g>
<g >
<title>__pi_memset (530,432,963 samples, 0.26%)</title><rect x="351.5" y="1941" width="3.1" height="15.0" fill="rgb(215,47,11)" rx="2" ry="2" />
<text  x="354.51" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="405" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="415.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="645" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="655.5" ></text>
</g>
<g >
<title>ext4_map_blocks (17,150,015,990 samples, 8.55%)</title><rect x="973.3" y="1845" width="100.9" height="15.0" fill="rgb(247,196,46)" rx="2" ry="2" />
<text  x="976.33" y="1855.5" >ext4_map_blo..</text>
</g>
<g >
<title>kfree (1,646,450,652 samples, 0.82%)</title><rect x="218.2" y="1909" width="9.7" height="15.0" fill="rgb(222,78,18)" rx="2" ry="2" />
<text  x="221.21" y="1919.5" ></text>
</g>
<g >
<title>[unknown] (3,121,865,120 samples, 1.56%)</title><rect x="10.0" y="85" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="95.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1717" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1727.5" ></text>
</g>
<g >
<title>wbt_wait (1,535,959,142 samples, 0.77%)</title><rect x="851.5" y="1797" width="9.1" height="15.0" fill="rgb(225,95,22)" rx="2" ry="2" />
<text  x="854.54" y="1807.5" ></text>
</g>
<g >
<title>io_assign_file.part.63 (1,218,192,856 samples, 0.61%)</title><rect x="453.1" y="1957" width="7.1" height="15.0" fill="rgb(228,107,25)" rx="2" ry="2" />
<text  x="456.05" y="1967.5" ></text>
</g>
<g >
<title>__list_del_entry_valid_or_report (26,100,399 samples, 0.01%)</title><rect x="351.0" y="1893" width="0.1" height="15.0" fill="rgb(243,176,42)" rx="2" ry="2" />
<text  x="353.95" y="1903.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1941" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1951.5" ></text>
</g>
<g >
<title>_find_first_zero_bit (108,229,251 samples, 0.05%)</title><rect x="830.8" y="1765" width="0.6" height="15.0" fill="rgb(244,181,43)" rx="2" ry="2" />
<text  x="833.76" y="1775.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1077" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1087.5" ></text>
</g>
<g >
<title>blk_finish_plug (898,047,097 samples, 0.45%)</title><rect x="605.7" y="1877" width="5.3" height="15.0" fill="rgb(231,119,28)" rx="2" ry="2" />
<text  x="608.69" y="1887.5" ></text>
</g>
<g >
<title>barn_replace_empty_sheaf (161,204,716 samples, 0.08%)</title><rect x="604.7" y="1845" width="1.0" height="15.0" fill="rgb(223,84,20)" rx="2" ry="2" />
<text  x="607.73" y="1855.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1237" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1247.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="533" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="543.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="933" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="943.5" ></text>
</g>
<g >
<title>io_read_fixed (4,460,420,321 samples, 2.22%)</title><rect x="1151.7" y="1957" width="26.3" height="15.0" fill="rgb(218,62,14)" rx="2" ry="2" />
<text  x="1154.72" y="1967.5" >i..</text>
</g>
<g >
<title>__rq_qos_track (1,334,794,047 samples, 0.67%)</title><rect x="860.6" y="1813" width="7.8" height="15.0" fill="rgb(209,20,4)" rx="2" ry="2" />
<text  x="863.58" y="1823.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1605" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1615.5" ></text>
</g>
<g >
<title>blk_cgroup_bio_start (484,376,891 samples, 0.24%)</title><rect x="910.6" y="1845" width="2.9" height="15.0" fill="rgb(229,114,27)" rx="2" ry="2" />
<text  x="913.62" y="1855.5" ></text>
</g>
<g >
<title>bdev_count_inflight_rw.part.14 (128,992,677 samples, 0.06%)</title><rect x="909.9" y="1781" width="0.7" height="15.0" fill="rgb(208,15,3)" rx="2" ry="2" />
<text  x="912.86" y="1791.5" ></text>
</g>
<g >
<title>dma_unmap_phys (1,414,794,723 samples, 0.71%)</title><rect x="281.2" y="1941" width="8.3" height="15.0" fill="rgb(218,64,15)" rx="2" ry="2" />
<text  x="284.16" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="997" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1007.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1157" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1167.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1365" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1375.5" ></text>
</g>
<g >
<title>bio_associate_blkg (7,361,394,905 samples, 3.67%)</title><rect x="661.9" y="1829" width="43.3" height="15.0" fill="rgb(244,183,43)" rx="2" ry="2" />
<text  x="664.89" y="1839.5" >bio_..</text>
</g>
<g >
<title>wb_timestamp (277,858,246 samples, 0.14%)</title><rect x="169.4" y="1909" width="1.6" height="15.0" fill="rgb(217,56,13)" rx="2" ry="2" />
<text  x="172.41" y="1919.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="773" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="783.5" ></text>
</g>
<g >
<title>blk_start_plug_nr_ios (18,426,904 samples, 0.01%)</title><rect x="432.6" y="1973" width="0.1" height="15.0" fill="rgb(254,228,54)" rx="2" ry="2" />
<text  x="435.63" y="1983.5" ></text>
</g>
<g >
<title>wb_timestamp (338,494,931 samples, 0.17%)</title><rect x="858.6" y="1781" width="2.0" height="15.0" fill="rgb(217,56,13)" rx="2" ry="2" />
<text  x="861.59" y="1791.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1493" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1503.5" ></text>
</g>
<g >
<title>bio_put (745,335,950 samples, 0.37%)</title><rect x="154.0" y="1925" width="4.4" height="15.0" fill="rgb(242,173,41)" rx="2" ry="2" />
<text  x="157.02" y="1935.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="2037" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="2047.5" ></text>
</g>
<g >
<title>bio_to_wbt_flags (297,839,667 samples, 0.15%)</title><rect x="856.8" y="1781" width="1.8" height="15.0" fill="rgb(235,138,33)" rx="2" ry="2" />
<text  x="859.84" y="1791.5" ></text>
</g>
<g >
<title>blk_attempt_plug_merge (3,291,988,316 samples, 1.64%)</title><rect x="877.4" y="1813" width="19.4" height="15.0" fill="rgb(242,173,41)" rx="2" ry="2" />
<text  x="880.43" y="1823.5" ></text>
</g>
<g >
<title>blk_mq_rq_ctx_init.isra.58 (1,772,430,460 samples, 0.88%)</title><rect x="838.8" y="1797" width="10.4" height="15.0" fill="rgb(223,83,19)" rx="2" ry="2" />
<text  x="841.79" y="1807.5" ></text>
</g>
<g >
<title>_raw_read_unlock (2,669,710,869 samples, 1.33%)</title><rect x="1049.2" y="1813" width="15.7" height="15.0" fill="rgb(217,57,13)" rx="2" ry="2" />
<text  x="1052.19" y="1823.5" ></text>
</g>
<g >
<title>__rcu_read_unlock (444,979,049 samples, 0.22%)</title><rect x="161.4" y="1941" width="2.7" height="15.0" fill="rgb(253,224,53)" rx="2" ry="2" />
<text  x="164.45" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1637" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1647.5" ></text>
</g>
<g >
<title>barn_replace_empty_sheaf (29,175,668 samples, 0.01%)</title><rect x="709.8" y="1797" width="0.2" height="15.0" fill="rgb(223,84,20)" rx="2" ry="2" />
<text  x="712.81" y="1807.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="277" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="287.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="757" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="767.5" ></text>
</g>
<g >
<title>bio_iov_iter_get_pages (2,888,197,191 samples, 1.44%)</title><rect x="710.3" y="1861" width="17.0" height="15.0" fill="rgb(228,107,25)" rx="2" ry="2" />
<text  x="713.32" y="1871.5" ></text>
</g>
<g >
<title>__rcu_read_lock (138,931,437 samples, 0.07%)</title><rect x="192.8" y="1925" width="0.8" height="15.0" fill="rgb(220,69,16)" rx="2" ry="2" />
<text  x="195.83" y="1935.5" ></text>
</g>
<g >
<title>fpregs_assert_state_consistent (22,249,206 samples, 0.01%)</title><rect x="1189.4" y="2005" width="0.1" height="15.0" fill="rgb(228,109,26)" rx="2" ry="2" />
<text  x="1192.36" y="2015.5" ></text>
</g>
<g >
<title>__kmalloc_noprof (1,975,862,398 samples, 0.98%)</title><rect x="339.9" y="1941" width="11.6" height="15.0" fill="rgb(235,138,33)" rx="2" ry="2" />
<text  x="342.89" y="1951.5" ></text>
</g>
<g >
<title>_raw_spin_lock (218,008,068 samples, 0.11%)</title><rect x="272.3" y="1893" width="1.3" height="15.0" fill="rgb(239,160,38)" rx="2" ry="2" />
<text  x="275.31" y="1903.5" ></text>
</g>
<g >
<title>io_complete_rw_iopoll (239,453,986 samples, 0.12%)</title><rect x="193.7" y="1941" width="1.4" height="15.0" fill="rgb(254,228,54)" rx="2" ry="2" />
<text  x="196.65" y="1951.5" ></text>
</g>
<g >
<title>security_file_permission (553,457,624 samples, 0.28%)</title><rect x="1148.5" y="1909" width="3.2" height="15.0" fill="rgb(225,96,23)" rx="2" ry="2" />
<text  x="1151.47" y="1919.5" ></text>
</g>
<g >
<title>__rq_qos_throttle (1,900,556,621 samples, 0.95%)</title><rect x="849.4" y="1813" width="11.2" height="15.0" fill="rgb(229,110,26)" rx="2" ry="2" />
<text  x="852.40" y="1823.5" ></text>
</g>
<g >
<title>get_offset.part.0 (1,740,143,518 samples, 0.87%)</title><rect x="10.0" y="37" width="10.2" height="15.0" fill="rgb(212,36,8)" rx="2" ry="2" />
<text  x="13.00" y="47.5" ></text>
</g>
<g >
<title>radix_tree_lookup (167,334,968 samples, 0.08%)</title><rect x="702.4" y="1797" width="1.0" height="15.0" fill="rgb(230,118,28)" rx="2" ry="2" />
<text  x="705.44" y="1807.5" ></text>
</g>
<g >
<title>iomap_dio_bio_iter (51,033,390,387 samples, 25.44%)</title><rect x="613.3" y="1877" width="300.2" height="15.0" fill="rgb(236,145,34)" rx="2" ry="2" />
<text  x="616.27" y="1887.5" >iomap_dio_bio_iter</text>
</g>
<g >
<title>bdev_count_inflight (128,992,677 samples, 0.06%)</title><rect x="909.9" y="1797" width="0.7" height="15.0" fill="rgb(209,22,5)" rx="2" ry="2" />
<text  x="912.86" y="1807.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="837" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="847.5" ></text>
</g>
<g >
<title>__io_read (116,579,955,921 samples, 58.12%)</title><rect x="466.0" y="1941" width="685.7" height="15.0" fill="rgb(215,49,11)" rx="2" ry="2" />
<text  x="468.95" y="1951.5" >__io_read</text>
</g>
<g >
<title>wbt_track (743,017,426 samples, 0.37%)</title><rect x="864.1" y="1797" width="4.3" height="15.0" fill="rgb(205,2,0)" rx="2" ry="2" />
<text  x="867.06" y="1807.5" ></text>
</g>
<g >
<title>blk_mq_end_request_batch (23,709,729,459 samples, 11.82%)</title><rect x="106.9" y="1957" width="139.5" height="15.0" fill="rgb(254,225,53)" rx="2" ry="2" />
<text  x="109.93" y="1967.5" >blk_mq_end_reques..</text>
</g>
<g >
<title>blk_try_merge (686,257,215 samples, 0.34%)</title><rect x="892.8" y="1781" width="4.0" height="15.0" fill="rgb(235,142,34)" rx="2" ry="2" />
<text  x="895.76" y="1791.5" ></text>
</g>
<g >
<title>io_prep_read_fixed (121,277,378 samples, 0.06%)</title><rect x="1178.0" y="1973" width="0.7" height="15.0" fill="rgb(218,64,15)" rx="2" ry="2" />
<text  x="1180.96" y="1983.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1093" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1103.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1813" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1823.5" ></text>
</g>
<g >
<title>kmem_cache_alloc_noprof (605,667,599 samples, 0.30%)</title><rect x="706.4" y="1829" width="3.6" height="15.0" fill="rgb(248,200,47)" rx="2" ry="2" />
<text  x="709.43" y="1839.5" ></text>
</g>
<g >
<title>blk_mq_dispatch_queue_requests (13,150,774,975 samples, 6.56%)</title><rect x="355.3" y="1925" width="77.3" height="15.0" fill="rgb(216,50,12)" rx="2" ry="2" />
<text  x="358.27" y="1935.5" >blk_mq_d..</text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1349" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1359.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="917" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="927.5" ></text>
</g>
<g >
<title>mempool_free_bulk (45,288,475 samples, 0.02%)</title><rect x="161.0" y="1909" width="0.3" height="15.0" fill="rgb(242,171,40)" rx="2" ry="2" />
<text  x="164.03" y="1919.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1253" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1263.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1301" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1311.5" ></text>
</g>
<g >
<title>__pcs_replace_empty_main (268,660,930 samples, 0.13%)</title><rect x="349.9" y="1925" width="1.6" height="15.0" fill="rgb(229,114,27)" rx="2" ry="2" />
<text  x="352.93" y="1935.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="485" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="495.5" ></text>
</g>
<g >
<title>ext4_inode_journal_mode (836,718,472 samples, 0.42%)</title><rect x="511.9" y="1877" width="4.9" height="15.0" fill="rgb(206,7,1)" rx="2" ry="2" />
<text  x="514.89" y="1887.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="677" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="687.5" ></text>
</g>
<g >
<title>nvme_complete_batch_req (923,455,304 samples, 0.46%)</title><rect x="289.5" y="1941" width="5.4" height="15.0" fill="rgb(217,58,13)" rx="2" ry="2" />
<text  x="292.48" y="1951.5" ></text>
</g>
<g >
<title>bio_free (94,410,360 samples, 0.05%)</title><rect x="153.5" y="1925" width="0.5" height="15.0" fill="rgb(221,74,17)" rx="2" ry="2" />
<text  x="156.47" y="1935.5" ></text>
</g>
<g >
<title>dma_map_page_attrs (292,475,583 samples, 0.15%)</title><rect x="397.3" y="1877" width="1.7" height="15.0" fill="rgb(218,64,15)" rx="2" ry="2" />
<text  x="400.28" y="1887.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1733" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1743.5" ></text>
</g>
<g >
<title>__pcs_replace_full_main (140,470,132 samples, 0.07%)</title><rect x="99.5" y="1925" width="0.8" height="15.0" fill="rgb(230,119,28)" rx="2" ry="2" />
<text  x="102.46" y="1935.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1925" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1935.5" ></text>
</g>
<g >
<title>io_issue_sqe (126,686,887,144 samples, 63.15%)</title><rect x="432.7" y="1973" width="745.3" height="15.0" fill="rgb(243,175,42)" rx="2" ry="2" />
<text  x="435.74" y="1983.5" >io_issue_sqe</text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="597" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="607.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1173" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1183.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1381" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1391.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="389" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="399.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1765" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1775.5" ></text>
</g>
<g >
<title>bio_associate_blkg_from_css (5,843,814,546 samples, 2.91%)</title><rect x="669.0" y="1813" width="34.4" height="15.0" fill="rgb(225,94,22)" rx="2" ry="2" />
<text  x="672.05" y="1823.5" >bi..</text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1893" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1903.5" ></text>
</g>
<g >
<title>dma_map_phys (1,224,304,522 samples, 0.61%)</title><rect x="399.0" y="1877" width="7.2" height="15.0" fill="rgb(235,139,33)" rx="2" ry="2" />
<text  x="402.00" y="1887.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1013" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1023.5" ></text>
</g>
<g >
<title>bio_poll (3,718,344,469 samples, 1.85%)</title><rect x="255.2" y="1941" width="21.8" height="15.0" fill="rgb(235,140,33)" rx="2" ry="2" />
<text  x="258.17" y="1951.5" >b..</text>
</g>
<g >
<title>__pcs_replace_full_main (29,171,295 samples, 0.01%)</title><rect x="160.9" y="1893" width="0.1" height="15.0" fill="rgb(230,119,28)" rx="2" ry="2" />
<text  x="163.86" y="1903.5" ></text>
</g>
<g >
<title>[unknown] (3,121,865,120 samples, 1.56%)</title><rect x="10.0" y="69" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="79.5" ></text>
</g>
<g >
<title>io_submit_sqes (149,620,620,008 samples, 74.59%)</title><rect x="298.5" y="1989" width="880.2" height="15.0" fill="rgb(209,18,4)" rx="2" ry="2" />
<text  x="301.55" y="1999.5" >io_submit_sqes</text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1989" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1999.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="2005" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="2015.5" ></text>
</g>
<g >
<title>nvme_pci_complete_batch (3,655,417,870 samples, 1.82%)</title><rect x="277.0" y="1957" width="21.5" height="15.0" fill="rgb(245,185,44)" rx="2" ry="2" />
<text  x="280.04" y="1967.5" >n..</text>
</g>
<g >
<title>__rq_qos_issue (796,770,690 samples, 0.40%)</title><rect x="388.6" y="1861" width="4.7" height="15.0" fill="rgb(230,115,27)" rx="2" ry="2" />
<text  x="391.64" y="1871.5" ></text>
</g>
<g >
<title>__blk_flush_plug (13,244,428,583 samples, 6.60%)</title><rect x="354.7" y="1957" width="77.9" height="15.0" fill="rgb(217,57,13)" rx="2" ry="2" />
<text  x="357.72" y="1967.5" >__blk_flu..</text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1125" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1135.5" ></text>
</g>
<g >
<title>__rcu_read_lock (30,706,640 samples, 0.02%)</title><rect x="825.3" y="1797" width="0.2" height="15.0" fill="rgb(220,69,16)" rx="2" ry="2" />
<text  x="828.27" y="1807.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1653" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1663.5" ></text>
</g>
<g >
<title>iomap_dio_rw (98,718,333,614 samples, 49.21%)</title><rect x="516.8" y="1909" width="580.7" height="15.0" fill="rgb(240,161,38)" rx="2" ry="2" />
<text  x="519.81" y="1919.5" >iomap_dio_rw</text>
</g>
<g >
<title>__list_del_entry_valid_or_report (23,028,084 samples, 0.01%)</title><rect x="227.4" y="1861" width="0.2" height="15.0" fill="rgb(243,176,42)" rx="2" ry="2" />
<text  x="230.42" y="1871.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1285" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1295.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1477" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1487.5" ></text>
</g>
<g >
<title>blk_account_io_completion.part.66 (436,745,357 samples, 0.22%)</title><rect x="182.8" y="1941" width="2.6" height="15.0" fill="rgb(249,203,48)" rx="2" ry="2" />
<text  x="185.81" y="1951.5" ></text>
</g>
<g >
<title>__rcu_read_lock (132,029,584 samples, 0.07%)</title><rect x="177.3" y="1925" width="0.7" height="15.0" fill="rgb(220,69,16)" rx="2" ry="2" />
<text  x="180.25" y="1935.5" ></text>
</g>
<g >
<title>blk_add_rq_to_plug (1,212,057,721 samples, 0.60%)</title><rect x="870.3" y="1813" width="7.1" height="15.0" fill="rgb(243,175,41)" rx="2" ry="2" />
<text  x="873.30" y="1823.5" ></text>
</g>
<g >
<title>[unknown] (3,122,574,652 samples, 1.56%)</title><rect x="10.0" y="117" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="127.5" ></text>
</g>
<g >
<title>blk_finish_plug (13,259,014,476 samples, 6.61%)</title><rect x="354.6" y="1973" width="78.0" height="15.0" fill="rgb(231,119,28)" rx="2" ry="2" />
<text  x="357.64" y="1983.5" >blk_finis..</text>
</g>
<g >
<title>submit_bio_noacct (2,019,588,772 samples, 1.01%)</title><rect x="750.1" y="1861" width="11.8" height="15.0" fill="rgb(211,30,7)" rx="2" ry="2" />
<text  x="753.05" y="1871.5" ></text>
</g>
<g >
<title>up_read (5,110,617,190 samples, 2.55%)</title><rect x="1097.5" y="1909" width="30.1" height="15.0" fill="rgb(209,18,4)" rx="2" ry="2" />
<text  x="1100.51" y="1919.5" >up..</text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="1557" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1567.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="469" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="479.5" ></text>
</g>
<g >
<title>_raw_spin_lock (94,416,278 samples, 0.05%)</title><rect x="432.1" y="1877" width="0.5" height="15.0" fill="rgb(239,160,38)" rx="2" ry="2" />
<text  x="435.07" y="1887.5" ></text>
</g>
<g >
<title>[unknown] (3,123,342,755 samples, 1.56%)</title><rect x="10.0" y="517" width="18.4" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="527.5" ></text>
</g>
<g >
<title>nvme_prep_rq (10,371,193,312 samples, 5.17%)</title><rect x="359.9" y="1893" width="61.0" height="15.0" fill="rgb(254,227,54)" rx="2" ry="2" />
<text  x="362.94" y="1903.5" >nvme_p..</text>
</g>
<g >
<title>blk_stat_add (888,893,094 samples, 0.44%)</title><rect x="188.4" y="1941" width="5.3" height="15.0" fill="rgb(227,103,24)" rx="2" ry="2" />
<text  x="191.42" y="1951.5" ></text>
</g>
<g >
<title>_raw_spin_lock_irqsave (45,285,357 samples, 0.02%)</title><rect x="227.6" y="1861" width="0.2" height="15.0" fill="rgb(247,195,46)" rx="2" ry="2" />
<text  x="230.56" y="1871.5" ></text>
</g>
<g >
<title>nvme_setup_cmd (2,507,063,928 samples, 1.25%)</title><rect x="406.2" y="1877" width="14.7" height="15.0" fill="rgb(243,175,41)" rx="2" ry="2" />
<text  x="409.20" y="1887.5" ></text>
</g>
</g>
</svg>

[-- Attachment #3: iomap_fast.svg --]
[-- Type: application/octet-stream, Size: 72140 bytes --]

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" width="1200" height="2134" onload="init(evt)" viewBox="0 0 1200 2134" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Flame graph stack visualization. See https://github.com/brendangregg/FlameGraph for latest version, and http://www.brendangregg.com/flamegraphs.html for examples. -->
<!-- NOTES:  -->
<defs>
	<linearGradient id="background" y1="0" y2="1" x1="0" x2="0" >
		<stop stop-color="#eeeeee" offset="5%" />
		<stop stop-color="#eeeeb0" offset="95%" />
	</linearGradient>
</defs>
<style type="text/css">
	text { font-family:Verdana; font-size:12px; fill:rgb(0,0,0); }
	#search, #ignorecase { opacity:0.1; cursor:pointer; }
	#search:hover, #search.show, #ignorecase:hover, #ignorecase.show { opacity:1; }
	#subtitle { text-anchor:middle; font-color:rgb(160,160,160); }
	#title { text-anchor:middle; font-size:17px}
	#unzoom { cursor:pointer; }
	#frames > *:hover { stroke:black; stroke-width:0.5; cursor:pointer; }
	.hide { display:none; }
	.parent { opacity:0.5; }
</style>
<script type="text/ecmascript">
<![CDATA[
	"use strict";
	var details, searchbtn, unzoombtn, matchedtxt, svg, searching, currentSearchTerm, ignorecase, ignorecaseBtn;
	function init(evt) {
		details = document.getElementById("details").firstChild;
		searchbtn = document.getElementById("search");
		ignorecaseBtn = document.getElementById("ignorecase");
		unzoombtn = document.getElementById("unzoom");
		matchedtxt = document.getElementById("matched");
		svg = document.getElementsByTagName("svg")[0];
		searching = 0;
		currentSearchTerm = null;

		// use GET parameters to restore a flamegraphs state.
		var params = get_params();
		if (params.x && params.y)
			zoom(find_group(document.querySelector('[x="' + params.x + '"][y="' + params.y + '"]')));
                if (params.s) search(params.s);
	}

	// event listeners
	window.addEventListener("click", function(e) {
		var target = find_group(e.target);
		if (target) {
			if (target.nodeName == "a") {
				if (e.ctrlKey === false) return;
				e.preventDefault();
			}
			if (target.classList.contains("parent")) unzoom(true);
			zoom(target);
			if (!document.querySelector('.parent')) {
				// we have basically done a clearzoom so clear the url
				var params = get_params();
				if (params.x) delete params.x;
				if (params.y) delete params.y;
				history.replaceState(null, null, parse_params(params));
				unzoombtn.classList.add("hide");
				return;
			}

			// set parameters for zoom state
			var el = target.querySelector("rect");
			if (el && el.attributes && el.attributes.y && el.attributes._orig_x) {
				var params = get_params()
				params.x = el.attributes._orig_x.value;
				params.y = el.attributes.y.value;
				history.replaceState(null, null, parse_params(params));
			}
		}
		else if (e.target.id == "unzoom") clearzoom();
		else if (e.target.id == "search") search_prompt();
		else if (e.target.id == "ignorecase") toggle_ignorecase();
	}, false)

	// mouse-over for info
	// show
	window.addEventListener("mouseover", function(e) {
		var target = find_group(e.target);
		if (target) details.nodeValue = "Function: " + g_to_text(target);
	}, false)

	// clear
	window.addEventListener("mouseout", function(e) {
		var target = find_group(e.target);
		if (target) details.nodeValue = ' ';
	}, false)

	// ctrl-F for search
	// ctrl-I to toggle case-sensitive search
	window.addEventListener("keydown",function (e) {
		if (e.keyCode === 114 || (e.ctrlKey && e.keyCode === 70)) {
			e.preventDefault();
			search_prompt();
		}
		else if (e.ctrlKey && e.keyCode === 73) {
			e.preventDefault();
			toggle_ignorecase();
		}
	}, false)

	// functions
	function get_params() {
		var params = {};
		var paramsarr = window.location.search.substr(1).split('&');
		for (var i = 0; i < paramsarr.length; ++i) {
			var tmp = paramsarr[i].split("=");
			if (!tmp[0] || !tmp[1]) continue;
			params[tmp[0]]  = decodeURIComponent(tmp[1]);
		}
		return params;
	}
	function parse_params(params) {
		var uri = "?";
		for (var key in params) {
			uri += key + '=' + encodeURIComponent(params[key]) + '&';
		}
		if (uri.slice(-1) == "&")
			uri = uri.substring(0, uri.length - 1);
		if (uri == '?')
			uri = window.location.href.split('?')[0];
		return uri;
	}
	function find_child(node, selector) {
		var children = node.querySelectorAll(selector);
		if (children.length) return children[0];
	}
	function find_group(node) {
		var parent = node.parentElement;
		if (!parent) return;
		if (parent.id == "frames") return node;
		return find_group(parent);
	}
	function orig_save(e, attr, val) {
		if (e.attributes["_orig_" + attr] != undefined) return;
		if (e.attributes[attr] == undefined) return;
		if (val == undefined) val = e.attributes[attr].value;
		e.setAttribute("_orig_" + attr, val);
	}
	function orig_load(e, attr) {
		if (e.attributes["_orig_"+attr] == undefined) return;
		e.attributes[attr].value = e.attributes["_orig_" + attr].value;
		e.removeAttribute("_orig_"+attr);
	}
	function g_to_text(e) {
		var text = find_child(e, "title").firstChild.nodeValue;
		return (text)
	}
	function g_to_func(e) {
		var func = g_to_text(e);
		// if there's any manipulation we want to do to the function
		// name before it's searched, do it here before returning.
		return (func);
	}
	function update_text(e) {
		var r = find_child(e, "rect");
		var t = find_child(e, "text");
		var w = parseFloat(r.attributes.width.value) -3;
		var txt = find_child(e, "title").textContent.replace(/\([^(]*\)$/,"");
		t.attributes.x.value = parseFloat(r.attributes.x.value) + 3;

		// Smaller than this size won't fit anything
		if (w < 2 * 12 * 0.59) {
			t.textContent = "";
			return;
		}

		t.textContent = txt;
		var sl = t.getSubStringLength(0, txt.length);
		// check if only whitespace or if we can fit the entire string into width w
		if (/^ *$/.test(txt) || sl < w)
			return;

		// this isn't perfect, but gives a good starting point
		// and avoids calling getSubStringLength too often
		var start = Math.floor((w/sl) * txt.length);
		for (var x = start; x > 0; x = x-2) {
			if (t.getSubStringLength(0, x + 2) <= w) {
				t.textContent = txt.substring(0, x) + "..";
				return;
			}
		}
		t.textContent = "";
	}

	// zoom
	function zoom_reset(e) {
		if (e.attributes != undefined) {
			orig_load(e, "x");
			orig_load(e, "width");
		}
		if (e.childNodes == undefined) return;
		for (var i = 0, c = e.childNodes; i < c.length; i++) {
			zoom_reset(c[i]);
		}
	}
	function zoom_child(e, x, ratio) {
		if (e.attributes != undefined) {
			if (e.attributes.x != undefined) {
				orig_save(e, "x");
				e.attributes.x.value = (parseFloat(e.attributes.x.value) - x - 10) * ratio + 10;
				if (e.tagName == "text")
					e.attributes.x.value = find_child(e.parentNode, "rect[x]").attributes.x.value + 3;
			}
			if (e.attributes.width != undefined) {
				orig_save(e, "width");
				e.attributes.width.value = parseFloat(e.attributes.width.value) * ratio;
			}
		}

		if (e.childNodes == undefined) return;
		for (var i = 0, c = e.childNodes; i < c.length; i++) {
			zoom_child(c[i], x - 10, ratio);
		}
	}
	function zoom_parent(e) {
		if (e.attributes) {
			if (e.attributes.x != undefined) {
				orig_save(e, "x");
				e.attributes.x.value = 10;
			}
			if (e.attributes.width != undefined) {
				orig_save(e, "width");
				e.attributes.width.value = parseInt(svg.width.baseVal.value) - (10 * 2);
			}
		}
		if (e.childNodes == undefined) return;
		for (var i = 0, c = e.childNodes; i < c.length; i++) {
			zoom_parent(c[i]);
		}
	}
	function zoom(node) {
		var attr = find_child(node, "rect").attributes;
		var width = parseFloat(attr.width.value);
		var xmin = parseFloat(attr.x.value);
		var xmax = parseFloat(xmin + width);
		var ymin = parseFloat(attr.y.value);
		var ratio = (svg.width.baseVal.value - 2 * 10) / width;

		// XXX: Workaround for JavaScript float issues (fix me)
		var fudge = 0.0001;

		unzoombtn.classList.remove("hide");

		var el = document.getElementById("frames").children;
		for (var i = 0; i < el.length; i++) {
			var e = el[i];
			var a = find_child(e, "rect").attributes;
			var ex = parseFloat(a.x.value);
			var ew = parseFloat(a.width.value);
			var upstack;
			// Is it an ancestor
			if (0 == 0) {
				upstack = parseFloat(a.y.value) > ymin;
			} else {
				upstack = parseFloat(a.y.value) < ymin;
			}
			if (upstack) {
				// Direct ancestor
				if (ex <= xmin && (ex+ew+fudge) >= xmax) {
					e.classList.add("parent");
					zoom_parent(e);
					update_text(e);
				}
				// not in current path
				else
					e.classList.add("hide");
			}
			// Children maybe
			else {
				// no common path
				if (ex < xmin || ex + fudge >= xmax) {
					e.classList.add("hide");
				}
				else {
					zoom_child(e, xmin, ratio);
					update_text(e);
				}
			}
		}
		search();
	}
	function unzoom(dont_update_text) {
		unzoombtn.classList.add("hide");
		var el = document.getElementById("frames").children;
		for(var i = 0; i < el.length; i++) {
			el[i].classList.remove("parent");
			el[i].classList.remove("hide");
			zoom_reset(el[i]);
			if(!dont_update_text) update_text(el[i]);
		}
		search();
	}
	function clearzoom() {
		unzoom();

		// remove zoom state
		var params = get_params();
		if (params.x) delete params.x;
		if (params.y) delete params.y;
		history.replaceState(null, null, parse_params(params));
	}

	// search
	function toggle_ignorecase() {
		ignorecase = !ignorecase;
		if (ignorecase) {
			ignorecaseBtn.classList.add("show");
		} else {
			ignorecaseBtn.classList.remove("show");
		}
		reset_search();
		search();
	}
	function reset_search() {
		var el = document.querySelectorAll("#frames rect");
		for (var i = 0; i < el.length; i++) {
			orig_load(el[i], "fill")
		}
		var params = get_params();
		delete params.s;
		history.replaceState(null, null, parse_params(params));
	}
	function search_prompt() {
		if (!searching) {
			var term = prompt("Enter a search term (regexp " +
			    "allowed, eg: ^ext4_)"
			    + (ignorecase ? ", ignoring case" : "")
			    + "\nPress Ctrl-i to toggle case sensitivity", "");
			if (term != null) search(term);
		} else {
			reset_search();
			searching = 0;
			currentSearchTerm = null;
			searchbtn.classList.remove("show");
			searchbtn.firstChild.nodeValue = "Search"
			matchedtxt.classList.add("hide");
			matchedtxt.firstChild.nodeValue = ""
		}
	}
	function search(term) {
		if (term) currentSearchTerm = term;
		if (currentSearchTerm === null) return;

		var re = new RegExp(currentSearchTerm, ignorecase ? 'i' : '');
		var el = document.getElementById("frames").children;
		var matches = new Object();
		var maxwidth = 0;
		for (var i = 0; i < el.length; i++) {
			var e = el[i];
			var func = g_to_func(e);
			var rect = find_child(e, "rect");
			if (func == null || rect == null)
				continue;

			// Save max width. Only works as we have a root frame
			var w = parseFloat(rect.attributes.width.value);
			if (w > maxwidth)
				maxwidth = w;

			if (func.match(re)) {
				// highlight
				var x = parseFloat(rect.attributes.x.value);
				orig_save(rect, "fill");
				rect.attributes.fill.value = "rgb(230,0,230)";

				// remember matches
				if (matches[x] == undefined) {
					matches[x] = w;
				} else {
					if (w > matches[x]) {
						// overwrite with parent
						matches[x] = w;
					}
				}
				searching = 1;
			}
		}
		if (!searching)
			return;
		var params = get_params();
		params.s = currentSearchTerm;
		history.replaceState(null, null, parse_params(params));

		searchbtn.classList.add("show");
		searchbtn.firstChild.nodeValue = "Reset Search";

		// calculate percent matched, excluding vertical overlap
		var count = 0;
		var lastx = -1;
		var lastw = 0;
		var keys = Array();
		for (k in matches) {
			if (matches.hasOwnProperty(k))
				keys.push(k);
		}
		// sort the matched frames by their x location
		// ascending, then width descending
		keys.sort(function(a, b){
			return a - b;
		});
		// Step through frames saving only the biggest bottom-up frames
		// thanks to the sort order. This relies on the tree property
		// where children are always smaller than their parents.
		var fudge = 0.0001;	// JavaScript floating point
		for (var k in keys) {
			var x = parseFloat(keys[k]);
			var w = matches[keys[k]];
			if (x >= lastx + lastw - fudge) {
				count += w;
				lastx = x;
				lastw = w;
			}
		}
		// display matched percent
		matchedtxt.classList.remove("hide");
		var pct = 100 * count / maxwidth;
		if (pct != 100) pct = pct.toFixed(1)
		matchedtxt.firstChild.nodeValue = "Matched: " + pct + "%";
	}
]]>
</script>
<rect x="0.0" y="0" width="1200.0" height="2134.0" fill="url(#background)"  />
<text id="title" x="600.00" y="24" >Flame Graph</text>
<text id="details" x="10.00" y="2117" > </text>
<text id="unzoom" x="10.00" y="24" class="hide">Reset Zoom</text>
<text id="search" x="1090.00" y="24" >Search</text>
<text id="ignorecase" x="1174.00" y="24" >ic</text>
<text id="matched" x="1090.00" y="2117" > </text>
<g id="frames">
<g >
<title>down_read_trylock (1,086,031,724 samples, 1.28%)</title><rect x="564.9" y="1909" width="15.1" height="15.0" fill="rgb(219,66,15)" rx="2" ry="2" />
<text  x="567.93" y="1919.5" ></text>
</g>
<g >
<title>syscall_return_via_sysret (13,814,392 samples, 0.02%)</title><rect x="1189.8" y="2037" width="0.2" height="15.0" fill="rgb(229,113,27)" rx="2" ry="2" />
<text  x="1192.81" y="2047.5" ></text>
</g>
<g >
<title>_raw_spin_unlock_irqrestore (131,250,844 samples, 0.15%)</title><rect x="987.8" y="1781" width="1.8" height="15.0" fill="rgb(228,106,25)" rx="2" ry="2" />
<text  x="990.77" y="1791.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1477" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1487.5" >[..</text>
</g>
<g >
<title>blk_mq_complete_request_remote (306,201,175 samples, 0.36%)</title><rect x="316.3" y="1893" width="4.2" height="15.0" fill="rgb(235,140,33)" rx="2" ry="2" />
<text  x="319.29" y="1903.5" ></text>
</g>
<g >
<title>blk_add_timer (399,107,317 samples, 0.47%)</title><rect x="460.6" y="1861" width="5.5" height="15.0" fill="rgb(224,91,21)" rx="2" ry="2" />
<text  x="463.59" y="1871.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1221" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1231.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1013" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1023.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="373" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="383.5" >[..</text>
</g>
<g >
<title>percpu_counter_add_batch (970,176,177 samples, 1.14%)</title><rect x="823.5" y="1829" width="13.5" height="15.0" fill="rgb(241,166,39)" rx="2" ry="2" />
<text  x="826.53" y="1839.5" ></text>
</g>
<g >
<title>__rq_qos_done (413,697,486 samples, 0.49%)</title><rect x="204.6" y="1941" width="5.7" height="15.0" fill="rgb(226,98,23)" rx="2" ry="2" />
<text  x="207.56" y="1951.5" ></text>
</g>
<g >
<title>blk_integrity_merge_bio (166,564,100 samples, 0.20%)</title><rect x="1052.0" y="1781" width="2.3" height="15.0" fill="rgb(209,20,5)" rx="2" ry="2" />
<text  x="1054.97" y="1791.5" ></text>
</g>
<g >
<title>__rq_qos_throttle (947,071,517 samples, 1.12%)</title><rect x="1003.2" y="1829" width="13.1" height="15.0" fill="rgb(229,110,26)" rx="2" ry="2" />
<text  x="1006.15" y="1839.5" ></text>
</g>
<g >
<title>__list_add_valid_or_report (287,063,475 samples, 0.34%)</title><rect x="515.7" y="1957" width="4.0" height="15.0" fill="rgb(215,46,11)" rx="2" ry="2" />
<text  x="518.69" y="1967.5" ></text>
</g>
<g >
<title>_raw_spin_lock (62,161,660 samples, 0.07%)</title><rect x="441.4" y="1877" width="0.8" height="15.0" fill="rgb(239,160,38)" rx="2" ry="2" />
<text  x="444.36" y="1887.5" ></text>
</g>
<g >
<title>submit_bio (264,793,157 samples, 0.31%)</title><rect x="861.6" y="1877" width="3.7" height="15.0" fill="rgb(207,13,3)" rx="2" ry="2" />
<text  x="864.62" y="1887.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1989" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1999.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="965" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="975.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1861" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1871.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1557" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1567.5" >[..</text>
</g>
<g >
<title>dma_unmap_phys (735,258,468 samples, 0.87%)</title><rect x="82.4" y="1941" width="10.2" height="15.0" fill="rgb(218,64,15)" rx="2" ry="2" />
<text  x="85.42" y="1951.5" ></text>
</g>
<g >
<title>io_iopoll_check (19,653,838,624 samples, 23.15%)</title><rect x="47.3" y="1989" width="273.3" height="15.0" fill="rgb(215,46,11)" rx="2" ry="2" />
<text  x="50.34" y="1999.5" >io_iopoll_check</text>
</g>
<g >
<title>barn_replace_empty_sheaf (78,294,487 samples, 0.09%)</title><rect x="378.7" y="1909" width="1.1" height="15.0" fill="rgb(223,84,20)" rx="2" ry="2" />
<text  x="381.69" y="1919.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1701" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1711.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="693" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="703.5" >[..</text>
</g>
<g >
<title>blk_account_io_completion.part.67 (426,117,370 samples, 0.50%)</title><rect x="225.6" y="1941" width="5.9" height="15.0" fill="rgb(242,173,41)" rx="2" ry="2" />
<text  x="228.55" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1349" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1359.5" >[..</text>
</g>
<g >
<title>submitter_uring_fn (83,133,984,839 samples, 97.94%)</title><rect x="34.3" y="2053" width="1155.7" height="15.0" fill="rgb(218,61,14)" rx="2" ry="2" />
<text  x="37.31" y="2063.5" >submitter_uring_fn</text>
</g>
<g >
<title>__pfx_nvme_put_ns_head (68,310,719 samples, 0.08%)</title><rect x="440.4" y="1877" width="1.0" height="15.0" fill="rgb(215,47,11)" rx="2" ry="2" />
<text  x="443.41" y="1887.5" ></text>
</g>
<g >
<title>entry_SYSCALL_64 (110,387,544 samples, 0.13%)</title><rect x="43.6" y="2037" width="1.5" height="15.0" fill="rgb(239,156,37)" rx="2" ry="2" />
<text  x="46.57" y="2047.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1957" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1967.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1413" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1423.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="501" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="511.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="885" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="895.5" >[..</text>
</g>
<g >
<title>_find_first_zero_bit (96,705,618 samples, 0.11%)</title><rect x="976.7" y="1781" width="1.3" height="15.0" fill="rgb(244,181,43)" rx="2" ry="2" />
<text  x="979.67" y="1791.5" ></text>
</g>
<g >
<title>__io_read (43,238,183,094 samples, 50.94%)</title><rect x="535.3" y="1941" width="601.1" height="15.0" fill="rgb(215,49,11)" rx="2" ry="2" />
<text  x="538.34" y="1951.5" >__io_read</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="149" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="159.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="165" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="175.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="741" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="751.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1653" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1663.5" >[..</text>
</g>
<g >
<title>update_io_ticks (379,194,202 samples, 0.45%)</title><rect x="1070.0" y="1829" width="5.3" height="15.0" fill="rgb(235,141,33)" rx="2" ry="2" />
<text  x="1072.99" y="1839.5" ></text>
</g>
<g >
<title>__rcu_read_unlock (9,209,031 samples, 0.01%)</title><rect x="1003.0" y="1829" width="0.2" height="15.0" fill="rgb(253,224,53)" rx="2" ry="2" />
<text  x="1006.03" y="1839.5" ></text>
</g>
<g >
<title>[button.ko] (1,899,533,424 samples, 2.24%)</title><rect x="294.1" y="1909" width="26.4" height="15.0" fill="rgb(254,226,54)" rx="2" ry="2" />
<text  x="297.14" y="1919.5" >[..</text>
</g>
<g >
<title>__kmalloc_noprof (921,024,731 samples, 1.09%)</title><rect x="367.0" y="1941" width="12.8" height="15.0" fill="rgb(235,138,33)" rx="2" ry="2" />
<text  x="369.98" y="1951.5" ></text>
</g>
<g >
<title>update_io_ticks (386,767,936 samples, 0.46%)</title><rect x="277.5" y="1941" width="5.4" height="15.0" fill="rgb(235,141,33)" rx="2" ry="2" />
<text  x="280.52" y="1951.5" ></text>
</g>
<g >
<title>io_uring (84,882,428,926 samples, 100.00%)</title><rect x="10.0" y="2069" width="1180.0" height="15.0" fill="rgb(208,13,3)" rx="2" ry="2" />
<text  x="13.00" y="2079.5" >io_uring</text>
</g>
<g >
<title>__rcu_read_unlock (70,609,372 samples, 0.08%)</title><rect x="492.3" y="1909" width="1.0" height="15.0" fill="rgb(253,224,53)" rx="2" ry="2" />
<text  x="495.32" y="1919.5" ></text>
</g>
<g >
<title>io_init_rw_fixed (2,129,398,368 samples, 2.51%)</title><rect x="1139.9" y="1941" width="29.6" height="15.0" fill="rgb(244,182,43)" rx="2" ry="2" />
<text  x="1142.89" y="1951.5" >io..</text>
</g>
<g >
<title>blk_mq_submit_bio (12,559,969,245 samples, 14.80%)</title><rect x="900.7" y="1845" width="174.6" height="15.0" fill="rgb(224,89,21)" rx="2" ry="2" />
<text  x="903.66" y="1855.5" >blk_mq_submit_bio</text>
</g>
<g >
<title>_raw_spin_lock_irqsave (41,456,984 samples, 0.05%)</title><rect x="379.1" y="1893" width="0.6" height="15.0" fill="rgb(247,195,46)" rx="2" ry="2" />
<text  x="382.13" y="1903.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="117" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="127.5" >[..</text>
</g>
<g >
<title>_raw_read_unlock (1,327,736,488 samples, 1.56%)</title><rect x="805.0" y="1829" width="18.5" height="15.0" fill="rgb(217,57,13)" rx="2" ry="2" />
<text  x="808.04" y="1839.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="2005" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="2015.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="213" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="223.5" >[..</text>
</g>
<g >
<title>blk_mq_dispatch_queue_requests (7,811,721,024 samples, 9.20%)</title><rect x="384.7" y="1925" width="108.6" height="15.0" fill="rgb(216,50,12)" rx="2" ry="2" />
<text  x="387.71" y="1935.5" >blk_mq_dispat..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1813" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1823.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="949" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="959.5" >[..</text>
</g>
<g >
<title>bio_iov_iter_get_pages (1,412,137,178 samples, 1.66%)</title><rect x="666.2" y="1877" width="19.7" height="15.0" fill="rgb(228,107,25)" rx="2" ry="2" />
<text  x="669.23" y="1887.5" ></text>
</g>
<g >
<title>mutex_unlock (1,327,562,319 samples, 1.56%)</title><rect x="1170.7" y="1989" width="18.5" height="15.0" fill="rgb(251,212,50)" rx="2" ry="2" />
<text  x="1173.74" y="1999.5" ></text>
</g>
<g >
<title>nvme_host_path_error (41,451,780 samples, 0.05%)</title><rect x="482.6" y="1877" width="0.6" height="15.0" fill="rgb(211,31,7)" rx="2" ry="2" />
<text  x="485.63" y="1887.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1301" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1311.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="613" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="623.5" >[..</text>
</g>
<g >
<title>blk_mq_rq_ctx_init.isra.60 (959,403,093 samples, 1.13%)</title><rect x="989.6" y="1813" width="13.3" height="15.0" fill="rgb(218,61,14)" rx="2" ry="2" />
<text  x="992.59" y="1823.5" ></text>
</g>
<g >
<title>ext4_set_iomap (1,574,930,047 samples, 1.86%)</title><rect x="837.0" y="1861" width="21.9" height="15.0" fill="rgb(229,110,26)" rx="2" ry="2" />
<text  x="840.01" y="1871.5" >e..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="69" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="79.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="549" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="559.5" >[..</text>
</g>
<g >
<title>__list_del_entry_valid_or_report (11,513,407 samples, 0.01%)</title><rect x="379.0" y="1893" width="0.1" height="15.0" fill="rgb(243,176,42)" rx="2" ry="2" />
<text  x="381.97" y="1903.5" ></text>
</g>
<g >
<title>blk_attempt_plug_merge (1,528,133,355 samples, 1.80%)</title><rect x="1036.6" y="1829" width="21.3" height="15.0" fill="rgb(242,173,41)" rx="2" ry="2" />
<text  x="1039.65" y="1839.5" >b..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1061" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1071.5" >[..</text>
</g>
<g >
<title>_raw_spin_lock (134,318,478 samples, 0.16%)</title><rect x="314.4" y="1893" width="1.9" height="15.0" fill="rgb(239,160,38)" rx="2" ry="2" />
<text  x="317.41" y="1903.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1173" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1183.5" >[..</text>
</g>
<g >
<title>__submit_bio (13,244,583,068 samples, 15.60%)</title><rect x="891.1" y="1861" width="184.2" height="15.0" fill="rgb(230,117,28)" rx="2" ry="2" />
<text  x="894.14" y="1871.5" >__submit_bio</text>
</g>
<g >
<title>io_issue_sqe (48,630,353,536 samples, 57.29%)</title><rect x="493.5" y="1973" width="676.0" height="15.0" fill="rgb(243,175,42)" rx="2" ry="2" />
<text  x="496.46" y="1983.5" >io_issue_sqe</text>
</g>
<g >
<title>iocb_bio_iopoll (1,936,371,021 samples, 2.28%)</title><rect x="293.6" y="1957" width="27.0" height="15.0" fill="rgb(208,16,3)" rx="2" ry="2" />
<text  x="296.64" y="1967.5" >i..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1733" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1743.5" >[..</text>
</g>
<g >
<title>entry_SYSCALL_64_after_hwframe (82,311,064,292 samples, 96.97%)</title><rect x="45.1" y="2037" width="1144.3" height="15.0" fill="rgb(218,63,15)" rx="2" ry="2" />
<text  x="48.11" y="2047.5" >entry_SYSCALL_64_after_hwframe</text>
</g>
<g >
<title>io_cqe_cache_refill (9,978,211 samples, 0.01%)</title><rect x="132.1" y="1941" width="0.1" height="15.0" fill="rgb(253,224,53)" rx="2" ry="2" />
<text  x="135.05" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="85" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="95.5" >[..</text>
</g>
<g >
<title>mempool_free (59,817,225 samples, 0.07%)</title><rect x="257.9" y="1941" width="0.9" height="15.0" fill="rgb(233,131,31)" rx="2" ry="2" />
<text  x="260.93" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1669" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1679.5" >[..</text>
</g>
<g >
<title>bio_alloc_bioset (1,503,517,015 samples, 1.77%)</title><rect x="645.3" y="1877" width="20.9" height="15.0" fill="rgb(206,5,1)" rx="2" ry="2" />
<text  x="648.33" y="1887.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="981" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="991.5" >[..</text>
</g>
<g >
<title>__io_commit_cqring_flush (7,676,194 samples, 0.01%)</title><rect x="131.9" y="1941" width="0.2" height="15.0" fill="rgb(220,69,16)" rx="2" ry="2" />
<text  x="134.95" y="1951.5" ></text>
</g>
<g >
<title>kfree (935,431,274 samples, 1.10%)</title><rect x="132.2" y="1941" width="13.0" height="15.0" fill="rgb(222,78,18)" rx="2" ry="2" />
<text  x="135.19" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1381" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1391.5" >[..</text>
</g>
<g >
<title>__rcu_read_lock (102,074,912 samples, 0.12%)</title><rect x="238.7" y="1925" width="1.4" height="15.0" fill="rgb(220,69,16)" rx="2" ry="2" />
<text  x="241.69" y="1935.5" ></text>
</g>
<g >
<title>all (84,882,428,926 samples, 100%)</title><rect x="10.0" y="2085" width="1180.0" height="15.0" fill="rgb(213,39,9)" rx="2" ry="2" />
<text  x="13.00" y="2095.5" ></text>
</g>
<g >
<title>__check_block_validity.constprop.90 (607,915,080 samples, 0.72%)</title><rect x="728.0" y="1845" width="8.5" height="15.0" fill="rgb(233,129,30)" rx="2" ry="2" />
<text  x="731.05" y="1855.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="453" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="463.5" >[..</text>
</g>
<g >
<title>iomap_dio_fast_read_end_io (1,262,482,885 samples, 1.49%)</title><rect x="240.1" y="1941" width="17.6" height="15.0" fill="rgb(210,25,6)" rx="2" ry="2" />
<text  x="243.11" y="1951.5" ></text>
</g>
<g >
<title>__io_prep_rw (3,099,274,989 samples, 3.65%)</title><rect x="341.0" y="1973" width="43.1" height="15.0" fill="rgb(222,80,19)" rx="2" ry="2" />
<text  x="344.00" y="1983.5" >__io..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="533" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="543.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1605" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1615.5" >[..</text>
</g>
<g >
<title>__rcu_read_lock (17,653,578 samples, 0.02%)</title><rect x="968.3" y="1813" width="0.2" height="15.0" fill="rgb(220,69,16)" rx="2" ry="2" />
<text  x="971.27" y="1823.5" ></text>
</g>
<g >
<title>_raw_spin_unlock_irqrestore (7,676,572 samples, 0.01%)</title><rect x="145.1" y="1893" width="0.1" height="15.0" fill="rgb(228,106,25)" rx="2" ry="2" />
<text  x="148.07" y="1903.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1189" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1199.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="917" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="927.5" >[..</text>
</g>
<g >
<title>blk_mq_start_request (1,718,478,156 samples, 2.02%)</title><rect x="442.2" y="1877" width="23.9" height="15.0" fill="rgb(242,172,41)" rx="2" ry="2" />
<text  x="445.25" y="1887.5" >b..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1253" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1263.5" >[..</text>
</g>
<g >
<title>__blk_flush_plug (7,848,559,346 samples, 9.25%)</title><rect x="384.2" y="1957" width="109.1" height="15.0" fill="rgb(217,57,13)" rx="2" ry="2" />
<text  x="387.20" y="1967.5" >__blk_flush_p..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="837" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="847.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1829" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1839.5" >[..</text>
</g>
<g >
<title>dma_unmap_page_attrs (74,444,956 samples, 0.09%)</title><rect x="81.4" y="1941" width="1.0" height="15.0" fill="rgb(252,218,52)" rx="2" ry="2" />
<text  x="84.38" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="661" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="671.5" >[..</text>
</g>
<g >
<title>ext4_should_use_dio.isra.16 (1,087,598,013 samples, 1.28%)</title><rect x="580.0" y="1909" width="15.2" height="15.0" fill="rgb(242,170,40)" rx="2" ry="2" />
<text  x="583.03" y="1919.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1941" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1951.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1893" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1903.5" >[..</text>
</g>
<g >
<title>io_do_iopoll (19,639,258,475 samples, 23.14%)</title><rect x="47.5" y="1973" width="273.1" height="15.0" fill="rgb(246,191,45)" rx="2" ry="2" />
<text  x="50.54" y="1983.5" >io_do_iopoll</text>
</g>
<g >
<title>blk_attempt_bio_merge (1,248,763,709 samples, 1.47%)</title><rect x="1040.5" y="1813" width="17.4" height="15.0" fill="rgb(206,7,1)" rx="2" ry="2" />
<text  x="1043.53" y="1823.5" ></text>
</g>
<g >
<title>io_prep_read_fixed (41,445,502 samples, 0.05%)</title><rect x="1169.5" y="1973" width="0.6" height="15.0" fill="rgb(218,64,15)" rx="2" ry="2" />
<text  x="1172.50" y="1983.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1589" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1599.5" >[..</text>
</g>
<g >
<title>io_submit_sqes (61,109,399,470 samples, 71.99%)</title><rect x="320.6" y="1989" width="849.5" height="15.0" fill="rgb(209,18,4)" rx="2" ry="2" />
<text  x="323.56" y="1999.5" >io_submit_sqes</text>
</g>
<g >
<title>[button.ko] (1,988,576,896 samples, 2.34%)</title><rect x="70.6" y="1957" width="27.7" height="15.0" fill="rgb(254,226,54)" rx="2" ry="2" />
<text  x="73.61" y="1967.5" >[..</text>
</g>
<g >
<title>nvme_open (69,067,257 samples, 0.08%)</title><rect x="97.3" y="1941" width="1.0" height="15.0" fill="rgb(216,54,13)" rx="2" ry="2" />
<text  x="100.29" y="1951.5" ></text>
</g>
<g >
<title>__list_del_entry_valid_or_report (13,048,018 samples, 0.02%)</title><rect x="144.5" y="1893" width="0.1" height="15.0" fill="rgb(243,176,42)" rx="2" ry="2" />
<text  x="147.46" y="1903.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1621" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1631.5" >[..</text>
</g>
<g >
<title>iomap_dio_fast_read_async.isra.31 (33,797,318,932 samples, 39.82%)</title><rect x="605.4" y="1893" width="469.9" height="15.0" fill="rgb(252,220,52)" rx="2" ry="2" />
<text  x="608.42" y="1903.5" >iomap_dio_fast_read_async.isra.31</text>
</g>
<g >
<title>iov_iter_bvec (244,083,872 samples, 0.29%)</title><rect x="1166.1" y="1909" width="3.4" height="15.0" fill="rgb(224,90,21)" rx="2" ry="2" />
<text  x="1169.10" y="1919.5" ></text>
</g>
<g >
<title>__rq_qos_track (522,698,043 samples, 0.62%)</title><rect x="1016.3" y="1829" width="7.3" height="15.0" fill="rgb(209,20,4)" rx="2" ry="2" />
<text  x="1019.32" y="1839.5" ></text>
</g>
<g >
<title>[button.ko] (7,317,436,834 samples, 8.62%)</title><rect x="390.5" y="1893" width="101.7" height="15.0" fill="rgb(254,226,54)" rx="2" ry="2" />
<text  x="393.47" y="1903.5" >[button.ko]</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="581" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="591.5" >[..</text>
</g>
<g >
<title>ktime_get (143,533,439 samples, 0.17%)</title><rect x="1068.0" y="1829" width="2.0" height="15.0" fill="rgb(207,10,2)" rx="2" ry="2" />
<text  x="1070.99" y="1839.5" ></text>
</g>
<g >
<title>kiocb_write_and_wait (194,961,252 samples, 0.23%)</title><rect x="858.9" y="1877" width="2.7" height="15.0" fill="rgb(221,77,18)" rx="2" ry="2" />
<text  x="861.91" y="1887.5" ></text>
</g>
<g >
<title>io_import_reg_buf (1,673,480,297 samples, 1.97%)</title><rect x="1146.2" y="1925" width="23.3" height="15.0" fill="rgb(216,52,12)" rx="2" ry="2" />
<text  x="1149.23" y="1935.5" >i..</text>
</g>
<g >
<title>memset (309,331,995 samples, 0.36%)</title><rect x="379.8" y="1941" width="4.3" height="15.0" fill="rgb(208,14,3)" rx="2" ry="2" />
<text  x="382.78" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1029" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1039.5" >[..</text>
</g>
<g >
<title>__io_submit_flush_completions (3,376,872,303 samples, 3.98%)</title><rect x="98.3" y="1957" width="46.9" height="15.0" fill="rgb(226,99,23)" rx="2" ry="2" />
<text  x="101.25" y="1967.5" >__io..</text>
</g>
<g >
<title>blk_start_plug_nr_ios (10,746,150 samples, 0.01%)</title><rect x="493.3" y="1973" width="0.2" height="15.0" fill="rgb(254,228,54)" rx="2" ry="2" />
<text  x="496.31" y="1983.5" ></text>
</g>
<g >
<title>bio_integrity_prep (346,918,654 samples, 0.41%)</title><rect x="1023.6" y="1829" width="4.8" height="15.0" fill="rgb(220,69,16)" rx="2" ry="2" />
<text  x="1026.59" y="1839.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1093" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1103.5" >[..</text>
</g>
<g >
<title>blk_add_rq_to_plug (592,554,943 samples, 0.70%)</title><rect x="1028.4" y="1829" width="8.2" height="15.0" fill="rgb(243,175,41)" rx="2" ry="2" />
<text  x="1031.41" y="1839.5" ></text>
</g>
<g >
<title>io_read_fixed (2,379,637,248 samples, 2.80%)</title><rect x="1136.4" y="1957" width="33.1" height="15.0" fill="rgb(218,62,14)" rx="2" ry="2" />
<text  x="1139.42" y="1967.5" >io..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1141" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1151.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="101" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="111.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1333" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1343.5" >[..</text>
</g>
<g >
<title>entry_SYSCALL_64_safe_stack (24,549,420 samples, 0.03%)</title><rect x="1189.4" y="2037" width="0.3" height="15.0" fill="rgb(231,120,28)" rx="2" ry="2" />
<text  x="1192.36" y="2047.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="773" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="783.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="2021" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="2031.5" >[..</text>
</g>
<g >
<title>wb_timestamp (98,242,481 samples, 0.12%)</title><rect x="1015.0" y="1797" width="1.3" height="15.0" fill="rgb(217,56,13)" rx="2" ry="2" />
<text  x="1017.95" y="1807.5" ></text>
</g>
<g >
<title>iov_iter_advance (711,360,564 samples, 0.84%)</title><rect x="676.0" y="1861" width="9.9" height="15.0" fill="rgb(248,197,47)" rx="2" ry="2" />
<text  x="678.97" y="1871.5" ></text>
</g>
<g >
<title>blk_mq_sched_bio_merge (726,904,602 samples, 0.86%)</title><rect x="1057.9" y="1829" width="10.1" height="15.0" fill="rgb(210,26,6)" rx="2" ry="2" />
<text  x="1060.89" y="1839.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1525" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1535.5" >[..</text>
</g>
<g >
<title>__list_del_entry_valid_or_report (548,494,004 samples, 0.65%)</title><rect x="145.2" y="1957" width="7.6" height="15.0" fill="rgb(243,176,42)" rx="2" ry="2" />
<text  x="148.19" y="1967.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1781" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1791.5" >[..</text>
</g>
<g >
<title>[button.ko] (348,418,634 samples, 0.41%)</title><rect x="75.6" y="1941" width="4.9" height="15.0" fill="rgb(254,226,54)" rx="2" ry="2" />
<text  x="78.61" y="1951.5" ></text>
</g>
<g >
<title>wbt_wait (682,246,972 samples, 0.80%)</title><rect x="1006.8" y="1813" width="9.5" height="15.0" fill="rgb(225,95,22)" rx="2" ry="2" />
<text  x="1009.83" y="1823.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="293" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="303.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="709" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="719.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="517" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="527.5" >[..</text>
</g>
<g >
<title>bio_to_wbt_flags (144,280,811 samples, 0.17%)</title><rect x="1012.9" y="1797" width="2.1" height="15.0" fill="rgb(235,138,33)" rx="2" ry="2" />
<text  x="1015.95" y="1807.5" ></text>
</g>
<g >
<title>blk_rq_merge_ok (655,450,965 samples, 0.77%)</title><rect x="1045.2" y="1797" width="9.1" height="15.0" fill="rgb(215,46,11)" rx="2" ry="2" />
<text  x="1048.17" y="1807.5" ></text>
</g>
<g >
<title>__rcu_read_unlock (339,999,534 samples, 0.40%)</title><rect x="199.8" y="1941" width="4.8" height="15.0" fill="rgb(253,224,53)" rx="2" ry="2" />
<text  x="202.83" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1685" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1695.5" >[..</text>
</g>
<g >
<title>blk_try_merge (259,440,628 samples, 0.31%)</title><rect x="1054.3" y="1797" width="3.6" height="15.0" fill="rgb(235,142,34)" rx="2" ry="2" />
<text  x="1057.28" y="1807.5" ></text>
</g>
<g >
<title>wbt_track (271,706,739 samples, 0.32%)</title><rect x="1019.8" y="1813" width="3.8" height="15.0" fill="rgb(205,2,0)" rx="2" ry="2" />
<text  x="1022.81" y="1823.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1909" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1919.5" >[..</text>
</g>
<g >
<title>io_complete_rw_iopoll (145,835,515 samples, 0.17%)</title><rect x="255.6" y="1925" width="2.1" height="15.0" fill="rgb(254,228,54)" rx="2" ry="2" />
<text  x="258.63" y="1935.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1125" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1135.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1973" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1983.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="853" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="863.5" >[..</text>
</g>
<g >
<title>dma_map_page_attrs (141,225,547 samples, 0.17%)</title><rect x="466.1" y="1877" width="2.0" height="15.0" fill="rgb(218,64,15)" rx="2" ry="2" />
<text  x="469.14" y="1887.5" ></text>
</g>
<g >
<title>ext4_es_lookup_extent (7,229,054,379 samples, 8.52%)</title><rect x="736.5" y="1845" width="100.5" height="15.0" fill="rgb(222,80,19)" rx="2" ry="2" />
<text  x="739.52" y="1855.5" >ext4_es_look..</text>
</g>
<g >
<title>blk_mq_get_tags (1,495,173,924 samples, 1.76%)</title><rect x="968.8" y="1813" width="20.8" height="15.0" fill="rgb(215,46,11)" rx="2" ry="2" />
<text  x="971.81" y="1823.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="597" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="607.5" >[..</text>
</g>
<g >
<title>io_rw_recycle (384,517,706 samples, 0.45%)</title><rect x="286.9" y="1941" width="5.4" height="15.0" fill="rgb(235,142,34)" rx="2" ry="2" />
<text  x="289.94" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1269" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1279.5" >[..</text>
</g>
<g >
<title>__x64_sys_io_uring_enter (82,228,173,167 samples, 96.87%)</title><rect x="46.1" y="2005" width="1143.1" height="15.0" fill="rgb(210,27,6)" rx="2" ry="2" />
<text  x="49.10" y="2015.5" >__x64_sys_io_uring_enter</text>
</g>
<g >
<title>bdev_count_inflight (73,703,310 samples, 0.09%)</title><rect x="1074.2" y="1813" width="1.1" height="15.0" fill="rgb(209,22,5)" rx="2" ry="2" />
<text  x="1077.24" y="1823.5" ></text>
</g>
<g >
<title>__pfx_nvme_open (66,768,433 samples, 0.08%)</title><rect x="80.5" y="1941" width="0.9" height="15.0" fill="rgb(218,60,14)" rx="2" ry="2" />
<text  x="83.45" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="181" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="191.5" >[..</text>
</g>
<g >
<title>io_cache_alloc_new (1,369,268,857 samples, 1.61%)</title><rect x="365.0" y="1957" width="19.1" height="15.0" fill="rgb(236,146,35)" rx="2" ry="2" />
<text  x="368.05" y="1967.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="805" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="815.5" >[..</text>
</g>
<g >
<title>ext4_map_blocks (9,425,724,827 samples, 11.10%)</title><rect x="706.0" y="1861" width="131.0" height="15.0" fill="rgb(247,196,46)" rx="2" ry="2" />
<text  x="708.98" y="1871.5" >ext4_map_blocks</text>
</g>
<g >
<title>blk_finish_plug (7,857,001,237 samples, 9.26%)</title><rect x="384.1" y="1973" width="109.2" height="15.0" fill="rgb(231,119,28)" rx="2" ry="2" />
<text  x="387.08" y="1983.5" >blk_finish_plug</text>
</g>
<g >
<title>nvme_put_ns_head (61,394,810 samples, 0.07%)</title><rect x="484.8" y="1877" width="0.9" height="15.0" fill="rgb(214,41,9)" rx="2" ry="2" />
<text  x="487.85" y="1887.5" ></text>
</g>
<g >
<title>iomap_dio_rw (34,536,395,961 samples, 40.69%)</title><rect x="595.2" y="1909" width="480.1" height="15.0" fill="rgb(240,161,38)" rx="2" ry="2" />
<text  x="598.15" y="1919.5" >iomap_dio_rw</text>
</g>
<g >
<title>get_offset.part.0 (960,966,364 samples, 1.13%)</title><rect x="10.0" y="37" width="13.4" height="15.0" fill="rgb(212,36,8)" rx="2" ry="2" />
<text  x="13.00" y="47.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="197" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="207.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1205" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1215.5" >[..</text>
</g>
<g >
<title>ext4_iomap_begin (12,447,862,176 samples, 14.66%)</title><rect x="685.9" y="1877" width="173.0" height="15.0" fill="rgb(233,133,31)" rx="2" ry="2" />
<text  x="688.86" y="1887.5" >ext4_iomap_begin</text>
</g>
<g >
<title>blk_hctx_poll.isra.68 (1,907,209,536 samples, 2.25%)</title><rect x="294.0" y="1925" width="26.5" height="15.0" fill="rgb(253,222,53)" rx="2" ry="2" />
<text  x="297.03" y="1935.5" >b..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="421" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="431.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="245" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="255.5" >[..</text>
</g>
<g >
<title>nvme_complete_rq (346,167,323 samples, 0.41%)</title><rect x="477.8" y="1877" width="4.8" height="15.0" fill="rgb(254,226,54)" rx="2" ry="2" />
<text  x="480.81" y="1887.5" ></text>
</g>
<g >
<title>bio_free (7,675,037 samples, 0.01%)</title><rect x="219.9" y="1941" width="0.1" height="15.0" fill="rgb(221,74,17)" rx="2" ry="2" />
<text  x="222.90" y="1951.5" ></text>
</g>
<g >
<title>up_read (2,307,972,303 samples, 2.72%)</title><rect x="1075.3" y="1909" width="32.0" height="15.0" fill="rgb(209,18,4)" rx="2" ry="2" />
<text  x="1078.26" y="1919.5" >up..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1749" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1759.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1845" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1855.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1461" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1471.5" >[..</text>
</g>
<g >
<title>__sbitmap_queue_get_batch (1,447,587,765 samples, 1.71%)</title><rect x="969.5" y="1797" width="20.1" height="15.0" fill="rgb(253,221,53)" rx="2" ry="2" />
<text  x="972.47" y="1807.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="789" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="799.5" >[..</text>
</g>
<g >
<title>io_assign_file.part.60 (606,367,619 samples, 0.71%)</title><rect x="519.7" y="1957" width="8.4" height="15.0" fill="rgb(247,196,47)" rx="2" ry="2" />
<text  x="522.69" y="1967.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="341" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="351.5" >[..</text>
</g>
<g >
<title>__pfx_nvme_identify_ns (62,937,441 samples, 0.07%)</title><rect x="439.5" y="1877" width="0.9" height="15.0" fill="rgb(249,202,48)" rx="2" ry="2" />
<text  x="442.54" y="1887.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1317" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1327.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="133" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="143.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="357" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="367.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1765" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1775.5" >[..</text>
</g>
<g >
<title>submitter_uring_fn (786,727,729 samples, 0.93%)</title><rect x="23.4" y="37" width="10.9" height="15.0" fill="rgb(218,61,14)" rx="2" ry="2" />
<text  x="26.36" y="47.5" ></text>
</g>
<g >
<title>io_req_rw_cleanup (675,408,318 samples, 0.80%)</title><rect x="282.9" y="1957" width="9.4" height="15.0" fill="rgb(246,193,46)" rx="2" ry="2" />
<text  x="285.89" y="1967.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1397" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1407.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="405" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="415.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="261" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="271.5" >[..</text>
</g>
<g >
<title>blk_mq_flush_plug_list (7,824,772,328 samples, 9.22%)</title><rect x="384.5" y="1941" width="108.8" height="15.0" fill="rgb(215,46,11)" rx="2" ry="2" />
<text  x="387.53" y="1951.5" >blk_mq_flush_..</text>
</g>
<g >
<title>__blk_mq_alloc_requests (3,703,420,577 samples, 4.36%)</title><rect x="951.4" y="1829" width="51.5" height="15.0" fill="rgb(248,199,47)" rx="2" ry="2" />
<text  x="954.45" y="1839.5" >__blk..</text>
</g>
<g >
<title>entry_SYSRETQ_unsafe_stack (7,673,295 samples, 0.01%)</title><rect x="1189.7" y="2037" width="0.1" height="15.0" fill="rgb(206,7,1)" rx="2" ry="2" />
<text  x="1192.70" y="2047.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1045" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1055.5" >[..</text>
</g>
<g >
<title>read_tsc (9,211,960 samples, 0.01%)</title><rect x="257.8" y="1925" width="0.1" height="15.0" fill="rgb(206,7,1)" rx="2" ry="2" />
<text  x="260.80" y="1935.5" ></text>
</g>
<g >
<title>__rq_qos_done_bio (159,653,206 samples, 0.19%)</title><rect x="217.7" y="1925" width="2.2" height="15.0" fill="rgb(234,134,32)" rx="2" ry="2" />
<text  x="220.68" y="1935.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="901" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="911.5" >[..</text>
</g>
<g >
<title>nvme_identify_ns (118,207,937 samples, 0.14%)</title><rect x="483.2" y="1877" width="1.6" height="15.0" fill="rgb(247,196,47)" rx="2" ry="2" />
<text  x="486.20" y="1887.5" ></text>
</g>
<g >
<title>io_rw_init_file (875,024,793 samples, 1.03%)</title><rect x="1111.9" y="1925" width="12.1" height="15.0" fill="rgb(218,60,14)" rx="2" ry="2" />
<text  x="1114.85" y="1935.5" ></text>
</g>
<g >
<title>mempool_alloc_noprof (148,901,428 samples, 0.18%)</title><rect x="664.2" y="1861" width="2.0" height="15.0" fill="rgb(228,106,25)" rx="2" ry="2" />
<text  x="667.16" y="1871.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1109" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1119.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1925" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1935.5" >[..</text>
</g>
<g >
<title>_find_next_bit (30,710,579 samples, 0.04%)</title><rect x="1074.8" y="1781" width="0.5" height="15.0" fill="rgb(230,116,27)" rx="2" ry="2" />
<text  x="1077.83" y="1791.5" ></text>
</g>
<g >
<title>_raw_spin_lock_irqsave (30,707,479 samples, 0.04%)</title><rect x="144.6" y="1893" width="0.5" height="15.0" fill="rgb(247,195,46)" rx="2" ry="2" />
<text  x="147.64" y="1903.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1573" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1583.5" >[..</text>
</g>
<g >
<title>[button.ko] (7,722,691,980 samples, 9.10%)</title><rect x="384.9" y="1909" width="107.4" height="15.0" fill="rgb(254,226,54)" rx="2" ry="2" />
<text  x="387.93" y="1919.5" >[button.ko]</text>
</g>
<g >
<title>nvme_update_ns_info_block (250,235,965 samples, 0.29%)</title><rect x="488.7" y="1877" width="3.5" height="15.0" fill="rgb(228,109,26)" rx="2" ry="2" />
<text  x="491.72" y="1887.5" ></text>
</g>
<g >
<title>ext4_file_read_iter (39,771,657,253 samples, 46.85%)</title><rect x="554.5" y="1925" width="552.8" height="15.0" fill="rgb(244,180,43)" rx="2" ry="2" />
<text  x="557.46" y="1935.5" >ext4_file_read_iter</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="725" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="735.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1285" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1295.5" >[..</text>
</g>
<g >
<title>bio_to_wbt_flags (166,547,357 samples, 0.20%)</title><rect x="1021.3" y="1797" width="2.3" height="15.0" fill="rgb(235,138,33)" rx="2" ry="2" />
<text  x="1024.27" y="1807.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1509" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1519.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="485" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="495.5" >[..</text>
</g>
<g >
<title>jbd2_transaction_committed (154,283,090 samples, 0.18%)</title><rect x="856.8" y="1845" width="2.1" height="15.0" fill="rgb(221,77,18)" rx="2" ry="2" />
<text  x="859.76" y="1855.5" ></text>
</g>
<g >
<title>security_file_permission (304,694,413 samples, 0.36%)</title><rect x="1132.2" y="1909" width="4.2" height="15.0" fill="rgb(225,96,23)" rx="2" ry="2" />
<text  x="1135.18" y="1919.5" ></text>
</g>
<g >
<title>wb_timestamp (135,085,667 samples, 0.16%)</title><rect x="208.4" y="1909" width="1.9" height="15.0" fill="rgb(217,56,13)" rx="2" ry="2" />
<text  x="211.43" y="1919.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="677" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="687.5" >[..</text>
</g>
<g >
<title>__rq_qos_issue (455,155,557 samples, 0.54%)</title><rect x="454.2" y="1861" width="6.4" height="15.0" fill="rgb(230,115,27)" rx="2" ry="2" />
<text  x="457.23" y="1871.5" ></text>
</g>
<g >
<title>__pcs_replace_empty_main (164,255,903 samples, 0.19%)</title><rect x="377.5" y="1925" width="2.3" height="15.0" fill="rgb(229,114,27)" rx="2" ry="2" />
<text  x="380.50" y="1935.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1429" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1439.5" >[..</text>
</g>
<g >
<title>blk_mq_end_request_batch (9,354,373,763 samples, 11.02%)</title><rect x="152.9" y="1957" width="130.0" height="15.0" fill="rgb(254,225,53)" rx="2" ry="2" />
<text  x="155.85" y="1967.5" >blk_mq_end_reque..</text>
</g>
<g >
<title>read_tsc (85,194,415 samples, 0.10%)</title><rect x="1068.8" y="1813" width="1.2" height="15.0" fill="rgb(206,7,1)" rx="2" ry="2" />
<text  x="1071.81" y="1823.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="821" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="831.5" >[..</text>
</g>
<g >
<title>ext4_inode_block_valid (141,229,587 samples, 0.17%)</title><rect x="734.5" y="1829" width="2.0" height="15.0" fill="rgb(215,50,11)" rx="2" ry="2" />
<text  x="737.53" y="1839.5" ></text>
</g>
<g >
<title>wbt_done (282,452,355 samples, 0.33%)</title><rect x="206.4" y="1925" width="3.9" height="15.0" fill="rgb(222,81,19)" rx="2" ry="2" />
<text  x="209.38" y="1935.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="469" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="479.5" >[..</text>
</g>
<g >
<title>submit_bio_noacct (917,194,558 samples, 1.08%)</title><rect x="865.3" y="1877" width="12.7" height="15.0" fill="rgb(211,30,7)" rx="2" ry="2" />
<text  x="868.30" y="1887.5" ></text>
</g>
<g >
<title>nvme_ns_open (334,657,568 samples, 0.39%)</title><rect x="92.6" y="1941" width="4.7" height="15.0" fill="rgb(249,205,49)" rx="2" ry="2" />
<text  x="95.64" y="1951.5" ></text>
</g>
<g >
<title>bdev_count_inflight_rw.part.17 (73,703,310 samples, 0.09%)</title><rect x="1074.2" y="1797" width="1.1" height="15.0" fill="rgb(238,156,37)" rx="2" ry="2" />
<text  x="1077.24" y="1807.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="757" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="767.5" >[..</text>
</g>
<g >
<title>dma_map_phys (698,633,943 samples, 0.82%)</title><rect x="468.1" y="1877" width="9.7" height="15.0" fill="rgb(235,139,33)" rx="2" ry="2" />
<text  x="471.10" y="1887.5" ></text>
</g>
<g >
<title>_raw_read_lock (1,327,787,412 samples, 1.56%)</title><rect x="786.6" y="1829" width="18.4" height="15.0" fill="rgb(233,132,31)" rx="2" ry="2" />
<text  x="789.58" y="1839.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="645" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="655.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1493" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1503.5" >[..</text>
</g>
<g >
<title>mutex_lock (48,352,114 samples, 0.06%)</title><rect x="1170.1" y="1989" width="0.6" height="15.0" fill="rgb(217,57,13)" rx="2" ry="2" />
<text  x="1173.07" y="1999.5" ></text>
</g>
<g >
<title>_raw_spin_lock_irqsave (701,555,799 samples, 0.83%)</title><rect x="978.0" y="1781" width="9.8" height="15.0" fill="rgb(247,195,46)" rx="2" ry="2" />
<text  x="981.01" y="1791.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="389" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="399.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="997" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1007.5" >[..</text>
</g>
<g >
<title>ext4_dio_alignment (782,877,329 samples, 0.92%)</title><rect x="584.3" y="1893" width="10.9" height="15.0" fill="rgb(236,146,35)" rx="2" ry="2" />
<text  x="587.27" y="1903.5" ></text>
</g>
<g >
<title>bio_put (399,093,247 samples, 0.47%)</title><rect x="220.0" y="1941" width="5.6" height="15.0" fill="rgb(242,173,41)" rx="2" ry="2" />
<text  x="223.01" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="437" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="447.5" >[..</text>
</g>
<g >
<title>sbitmap_queue_clear_batch (1,349,311,143 samples, 1.59%)</title><rect x="258.8" y="1941" width="18.7" height="15.0" fill="rgb(245,184,44)" rx="2" ry="2" />
<text  x="261.76" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1077" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1087.5" >[..</text>
</g>
<g >
<title>bio_endio (689,993,701 samples, 0.81%)</title><rect x="210.3" y="1941" width="9.6" height="15.0" fill="rgb(217,55,13)" rx="2" ry="2" />
<text  x="213.31" y="1951.5" ></text>
</g>
<g >
<title>blk_stat_add (502,713,854 samples, 0.59%)</title><rect x="233.1" y="1941" width="7.0" height="15.0" fill="rgb(227,103,24)" rx="2" ry="2" />
<text  x="236.12" y="1951.5" ></text>
</g>
<g >
<title>io_read (43,757,041,605 samples, 51.55%)</title><rect x="528.1" y="1957" width="608.3" height="15.0" fill="rgb(243,175,41)" rx="2" ry="2" />
<text  x="531.12" y="1967.5" >io_read</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1365" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1375.5" >[..</text>
</g>
<g >
<title>ktime_get (19,185,275 samples, 0.02%)</title><rect x="257.7" y="1941" width="0.2" height="15.0" fill="rgb(207,10,2)" rx="2" ry="2" />
<text  x="260.66" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="2037" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="2047.5" >[..</text>
</g>
<g >
<title>kmem_cache_alloc_noprof (96,714,300 samples, 0.11%)</title><rect x="664.8" y="1845" width="1.4" height="15.0" fill="rgb(248,200,47)" rx="2" ry="2" />
<text  x="667.83" y="1855.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="629" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="639.5" >[..</text>
</g>
<g >
<title>barn_replace_full_sheaf.part.95 (62,945,198 samples, 0.07%)</title><rect x="144.3" y="1909" width="0.9" height="15.0" fill="rgb(233,131,31)" rx="2" ry="2" />
<text  x="147.30" y="1919.5" ></text>
</g>
<g >
<title>kmem_cache_free (47,535,019 samples, 0.06%)</title><rect x="258.0" y="1925" width="0.7" height="15.0" fill="rgb(254,225,53)" rx="2" ry="2" />
<text  x="261.02" y="1935.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1237" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1247.5" >[..</text>
</g>
<g >
<title>io_file_supports_nowait (324,255,730 samples, 0.38%)</title><rect x="1107.3" y="1925" width="4.6" height="15.0" fill="rgb(247,196,47)" rx="2" ry="2" />
<text  x="1110.35" y="1935.5" ></text>
</g>
<g >
<title>__rcu_read_unlock (20,729,278 samples, 0.02%)</title><rect x="968.5" y="1813" width="0.3" height="15.0" fill="rgb(253,224,53)" rx="2" ry="2" />
<text  x="971.52" y="1823.5" ></text>
</g>
<g >
<title>[unknown] (1,748,444,087 samples, 2.06%)</title><rect x="10.0" y="2053" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="2063.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="933" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="943.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1797" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1807.5" >[..</text>
</g>
<g >
<title>wbt_issue (238,715,265 samples, 0.28%)</title><rect x="457.2" y="1845" width="3.4" height="15.0" fill="rgb(226,98,23)" rx="2" ry="2" />
<text  x="460.24" y="1855.5" ></text>
</g>
<g >
<title>[nvme-core.ko] (105,923,723 samples, 0.12%)</title><rect x="438.1" y="1877" width="1.4" height="15.0" fill="rgb(253,225,53)" rx="2" ry="2" />
<text  x="441.07" y="1887.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="869" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="879.5" >[..</text>
</g>
<g >
<title>do_syscall_64 (82,291,877,669 samples, 96.95%)</title><rect x="45.4" y="2021" width="1144.0" height="15.0" fill="rgb(209,20,4)" rx="2" ry="2" />
<text  x="48.37" y="2031.5" >do_syscall_64</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="229" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="239.5" >[..</text>
</g>
<g >
<title>submit_bio_noacct_nocheck (14,186,320,292 samples, 16.71%)</title><rect x="878.0" y="1877" width="197.3" height="15.0" fill="rgb(225,95,22)" rx="2" ry="2" />
<text  x="881.05" y="1887.5" >submit_bio_noacct_nocheck</text>
</g>
<g >
<title>nvme_tryget_ns_head (217,240,925 samples, 0.26%)</title><rect x="485.7" y="1877" width="3.0" height="15.0" fill="rgb(208,14,3)" rx="2" ry="2" />
<text  x="488.70" y="1887.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1877" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1887.5" >[..</text>
</g>
<g >
<title>bio_poll (1,932,533,875 samples, 2.28%)</title><rect x="293.7" y="1941" width="26.9" height="15.0" fill="rgb(235,140,33)" rx="2" ry="2" />
<text  x="296.69" y="1951.5" >b..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="277" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="287.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1541" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1551.5" >[..</text>
</g>
<g >
<title>blk_mq_finish_request (115,137,648 samples, 0.14%)</title><rect x="231.5" y="1941" width="1.6" height="15.0" fill="rgb(206,6,1)" rx="2" ry="2" />
<text  x="234.48" y="1951.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1157" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1167.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="53" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="63.5" >[..</text>
</g>
<g >
<title>__pcs_replace_full_main (105,928,204 samples, 0.12%)</title><rect x="143.7" y="1925" width="1.5" height="15.0" fill="rgb(230,119,28)" rx="2" ry="2" />
<text  x="146.70" y="1935.5" ></text>
</g>
<g >
<title>rw_verify_area (891,855,142 samples, 1.05%)</title><rect x="1124.0" y="1925" width="12.4" height="15.0" fill="rgb(218,64,15)" rx="2" ry="2" />
<text  x="1127.02" y="1935.5" ></text>
</g>
<g >
<title>ext4_inode_journal_mode (434,409,975 samples, 0.51%)</title><rect x="589.1" y="1877" width="6.1" height="15.0" fill="rgb(206,7,1)" rx="2" ry="2" />
<text  x="592.11" y="1887.5" ></text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="325" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="335.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1445" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1455.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1717" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1727.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="565" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="575.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="309" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="319.5" >[..</text>
</g>
<g >
<title>[unknown] (1,747,694,093 samples, 2.06%)</title><rect x="10.0" y="1637" width="24.3" height="15.0" fill="rgb(210,24,5)" rx="2" ry="2" />
<text  x="13.00" y="1647.5" >[..</text>
</g>
<g >
<title>io_vec_free (95,939,815 samples, 0.11%)</title><rect x="292.3" y="1957" width="1.3" height="15.0" fill="rgb(236,144,34)" rx="2" ry="2" />
<text  x="295.30" y="1967.5" ></text>
</g>
</g>
</svg>

^ permalink raw reply

* Re: [RFC PATCH] iomap: add fast read path for small direct I/O
From: changfengnan @ 2026-04-16  3:16 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Fengnan Chang, brauner, djwong, linux-xfs, linux-fsdevel,
	linux-ext4, lidiangang
In-Reply-To: <ad867C8dlaQGLS97@infradead.org>


> From: "Christoph Hellwig"<hch@infradead.org>
> Date:  Wed, Apr 15, 2026, 15:15
> Subject:  Re: [RFC PATCH] iomap: add fast read path for small direct I/O
> To: "Fengnan Chang"<fengnanchang@gmail.com>
> Cc: <brauner@kernel.org>, <djwong@kernel.org>, <linux-xfs@vger.kernel.org>, <linux-fsdevel@vger.kernel.org>, <linux-ext4@vger.kernel.org>, <lidiangang@bytedance.com>, "Fengnan Chang"<changfengnan@bytedance.com>
> On Tue, Apr 14, 2026 at 08:26:47PM +0800, Fengnan Chang wrote:
> > 1. Allocating the `bio` and `struct iomap_dio` together to avoid a
> >    separate kmalloc. However, because `struct iomap_dio` is relatively
> >    large and the main path is complex, this yielded almost no
> >    performance improvement.
> 
> One interesting bit here would be a slab for struct iomap_dio, and
> the previously discussed per-cpu allocation of some form.
Hi Christoph:
Thank you for your thorough review; it has given me greater confidence
that we are on the right path. This patch still needs a lot of work to be
perfected,  I hope it will be worth it.
Yes, but use a new slab for struct iomap_dio doesn't help.

> 
> > 2. Reducing unnecessary state resets in the iomap state machine (e.g.,
> >    skipping `iomap_iter_reset_iomap` where safe). This provided a ~5%
> >    IOPS boost, which is helpful but still falls far short of closing
> >    the gap with the raw block device.
> 
> But it already is a major improvement, and one that would apply outside
> of narrow special cases.  So I'd really like to see that patch.
You can see this in:
https://lore.kernel.org/linux-fsdevel/20260416030642.26744-1-changfengnan@bytedance.com/T/#u
> 
> > The fast path is triggered when the request satisfies:
> > - Asynchronous READ request only for now.
> 
> I think you really should handle synchronous reads as well.
I'll include support for it in the next version.
> 
> > - I/O size is <= inode blocksize (fits in a single block, no splits).
> 
> Makes sense, and I suspect this is the main source of speedups.
> 
> > - Aligned to the block device's logical block size.
> 
> All direct I/O requires this.
> 
> > - No bounce buffering, fscrypt, or fsverity involved.
> > - No custom `iomap_dio_ops` (dops) registered by the filesystem.
> 
> I'm really curious at what difference this makes.  It removes a few
> branches, but should not have much of an effect while limiting the
> applicability a lot.
Yes, the impact shouldn’t be significant. 
Since this is just a RFC version to confirm that I’m on the right path, there
are many aspects that haven’t been fully thought through yet. I haven’t
tested these scenarios yet, but I’ll add support for them later to
check  exactly what the impact is.
> 
> > After this optimization, the heavy generic functions disappear from the
> > profile, replaced by a single streamlined execution path:
> >   4.83%  [kernel]  [k] iomap_dio_fast_read_async.isra.31
> > 
> > With this patch, 4K random read IOPS on ext4 increases from 1.9M to
> > 2.3M.
> 
> That is still a lot slower than the block device path.  A big part of
> it should be the extent lookup and locking associated with it, but
> I'd expect things to be a bit better.  Do you have XFS version as well?
Yes, still a lot slower, I believe the other reason is due to the lookup of
the extent mapping.
XFS and ext4 perform similarly, 1.92M IOPS to 2.32M IOPS. 

> 
> > However, I am submitting this patch to validate whether this
> > optimization direction is correct and worth pursuing. I would appreciate
> > feedback on how to better integrate these ideas into the main iomap
> > execution path.
> 
> I think a <= block size fast path makes a lot of sense, just like we
> have a simple version on the block device, but it needs more work.
Agree, I came up with this patch after being inspired by the way block
devices are handled. 

> 
> > +struct iomap_dio_fast_read {
> > +        struct kiocb        *iocb;
> > +        size_t                size;
> > +        bool                should_dirty;
> > +        struct work_struct        work;
> > +        struct bio        bio ____cacheline_aligned_in_smp;
> 
> Does the cache line alignment matter here?  If yes, can you explain why
> in a comment?

I copy this from struct blkdev_dio , I'll do some test to verfiy. 
> 
> > +static struct bio_set iomap_dio_fast_read_pool;
> 
> In general I'd prefer to stick to simple as in the block device version
> instead of fast.

Simple is better name.
> 
> > +static void iomap_dio_fast_read_complete_work(struct work_struct *work)
> > +{
> > +        struct iomap_dio_fast_read *fr =
> > +                container_of(work, struct iomap_dio_fast_read, work);
> > +        struct kiocb *iocb = fr->iocb;
> > +        struct inode *inode = file_inode(iocb->ki_filp);
> > +        bool should_dirty = fr->should_dirty;
> > +        struct bio *bio = &fr->bio;
> > +        ssize_t ret;
> > +
> > +        WRITE_ONCE(iocb->private, NULL);
> > +
> > +        if (likely(!bio->bi_status)) {
> > +                ret = fr->size;
> > +                iocb->ki_pos += ret;
> > +        } else {
> > +                ret = blk_status_to_errno(bio->bi_status);
> > +                fserror_report_io(inode, FSERR_DIRECTIO_READ, iocb->ki_pos,
> > +                                  fr->size, ret, GFP_NOFS);
> > +        }
> > +
> > +        if (should_dirty) {
> > +                bio_check_pages_dirty(bio);
> > +        } else {
> > +                bio_release_pages(bio, false);
> > +                bio_put(bio);
> > +        }
> > +
> > +        inode_dio_end(inode);
> > +
> > +        trace_iomap_dio_complete(iocb, ret < 0 ? ret : 0, ret > 0 ? ret : 0);
> > +        iocb->ki_complete(iocb, ret);
> 
> This is a lot of duplicate cork.  Can we somehow share it by passing
> more arguments or embedding the simple context into the bigger one?

I'll try. There are still many issues below, which I will address in the next version.
> 
> > +static inline bool iomap_dio_fast_read_supported(struct kiocb *iocb,
> > +                                          struct iov_iter *iter,
> > +                                          unsigned int dio_flags,
> > +                                          size_t done_before)
> 
> Please stick to two-tab indents for prototype continuations, which is
> both more readable and easier to modify later.
Get.
> 
> > +        if (count < bdev_logical_block_size(inode->i_sb->s_bdev))
> > +                return false;
> 
> Sub-sector reads (unlike writes) don't require any special handling, so
> I don't see why they are excluded.
Agree, Sub-sector reads can handle too.

> 
> > +        if (dio_flags & IOMAP_DIO_FSBLOCK_ALIGNED)
> > +                alignment = i_blocksize(inode);
> > +        else
> > +                alignment = bdev_logical_block_size(inode->i_sb->s_bdev);
> > +
> > +        if ((iocb->ki_pos | count) & (alignment - 1))
> > +                return false;
> 
> Factor this into a helper?
Get.
> 
> > +        inode_dio_begin(inode);
> > +
> > +        ret = ops->iomap_begin(inode, iomi.pos, count, iomi.flags,
> > +                               &iomi.iomap, &iomi.srcmap);
> > +        if (ret) {
> > +                inode_dio_end(inode);
> > +                return ret;
> > +        }
> 
> If we can I'd much prefer avoiding the open coded iomap_begin
> invocation, as that is a real maintenance burden.
It seems we need introduce a new helper to do this.

> 
> > +
> > +        if (iomi.iomap.type != IOMAP_MAPPED ||
> > +            iomi.iomap.offset > iomi.pos ||
> > +            iomi.iomap.offset + iomi.iomap.length < iomi.pos + count ||
> > +            (iomi.iomap.flags & IOMAP_F_ANON_WRITE)) {
> 
> IOMAP_F_ANON_WRITE (as the name implies) only applies to writes.
> 
> > +                ret = -EAGAIN;
> 
> -EAGAIN is a bad status code, as we already use to indicate that a
> non-blocking read blocks.
Agree.

> 
> > +        ret = bio_iov_iter_get_pages(bio, iter,
> > +                                     bdev_logical_block_size(iomi.iomap.bdev) - 1);
> 
> Overly long line.  Also this needs to use the calculated alignment
> value.
Get.
> 
> > +        if (unlikely(ret)) {
> > +                bio_put(bio);
> > +                goto out_iomap_end;
> > +        }
> > +
> > +        if (bio->bi_iter.bi_size != count) {
> > +                iov_iter_revert(iter, bio->bi_iter.bi_size);
> > +                bio_release_pages(bio, false);
> > +                bio_put(bio);
> > +                ret = -EAGAIN;
> > +                goto out_iomap_end;
> > +        }
> 
> Share the bio_put with a new goto label, and maybe also move all
> the other cleanup code out of the main path into a label?
Get.
> 
> > +        if (!dops && iomap_dio_fast_read_supported(iocb, iter, dio_flags, done_before)) {
> 
> Overly long line.  But we should not make the fast path conditional
> on an option anyway.
Get.

^ permalink raw reply

* [PATCH] iomap: avoid memset iomap when iter is done
From: Fengnan Chang @ 2026-04-16  3:06 UTC (permalink / raw)
  To: brauner, djwong, hch, linux-xfs, linux-fsdevel, linux-ext4
  Cc: lidiangang, Fengnan Chang

When iomap_iter() finishes its iteration (returns <= 0), it is no longer
necessary to memset the entire iomap and srcmap structures.

In high-IOPS scenarios (like 4k randread NVMe polling with io_uring),
where the majority of I/Os complete in a single extent map, this wasted
memory write bandwidth, as the caller will just discard the iterator.

Use this command to test:
taskset -c 30 ./t/io_uring -p1 -d512 -b4096 -s32 -c32 -F1 -B1 -R1 -X1
-n1 -P1 /mnt/testfile
IOPS improve about 5% on ext4 and XFS.

However, we MUST still call iomap_iter_reset_iomap() to release the
folio_batch if IOMAP_F_FOLIO_BATCH is set, otherwise we leak page
references. Therefore, split the cleanup logic: always release the
folio_batch, but skip the memset() when ret <= 0.

Signed-off-by: Fengnan Chang <changfengnan@bytedance.com>
---
 fs/iomap/iter.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/fs/iomap/iter.c b/fs/iomap/iter.c
index c04796f6e57f..91eb5e6165ff 100644
--- a/fs/iomap/iter.c
+++ b/fs/iomap/iter.c
@@ -15,8 +15,6 @@ static inline void iomap_iter_reset_iomap(struct iomap_iter *iter)
 	}
 
 	iter->status = 0;
-	memset(&iter->iomap, 0, sizeof(iter->iomap));
-	memset(&iter->srcmap, 0, sizeof(iter->srcmap));
 }
 
 /* Advance the current iterator position and decrement the remaining length */
@@ -106,6 +104,9 @@ int iomap_iter(struct iomap_iter *iter, const struct iomap_ops *ops)
 	if (ret <= 0)
 		return ret;
 
+	memset(&iter->iomap, 0, sizeof(iter->iomap));
+	memset(&iter->srcmap, 0, sizeof(iter->srcmap));
+
 begin:
 	ret = ops->iomap_begin(iter->inode, iter->pos, iter->len, iter->flags,
 			       &iter->iomap, &iter->srcmap);
-- 
2.39.5 (Apple Git-154)


^ permalink raw reply related

* Re: [PATCH v1] ext4: add mb_stats_clear for mballoc statistics
From: Ritesh Harjani @ 2026-04-16  1:44 UTC (permalink / raw)
  To: Baolin Liu, tytso, adilger.kernel
  Cc: liubaolin12138, linux-ext4, linux-kernel, wangguanyu, Baolin Liu
In-Reply-To: <20260414100212.95209-1-liubaolin12138@163.com>

Baolin Liu <liubaolin12138@163.com> writes:

> From: Baolin Liu <liubaolin@kylinos.cn>
>
> Add a write-only mb_stats_clear sysfs knob to reset ext4 mballoc
> runtime statistics.This makes it easier to inspect allocator
> activity for a specific workload instead of using counters
> accumulated since mount.
>
> Signed-off-by: Baolin Liu <liubaolin@kylinos.cn>

Make sense to me. The changes looks good and works fine at my end.
So please feel free to add:

Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>

^ permalink raw reply

* Re: [PATCH] jbd2: enforce power-of-two default revoke hash size at compile time
From: Andreas Dilger @ 2026-04-16  1:35 UTC (permalink / raw)
  To: Jan Kara; +Cc: Milos Nikic, tytso, linux-ext4, linux-kernel
In-Reply-To: <cjtirtqozud4keiu2fqi6sj3o4moimloti7celc4y44eejsn2y@i2tz72chmm34>

On Apr 14, 2026, at 06:59, Jan Kara <jack@suse.cz> wrote:
> 
> On Mon 13-04-26 14:27:24, Milos Nikic wrote:
>> The jbd2 revoke table relies on bitwise AND operations for fast hash
>> indexing, which requires the hash table size to be a strict power of two.
>> 
>> Currently, this requirement is only enforced at runtime via a J_ASSERT
>> in jbd2_journal_init_revoke(). While this successfully catches invalid
>> dynamic allocations, it means a developer accidentally modifying the
>> hardcoded JOURNAL_REVOKE_DEFAULT_HASH macro will experience a system
>> panic upon mounting the filesystem during testing.
>> 
>> Add a BUILD_BUG_ON() in journal_init_common() to validate the default
>> macro at compile time. This acts as an immediate, zero-overhead
>> safeguard, preventing compilation entirely if the default hash size is
>> mathematically invalid.
>> 
>> Signed-off-by: Milos Nikic <nikic.milos@gmail.com>
> 
> Eh, if you modify JOURNAL_REVOKE_DEFAULT_HASH you should better know what
> you are doing and if you mess up, then the kernel failing with assertion
> isn't that difficult to diagnose. So sorry I don't think this "cleanup" is
> useful either.

Jan,
this is a BUILD_BUG_ON() so it won't cause any runtime assertion.

Cheers, Andreas 

> Honza
> 
>> ---
>> fs/jbd2/journal.c | 1 +
>> 1 file changed, 1 insertion(+)
>> 
>> diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
>> index 4f397fcdb13c..62b36a2fc4e2 100644
>> --- a/fs/jbd2/journal.c
>> +++ b/fs/jbd2/journal.c
>> @@ -1565,6 +1565,7 @@ static journal_t *journal_init_common(struct 
>>  	/* The journal is marked for error until we succeed with recovery! */
>>  	journal->j_flags = JBD2_ABORT;
>> 
>> +	BUILD_BUG_ON(!is_power_of_2(JOURNAL_REVOKE_DEFAULT_HASH));
>>  	/* Set up a default-sized revoke table for the new mount. */
>>  	err = jbd2_journal_init_revoke(journal, JOURNAL_REVOKE_DEFAULT_HASH);
>>  	if (err)
>> -- 
>> 2.53.0
>> 
> -- 
> Jan Kara <jack@suse.com>
> SUSE Labs, CR
> 


Cheers, Andreas






^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox