public inbox for linux-fsdevel@vger.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH] iomap: add fast read path for small direct I/O
@ 2026-04-14 12:26 Fengnan Chang
  2026-04-15  7:14 ` Christoph Hellwig
  2026-04-15 19:06 ` Ojaswin Mujoo
  0 siblings, 2 replies; 6+ messages in thread
From: Fengnan Chang @ 2026-04-14 12:26 UTC (permalink / raw)
  To: brauner, djwong, linux-xfs, linux-fsdevel, linux-ext4
  Cc: lidiangang, Fengnan Chang

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

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

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.

Since optimizing the heavy generic path did not yield the desired
results for this specific, highly-demanding Gen5 SSD scenario, this
RFC patch introduces a dedicated asynchronous fast path.

The fast path is triggered when the request satisfies:
- Asynchronous READ request only for now.
- I/O size is <= inode blocksize (fits in a single block, no splits).
- Aligned to the block device's logical block size.
- No bounce buffering, fscrypt, or fsverity involved.
- No custom `iomap_dio_ops` (dops) registered by the filesystem.

By using a dedicated bio_set (`iomap_dio_fast_read_pool`) to embed a
much smaller completion state (`struct iomap_dio_fast_read`) directly
in the bio's front padding, we completely eliminate kmalloc/kfree and
drastically shorten the execution path.

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.

I am aware that adding a completely separate fast path introduces
duplicate code and may result in iomap_begin being called twice, this
likely unacceptable for merging in its current form.

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.

Signed-off-by: Fengnan Chang <changfengnan@bytedance.com>
---
 fs/iomap/direct-io.c | 275 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 275 insertions(+)

diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c
index e911daedff65a..e4183f7c2f962 100644
--- a/fs/iomap/direct-io.c
+++ b/fs/iomap/direct-io.c
@@ -5,10 +5,14 @@
  */
 #include <linux/blk-crypto.h>
 #include <linux/fscrypt.h>
+#include <linux/fsverity.h>
 #include <linux/pagemap.h>
 #include <linux/iomap.h>
 #include <linux/task_io_accounting_ops.h>
 #include <linux/fserror.h>
+#include <linux/kobject.h>
+#include <linux/sysfs.h>
+#include <linux/init.h>
 #include "internal.h"
 #include "trace.h"
 
@@ -880,12 +884,231 @@ __iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
 }
 EXPORT_SYMBOL_GPL(__iomap_dio_rw);
 
+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;
+};
+
+static struct bio_set iomap_dio_fast_read_pool;
+
+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);
+}
+
+static void iomap_dio_fast_read_end_io(struct bio *bio)
+{
+	struct iomap_dio_fast_read *fr = bio->bi_private;
+	struct kiocb *iocb = fr->iocb;
+
+	if (unlikely(bio->bi_status)) {
+		struct inode *inode = file_inode(iocb->ki_filp);
+
+		INIT_WORK(&fr->work, iomap_dio_fast_read_complete_work);
+		queue_work(inode->i_sb->s_dio_done_wq, &fr->work);
+		return;
+	}
+
+	iomap_dio_fast_read_complete_work(&fr->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)
+		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,
+					 struct iov_iter *iter,
+					 const struct iomap_ops *ops,
+					 void *private)
+{
+	struct inode *inode = file_inode(iocb->ki_filp);
+	size_t count = iov_iter_count(iter);
+	int nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS);
+	bool should_dirty = user_backed_iter(iter);
+	struct iomap_dio_fast_read *fr;
+	struct iomap_iter iomi = {
+		.inode		= inode,
+		.pos		= iocb->ki_pos,
+		.len		= count,
+		.flags		= IOMAP_DIRECT,
+		.private	= private,
+	};
+	struct bio *bio;
+	ssize_t ret;
+
+	if (iocb->ki_flags & IOCB_NOWAIT)
+		iomi.flags |= IOMAP_NOWAIT;
+
+	ret = kiocb_write_and_wait(iocb, count);
+	if (ret)
+		return ret;
+
+	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 (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)) {
+		ret = -EAGAIN;
+		goto out_iomap_end;
+	}
+
+	if (!inode->i_sb->s_dio_done_wq) {
+		ret = sb_init_dio_done_wq(inode->i_sb);
+		if (ret < 0)
+			goto out_iomap_end;
+	}
+
+	trace_iomap_dio_rw_begin(iocb, iter, 0, 0);
+
+	bio = bio_alloc_bioset(iomi.iomap.bdev, nr_pages,
+			       REQ_OP_READ | REQ_SYNC | REQ_IDLE,
+			       GFP_KERNEL, &iomap_dio_fast_read_pool);
+	fr = container_of(bio, struct iomap_dio_fast_read, bio);
+	fr->iocb = iocb;
+	fr->should_dirty = should_dirty;
+
+	bio->bi_iter.bi_sector = iomap_sector(&iomi.iomap, iomi.pos);
+	bio->bi_ioprio = iocb->ki_ioprio;
+	bio->bi_private = fr;
+	bio->bi_end_io = iomap_dio_fast_read_end_io;
+
+	ret = bio_iov_iter_get_pages(bio, iter,
+				     bdev_logical_block_size(iomi.iomap.bdev) - 1);
+	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;
+	}
+
+	fr->size = bio->bi_iter.bi_size;
+
+	if (should_dirty)
+		bio_set_pages_dirty(bio);
+
+	if (iocb->ki_flags & IOCB_NOWAIT)
+		bio->bi_opf |= REQ_NOWAIT;
+	if (iocb->ki_flags & IOCB_HIPRI) {
+		bio->bi_opf |= REQ_POLLED;
+		bio_set_polled(bio, iocb);
+		WRITE_ONCE(iocb->private, bio);
+	}
+	submit_bio(bio);
+
+	if (ops->iomap_end)
+		ops->iomap_end(inode, iomi.pos, count, count, iomi.flags,
+			       &iomi.iomap);
+	return -EIOCBQUEUED;
+
+out_iomap_end:
+	if (ops->iomap_end)
+		ops->iomap_end(inode, iomi.pos, count, 0, iomi.flags,
+			       &iomi.iomap);
+	inode_dio_end(inode);
+	return ret;
+}
+
 ssize_t
 iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
 		const struct iomap_ops *ops, const struct iomap_dio_ops *dops,
 		unsigned int dio_flags, void *private, size_t done_before)
 {
 	struct iomap_dio *dio;
+	ssize_t ret;
+
+	if (!dops && iomap_dio_fast_read_supported(iocb, iter, dio_flags, done_before)) {
+		ret = iomap_dio_fast_read_async(iocb, iter, ops, private);
+		if (ret != -EAGAIN)
+			return ret;
+	}
 
 	dio = __iomap_dio_rw(iocb, iter, ops, dops, dio_flags, private,
 			     done_before);
@@ -894,3 +1117,55 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
 	return iomap_dio_complete(dio);
 }
 EXPORT_SYMBOL_GPL(iomap_dio_rw);
