hi, I use io_uring to evaluate ext4 randread performance(direct io), observed obvious overhead in jbd2_transaction_committed(): Samples: 124K of event 'cycles:ppp', Event count (approx.): 80630088951 Overhead Command Shared Object Symbol 7.02% io_uring-sq-per [kernel.kallsyms] [k] jbd2_transaction_committed The codes: /* * Writes that span EOF might trigger an I/O size update on completion, * so consider them to be dirty for the purpose of O_DSYNC, even if * there is no other metadata changes being made or are pending. */ iomap->flags = 0; if (ext4_inode_datasync_dirty(inode) || offset + length > i_size_read(inode)) iomap->flags |= IOMAP_F_DIRTY; ext4_inode_datasync_dirty() calls jbd2_transaction_committed(). Sorry, I don't spend much time to learn iomap codes yet, just ask a quick question here. Do we need to call ext4_inode_datasync_dirty() for a read operation? If we must call ext4_inode_datasync_dirty() for a read operation, can we improve jbd2_transaction_committed() a bit, for example, have a quick check between inode->i_datasync_tid and j_commit_sequence, if inode->i_datasync_tid is less than or equal to j_commit_sequence, we also don't call jbd2_transaction_committed()? Regards, Xiaoguang Wang