xfs: use the CIL space used counter for emptiness checks
authorDave Chinner <dchinner@redhat.com>
Fri, 1 Jul 2022 16:10:52 +0000 (02:10 +1000)
committerDave Chinner <david@fromorbit.com>
Fri, 1 Jul 2022 16:10:52 +0000 (02:10 +1000)
commit88591e7f06a42b241ca2a3e3e7067a8f17661947
tree368c34a9ff489ebb260fc7e18e76dae6cf1a1548
parent7561cea5dbb97fecb952548a0fb74fb105bf4664
xfs: use the CIL space used counter for emptiness checks

In the next patches we are going to make the CIL list itself
per-cpu, and so we cannot use list_empty() to check is the list is
empty. Replace the list_empty() checks with a flag in the CIL to
indicate we have committed at least one transaction to the CIL and
hence the CIL is not empty.

We need this flag to be an atomic so that we can clear it without
holding any locks in the commit fast path, but we also need to be
careful to avoid atomic operations in the fast path. Hence we use
the fact that test_bit() is not an atomic op to first check if the
flag is set and then run the atomic test_and_clear_bit() operation
to clear it and steal the initial unit reservation for the CIL
context checkpoint.

When we are switching to a new context in a push, we place the
setting of the XLOG_CIL_EMPTY flag under the xc_push_lock. THis
allows all the other places that need to check whether the CIL is
empty to use test_bit() and still be serialised correctly with the
CIL context swaps that set the bit.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/xfs_log_cil.c
fs/xfs/xfs_log_priv.h