xfs: rework xlog_state_do_callback()

Clean it up a bit by factoring and rearranging some of the code.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
This commit is contained in:
Dave Chinner
2021-08-10 18:00:40 -07:00
committed by Darrick J. Wong
parent b36d4651e1
commit 8bb92005b0

View File

@@ -2838,29 +2838,19 @@ xlog_state_iodone_process_iclog(
} }
} }
STATIC void
xlog_state_do_callback(
struct xlog *log)
{
struct xlog_in_core *iclog;
struct xlog_in_core *first_iclog;
bool cycled_icloglock;
int flushcnt = 0;
int repeats = 0;
spin_lock(&log->l_icloglock);
do {
/* /*
* Scan all iclogs starting with the one pointed to by the * Loop over all the iclogs, running attached callbacks on them. Return true if
* log. Reset this starting point each time the log is * we ran any callbacks, indicating that we dropped the icloglock.
* unlocked (during callbacks).
*
* Keep looping through iclogs until one full pass is made
* without running any callbacks.
*/ */
cycled_icloglock = false; static bool
first_iclog = log->l_iclog; xlog_state_do_iclog_callbacks(
iclog = first_iclog; struct xlog *log)
__releases(&log->l_icloglock)
__acquires(&log->l_icloglock)
{
struct xlog_in_core *first_iclog = log->l_iclog;
struct xlog_in_core *iclog = first_iclog;
bool ran_callback = false;
do { do {
LIST_HEAD(cb_list); LIST_HEAD(cb_list);
@@ -2879,7 +2869,7 @@ xlog_state_do_callback(
trace_xlog_iclog_callbacks_start(iclog, _RET_IP_); trace_xlog_iclog_callbacks_start(iclog, _RET_IP_);
xlog_cil_process_committed(&cb_list); xlog_cil_process_committed(&cb_list);
trace_xlog_iclog_callbacks_done(iclog, _RET_IP_); trace_xlog_iclog_callbacks_done(iclog, _RET_IP_);
cycled_icloglock = true; ran_callback = true;
spin_lock(&log->l_icloglock); spin_lock(&log->l_icloglock);
if (xlog_is_shutdown(log)) if (xlog_is_shutdown(log))
@@ -2889,6 +2879,26 @@ xlog_state_do_callback(
iclog = iclog->ic_next; iclog = iclog->ic_next;
} while (iclog != first_iclog); } while (iclog != first_iclog);
return ran_callback;
}
/*
* Loop running iclog completion callbacks until there are no more iclogs in a
* state that can run callbacks.
*/
STATIC void
xlog_state_do_callback(
struct xlog *log)
{
int flushcnt = 0;
int repeats = 0;
spin_lock(&log->l_icloglock);
while (xlog_state_do_iclog_callbacks(log)) {
if (xlog_is_shutdown(log))
break;
if (++repeats > 5000) { if (++repeats > 5000) {
flushcnt += repeats; flushcnt += repeats;
repeats = 0; repeats = 0;
@@ -2896,7 +2906,7 @@ xlog_state_do_callback(
"%s: possible infinite loop (%d iterations)", "%s: possible infinite loop (%d iterations)",
__func__, flushcnt); __func__, flushcnt);
} }
} while (!xlog_is_shutdown(log) && cycled_icloglock); }
if (log->l_iclog->ic_state == XLOG_STATE_ACTIVE || if (log->l_iclog->ic_state == XLOG_STATE_ACTIVE ||
xlog_is_shutdown(log)) xlog_is_shutdown(log))