Skip to content

Commit

Permalink
xfs: log stripe roundoff is a property of the log
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Dave Chinner authored and Darrick J. Wong committed Jun 18, 2021
1 parent 9bb38aa commit a6a65fe
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 37 deletions.
3 changes: 0 additions & 3 deletions fs/xfs/libxfs/xfs_log_format.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
59 changes: 25 additions & 34 deletions fs/xfs/xfs_log.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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.
*/
Expand All @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions fs/xfs/xfs_log_priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down

0 comments on commit a6a65fe

Please sign in to comment.