OSDN Git Service

xfs: reserve space and initialise xlog_op_header in item formatting
authorDave Chinner <dchinner@redhat.com>
Thu, 21 Apr 2022 00:34:59 +0000 (10:34 +1000)
committerDave Chinner <david@fromorbit.com>
Thu, 21 Apr 2022 00:34:59 +0000 (10:34 +1000)
commit8d547cf9d2392585204075243f29022a619550f2
treeadbff10b4dda71d3967040fa33bd87f98fea573e
parent3c352bef8335a8d9d8f14bc0bd533df023280a72
xfs: reserve space and initialise xlog_op_header in item formatting

Current xlog_write() adds op headers to the log manually for every
log item region that is in the vector passed to it. While
xlog_write() needs to stamp the transaction ID into the ophdr, we
already know it's length, flags, clientid, etc at CIL commit time.

This means the only time that xlog write really needs to format and
reserve space for a new ophdr is when a region is split across two
iclogs. Adding the opheader and accounting for it as part of the
normal formatted item region means we simplify the accounting
of space used by a transaction and we don't have to special case
reserving of space in for the ophdrs in xlog_write(). It also means
we can largely initialise the ophdr in transaction commit instead
of xlog_write, making the xlog_write formatting inner loop much
tighter.

xlog_prepare_iovec() is now too large to stay as an inline function,
so we move it out of line and into xfs_log.c.

Object sizes:
text    data     bss     dec     hex filename
1125934  305951     484 1432369  15db31 fs/xfs/built-in.a.before
1123360  305951     484 1429795  15d123 fs/xfs/built-in.a.after

So the code is a roughly 2.5kB smaller with xlog_prepare_iovec() now
out of line, even though it grew in size itself.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Chandan Babu R <chandan.babu@oracle.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/xfs_log.c
fs/xfs/xfs_log.h
fs/xfs/xfs_log_cil.c