xfs: log stripe roundoff is a property of the log
authorDave Chinner <dchinner@redhat.com>
Fri, 18 Jun 2021 15:21:48 +0000 (08:21 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Fri, 18 Jun 2021 15:21:48 +0000 (08:21 -0700)
We don't need to look at the xfs_mount and superblock every time we
need to do an iclog roundoff calculation. The property is fixed for
the life of the log, so store the roundoff in the log at mount time
and use that everywhere.

On a debug build:

$ size fs/xfs/xfs_log.o.*
   text    data     bss     dec     hex filename
  27360     560       8   27928    6d18 fs/xfs/xfs_log.o.orig
  27219     560       8   27787    6c8b fs/xfs/xfs_log.o.patched

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
fs/xfs/libxfs/xfs_log_format.h
fs/xfs/xfs_log.c
fs/xfs/xfs_log_priv.h

index 3e15ea2..d548ea4 100644 (file)
@@ -34,9 +34,6 @@ typedef uint32_t xlog_tid_t;
 #define XLOG_MIN_RECORD_BSHIFT 14              /* 16384 == 1 << 14 */
 #define XLOG_BIG_RECORD_BSHIFT 15              /* 32k == 1 << 15 */
 #define XLOG_MAX_RECORD_BSHIFT 18              /* 256k == 1 << 18 */
-#define XLOG_BTOLSUNIT(log, b)  (((b)+(log)->l_mp->m_sb.sb_logsunit-1) / \
-                                 (log)->l_mp->m_sb.sb_logsunit)
-#define XLOG_LSUNITTOB(log, su) ((su) * (log)->l_mp->m_sb.sb_logsunit)
 
 #define XLOG_HEADER_SIZE       512
 
index c19a82a..0e563ff 100644 (file)
@@ -1401,6 +1401,11 @@ xlog_alloc_log(
        xlog_assign_atomic_lsn(&log->l_last_sync_lsn, 1, 0);
        log->l_curr_cycle  = 1;     /* 0 is bad since this is initial value */
 
+       if (xfs_sb_version_haslogv2(&mp->m_sb) && mp->m_sb.sb_logsunit > 1)
+               log->l_iclog_roundoff = mp->m_sb.sb_logsunit;
+       else
+               log->l_iclog_roundoff = BBSIZE;
+
        xlog_grant_head_init(&log->l_reserve_head);
        xlog_grant_head_init(&log->l_write_head);
 
@@ -1854,29 +1859,15 @@ xlog_calc_iclog_size(
        uint32_t                *roundoff)
 {
        uint32_t                count_init, count;
-       bool                    use_lsunit;
-
-       use_lsunit = xfs_sb_version_haslogv2(&log->l_mp->m_sb) &&
-                       log->l_mp->m_sb.sb_logsunit > 1;
 
        /* Add for LR header */
        count_init = log->l_iclog_hsize + iclog->ic_offset;
+       count = roundup(count_init, log->l_iclog_roundoff);
 
-       /* Round out the log write size */
-       if (use_lsunit) {
-               /* we have a v2 stripe unit to use */
-               count = XLOG_LSUNITTOB(log, XLOG_BTOLSUNIT(log, count_init));
-       } else {
-               count = BBTOB(BTOBB(count_init));
-       }
-
-       ASSERT(count >= count_init);
        *roundoff = count - count_init;
 
-       if (use_lsunit)
-               ASSERT(*roundoff < log->l_mp->m_sb.sb_logsunit);
-       else
-               ASSERT(*roundoff < BBTOB(1));
+       ASSERT(count >= count_init);
+       ASSERT(*roundoff < log->l_iclog_roundoff);
        return count;
 }
 
@@ -3151,10 +3142,9 @@ xlog_state_switch_iclogs(
        log->l_curr_block += BTOBB(eventual_size)+BTOBB(log->l_iclog_hsize);
 
        /* Round up to next log-sunit */
-       if (xfs_sb_version_haslogv2(&log->l_mp->m_sb) &&
-           log->l_mp->m_sb.sb_logsunit > 1) {
-               uint32_t sunit_bb = BTOBB(log->l_mp->m_sb.sb_logsunit);
-               log->l_curr_block = roundup(log->l_curr_block, sunit_bb);
+       if (log->l_iclog_roundoff > BBSIZE) {
+               log->l_curr_block = roundup(log->l_curr_block,
+                                               BTOBB(log->l_iclog_roundoff));
        }
 
        if (log->l_curr_block >= log->l_logBBsize) {
@@ -3406,12 +3396,11 @@ xfs_log_ticket_get(
  * Figure out the total log space unit (in bytes) that would be
  * required for a log ticket.
  */
-int
-xfs_log_calc_unit_res(
-       struct xfs_mount        *mp,
+static int
+xlog_calc_unit_res(
+       struct xlog             *log,
        int                     unit_bytes)
 {
-       struct xlog             *log = mp->m_log;
        int                     iclog_space;
        uint                    num_headers;
 
@@ -3487,18 +3476,20 @@ xfs_log_calc_unit_res(
        /* for commit-rec LR header - note: padding will subsume the ophdr */
        unit_bytes += log->l_iclog_hsize;
 
-       /* for roundoff padding for transaction data and one for commit record */
-       if (xfs_sb_version_haslogv2(&mp->m_sb) && mp->m_sb.sb_logsunit > 1) {
-               /* log su roundoff */
-               unit_bytes += 2 * mp->m_sb.sb_logsunit;
-       } else {
-               /* BB roundoff */
-               unit_bytes += 2 * BBSIZE;
-        }
+       /* roundoff padding for transaction data and one for commit record */
+       unit_bytes += 2 * log->l_iclog_roundoff;
 
        return unit_bytes;
 }
 
+int
+xfs_log_calc_unit_res(
+       struct xfs_mount        *mp,
+       int                     unit_bytes)
+{
+       return xlog_calc_unit_res(mp->m_log, unit_bytes);
+}
+
 /*
  * Allocate and initialise a new log ticket.
  */
@@ -3515,7 +3506,7 @@ xlog_ticket_alloc(
 
        tic = kmem_cache_zalloc(xfs_log_ticket_zone, GFP_NOFS | __GFP_NOFAIL);
 
-       unit_res = xfs_log_calc_unit_res(log->l_mp, unit_bytes);
+       unit_res = xlog_calc_unit_res(log, unit_bytes);
 
        atomic_set(&tic->t_ref, 1);
        tic->t_task             = current;
index 1c6fdbf..037950c 100644 (file)
@@ -436,6 +436,8 @@ struct xlog {
 #endif
        /* log recovery lsn tracking (for buffer submission */
        xfs_lsn_t               l_recovery_lsn;
+
+       uint32_t                l_iclog_roundoff;/* padding roundoff */
 };
 
 #define XLOG_BUF_CANCEL_BUCKET(log, blkno) \