On Wed, May 19, 2021 at 10:13:09PM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@xxxxxxxxxx> > > To get it out from under the cil spinlock. > > Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> Looks ... straightforward enough for a percpu thing ;) Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> --D > --- > fs/xfs/xfs_log_cil.c | 20 +++++++++++++++----- > fs/xfs/xfs_log_priv.h | 2 +- > 2 files changed, 16 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c > index 72693fba929b..4ddc302a766b 100644 > --- a/fs/xfs/xfs_log_cil.c > +++ b/fs/xfs/xfs_log_cil.c > @@ -90,6 +90,10 @@ xlog_cil_pcp_aggregate( > > for_each_online_cpu(cpu) { > cilpcp = per_cpu_ptr(cil->xc_pcp, cpu); > + > + ctx->ticket->t_curr_res += cilpcp->space_reserved; > + ctx->ticket->t_unit_res += cilpcp->space_reserved; > + cilpcp->space_reserved = 0; > cilpcp->space_used = 0; > } > } > @@ -510,6 +514,7 @@ xlog_cil_insert_items( > * based on how close we are to the hard limit. > */ > cilpcp = get_cpu_ptr(cil->xc_pcp); > + cilpcp->space_reserved += ctx_res; > cilpcp->space_used += len; > if (space_used >= XLOG_CIL_SPACE_LIMIT(log) || > cilpcp->space_used > > @@ -520,10 +525,6 @@ xlog_cil_insert_items( > } > put_cpu_ptr(cilpcp); > > - spin_lock(&cil->xc_cil_lock); > - ctx->ticket->t_unit_res += ctx_res; > - ctx->ticket->t_curr_res += ctx_res; > - > /* > * If we've overrun the reservation, dump the tx details before we move > * the log items. Shutdown is imminent... > @@ -545,6 +546,7 @@ xlog_cil_insert_items( > * We do this here so we only need to take the CIL lock once during > * the transaction commit. > */ > + spin_lock(&cil->xc_cil_lock); > list_for_each_entry(lip, &tp->t_items, li_trans) { > > /* Skip items which aren't dirty in this transaction. */ > @@ -1434,12 +1436,20 @@ xlog_cil_pcp_dead( > spin_lock(&xlog_cil_pcp_lock); > list_for_each_entry_safe(cil, n, &xlog_cil_pcp_list, xc_pcp_list) { > struct xlog_cil_pcp *cilpcp = per_cpu_ptr(cil->xc_pcp, cpu); > + struct xfs_cil_ctx *ctx; > > spin_unlock(&xlog_cil_pcp_lock); > down_write(&cil->xc_ctx_lock); > + ctx = cil->xc_ctx; > + > + atomic_add(cilpcp->space_used, &ctx->space_used); > + if (ctx->ticket) { > + ctx->ticket->t_curr_res += cilpcp->space_reserved; > + ctx->ticket->t_unit_res += cilpcp->space_reserved; > + } > > - atomic_add(cilpcp->space_used, &cil->xc_ctx->space_used); > cilpcp->space_used = 0; > + cilpcp->space_reserved = 0; > > up_write(&cil->xc_ctx_lock); > spin_lock(&xlog_cil_pcp_lock); > diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h > index 7dc6275818de..b80cb3a0edb7 100644 > --- a/fs/xfs/xfs_log_priv.h > +++ b/fs/xfs/xfs_log_priv.h > @@ -232,7 +232,7 @@ struct xfs_cil_ctx { > */ > struct xlog_cil_pcp { > uint32_t space_used; > - uint32_t curr_res; > + uint32_t space_reserved; > struct list_head busy_extents; > struct list_head log_items; > }; > -- > 2.31.1 >