]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
xfs: move the locking from xlog_state_finish_copy to the callers
authorChristoph Hellwig <hch@lst.de>
Mon, 14 Oct 2019 17:36:41 +0000 (10:36 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Mon, 21 Oct 2019 16:04:58 +0000 (09:04 -0700)
This will allow optimizing various locking cycles in the following
patches.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
fs/xfs/xfs_log.c

index 0fb4fc5afee43c0dc614791a9f8d7cc16bc11441..211b7c7e0350cfebddd968877c54162805168c2b 100644 (file)
@@ -1967,7 +1967,6 @@ xlog_dealloc_log(
 /*
  * Update counters atomically now that memcpy is done.
  */
-/* ARGSUSED */
 static inline void
 xlog_state_finish_copy(
        struct xlog             *log,
@@ -1975,16 +1974,11 @@ xlog_state_finish_copy(
        int                     record_cnt,
        int                     copy_bytes)
 {
-       spin_lock(&log->l_icloglock);
+       lockdep_assert_held(&log->l_icloglock);
 
        be32_add_cpu(&iclog->ic_header.h_num_logops, record_cnt);
        iclog->ic_offset += copy_bytes;
-
-       spin_unlock(&log->l_icloglock);
-}      /* xlog_state_finish_copy */
-
-
-
+}
 
 /*
  * print out info relating to regions written which consume
@@ -2266,7 +2260,9 @@ xlog_write_copy_finish(
                 * This iclog has already been marked WANT_SYNC by
                 * xlog_state_get_iclog_space.
                 */
+               spin_lock(&log->l_icloglock);
                xlog_state_finish_copy(log, iclog, *record_cnt, *data_cnt);
+               spin_unlock(&log->l_icloglock);
                *record_cnt = 0;
                *data_cnt = 0;
                return xlog_state_release_iclog(log, iclog);
@@ -2277,11 +2273,11 @@ xlog_write_copy_finish(
 
        if (iclog->ic_size - log_offset <= sizeof(xlog_op_header_t)) {
                /* no more space in this iclog - push it. */
+               spin_lock(&log->l_icloglock);
                xlog_state_finish_copy(log, iclog, *record_cnt, *data_cnt);
                *record_cnt = 0;
                *data_cnt = 0;
 
-               spin_lock(&log->l_icloglock);
                xlog_state_want_sync(log, iclog);
                spin_unlock(&log->l_icloglock);
 
@@ -2504,7 +2500,9 @@ xlog_write(
 
        ASSERT(len == 0);
 
+       spin_lock(&log->l_icloglock);
        xlog_state_finish_copy(log, iclog, record_cnt, data_cnt);
+       spin_unlock(&log->l_icloglock);
        if (!commit_iclog)
                return xlog_state_release_iclog(log, iclog);