+
+static ssize_t fast_read_enable_show(struct kobject *kobj,
+				     struct kobj_attribute *attr, char *buf)
+{
+	return sysfs_emit(buf, "%d\n", iomap_dio_fast_read_enabled);
+}
+
+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)
+{
+	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);
-- 
2.39.5 (Apple Git-154)


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [RFC PATCH] iomap: add fast read path for small direct I/O
  2026-04-14 12:26 [RFC PATCH] iomap: add fast read path for small direct I/O Fengnan Chang
@ 2026-04-15  7:14 ` Christoph Hellwig
  2026-04-16  3:16   ` changfengnan
  2026-04-15 19:06 ` Ojaswin Mujoo
  1 sibling, 1 reply; 6+ messages in thread
From: Christoph Hellwig @ 2026-04-15  7:14 UTC (permalink / raw)
  To: Fengnan Chang
  Cc: brauner, djwong, linux-xfs, linux-fsdevel, linux-ext4, lidiangang,
	Fengnan Chang

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.

> 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.

> 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/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.

> 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?

> 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.

> +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?

> +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.

> +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?

> +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.

> +	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.

> +	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?

> +	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.

> +
> +	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.

> +	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.

> +	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?

> +	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.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC PATCH] iomap: add fast read path for small direct I/O
  2026-04-14 12:26 [RFC PATCH] iomap: add fast read path for small direct I/O Fengnan Chang
  2026-04-15  7:14 ` Christoph Hellwig
@ 2026-04-15 19:06 ` Ojaswin Mujoo
  2026-04-16  3:22   ` changfengnan
  1 sibling, 1 reply; 6+ messages in thread
From: Ojaswin Mujoo @ 2026-04-15 19:06 UTC (permalink / raw)
  To: Fengnan Chang
  Cc: brauner, djwong, linux-xfs, linux-fsdevel, linux-ext4, lidiangang,
	Fengnan Chang

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? 
> 
> 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?
> 
> 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.

> +};
> +
> +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.

> +		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().


> +{
> +	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)
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC PATCH] iomap: add fast read path for small direct I/O
  2026-04-15  7:14 ` Christoph Hellwig
@ 2026-04-16  3:16   ` changfengnan
  2026-04-17  7:30     ` Christoph Hellwig
  0 siblings, 1 reply; 6+ messages in thread
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


> 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	[flat|nested] 6+ messages in thread

* Re: [RFC PATCH] iomap: add fast read path for small direct I/O
  2026-04-15 19:06 ` Ojaswin Mujoo
@ 2026-04-16  3:22   ` changfengnan
  0 siblings, 0 replies; 6+ messages in thread
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

[-- 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	[flat|nested] 6+ messages in thread

* Re: [RFC PATCH] iomap: add fast read path for small direct I/O
  2026-04-16  3:16   ` changfengnan
@ 2026-04-17  7:30     ` Christoph Hellwig
  0 siblings, 0 replies; 6+ messages in thread
From: Christoph Hellwig @ 2026-04-17  7:30 UTC (permalink / raw)
  To: changfengnan
  Cc: Christoph Hellwig, Fengnan Chang, brauner, djwong, linux-xfs,
	linux-fsdevel, linux-ext4, lidiangang

On Thu, Apr 16, 2026 at 11:16:23AM +0800, changfengnan wrote:
> > 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

Thanks!

> > 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.

Sure.  It might also make sense to skip some of this if it brings a big
enough benefit.

> > > +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. 

Thanks.  Btw, another thing that might be worth is to drop the
work_struct and reuse iomap_fail_reads or something similar to it.
This would be a pretty big size reduction.  Additionally we should
be able to kill should_dirty and just rely on bio or kiocb flags.


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-04-17  7:30 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-14 12:26 [RFC PATCH] iomap: add fast read path for small direct I/O Fengnan Chang
2026-04-15  7:14 ` Christoph Hellwig
2026-04-16  3:16   ` changfengnan
2026-04-17  7:30     ` Christoph Hellwig
2026-04-15 19:06 ` Ojaswin Mujoo
2026-04-16  3:22   ` changfengnan

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