summaryrefslogtreecommitdiff
path: root/fs/xfs/libxfs/xfs_rtbitmap.h
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2023-10-16 09:40:11 -0700
committerDarrick J. Wong <djwong@kernel.org>2023-10-17 16:26:25 -0700
commitef5a83b7e597038d1c734ddb4bc00638082c2bf1 (patch)
tree9b5aa12266f11b3748c81079e004f6d5ecfc4640 /fs/xfs/libxfs/xfs_rtbitmap.h
parent5f57f7309d9ab9d24d50c5707472b1ed8af4eabc (diff)
xfs: use shifting and masking when converting rt extents, if possiblerefactor-rt-unit-conversions-6.7_2023-10-19
Avoid the costs of integer division (32-bit and 64-bit) if the realtime extent size is a power of two. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'fs/xfs/libxfs/xfs_rtbitmap.h')
-rw-r--r--fs/xfs/libxfs/xfs_rtbitmap.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/fs/xfs/libxfs/xfs_rtbitmap.h b/fs/xfs/libxfs/xfs_rtbitmap.h
index ecf5645dd670..3686a53e0aed 100644
--- a/fs/xfs/libxfs/xfs_rtbitmap.h
+++ b/fs/xfs/libxfs/xfs_rtbitmap.h
@@ -11,6 +11,9 @@ xfs_rtx_to_rtb(
struct xfs_mount *mp,
xfs_rtxnum_t rtx)
{
+ if (mp->m_rtxblklog >= 0)
+ return rtx << mp->m_rtxblklog;
+
return rtx * mp->m_sb.sb_rextsize;
}
@@ -19,6 +22,9 @@ xfs_rtxlen_to_extlen(
struct xfs_mount *mp,
xfs_rtxlen_t rtxlen)
{
+ if (mp->m_rtxblklog >= 0)
+ return rtxlen << mp->m_rtxblklog;
+
return rtxlen * mp->m_sb.sb_rextsize;
}
@@ -28,6 +34,9 @@ xfs_extlen_to_rtxmod(
struct xfs_mount *mp,
xfs_extlen_t len)
{
+ if (mp->m_rtxblklog >= 0)
+ return len & mp->m_rtxblkmask;
+
return len % mp->m_sb.sb_rextsize;
}
@@ -36,6 +45,9 @@ xfs_extlen_to_rtxlen(
struct xfs_mount *mp,
xfs_extlen_t len)
{
+ if (mp->m_rtxblklog >= 0)
+ return len >> mp->m_rtxblklog;
+
return len / mp->m_sb.sb_rextsize;
}
@@ -45,6 +57,9 @@ xfs_rtb_to_rtx(
struct xfs_mount *mp,
xfs_rtblock_t rtbno)
{
+ if (likely(mp->m_rtxblklog >= 0))
+ return rtbno >> mp->m_rtxblklog;
+
return div_u64(rtbno, mp->m_sb.sb_rextsize);
}
@@ -54,6 +69,9 @@ xfs_rtb_to_rtxoff(
struct xfs_mount *mp,
xfs_rtblock_t rtbno)
{
+ if (likely(mp->m_rtxblklog >= 0))
+ return rtbno & mp->m_rtxblkmask;
+
return do_div(rtbno, mp->m_sb.sb_rextsize);
}
@@ -67,6 +85,11 @@ xfs_rtb_to_rtxrem(
xfs_rtblock_t rtbno,
xfs_extlen_t *off)
{
+ if (likely(mp->m_rtxblklog >= 0)) {
+ *off = rtbno & mp->m_rtxblkmask;
+ return rtbno >> mp->m_rtxblklog;
+ }
+
return div_u64_rem(rtbno, mp->m_sb.sb_rextsize, off);
}
@@ -79,6 +102,12 @@ xfs_rtb_to_rtxup(
struct xfs_mount *mp,
xfs_rtblock_t rtbno)
{
+ if (likely(mp->m_rtxblklog >= 0)) {
+ if (rtbno & mp->m_rtxblkmask)
+ return (rtbno >> mp->m_rtxblklog) + 1;
+ return rtbno >> mp->m_rtxblklog;
+ }
+
if (do_div(rtbno, mp->m_sb.sb_rextsize))
rtbno++;
return rtbno;