GFS2: Switch tr_touched to flag in transaction
authorBob Peterson <rpeterso@redhat.com>
Wed, 25 Jan 2017 17:50:47 +0000 (12:50 -0500)
committerBob Peterson <rpeterso@redhat.com>
Fri, 27 Jan 2017 13:20:13 +0000 (08:20 -0500)
This patch eliminates the int variable tr_touched in favor of a
new flag in the transaction. This is a step toward reducing contention
on the gfs2_log_lock spin_lock.

Signed-off-by: Bob Peterson <rpeterso@redhat.com>
fs/gfs2/incore.h
fs/gfs2/log.c
fs/gfs2/meta_io.c
fs/gfs2/trans.c

index 00d8dc20ea3a1f4c9209a36240bbad9a78c63959..c45084ac642d1929058ea5d903ad796d574a45cc 100644 (file)
@@ -470,15 +470,19 @@ struct gfs2_quota_data {
        struct rcu_head qd_rcu;
 };
 
+enum {
+       TR_TOUCHED = 1,
+       TR_ATTACHED = 2,
+       TR_ALLOCED = 3,
+};
+
 struct gfs2_trans {
        unsigned long tr_ip;
 
        unsigned int tr_blocks;
        unsigned int tr_revokes;
        unsigned int tr_reserved;
-       unsigned int tr_touched:1;
-       unsigned int tr_attached:1;
-       unsigned int tr_alloced:1;
+       unsigned long tr_flags;
 
        unsigned int tr_num_buf_new;
        unsigned int tr_num_databuf_new;
index 5028a9d00c17d0da0807e93d8c3b48ac264f2985..4fb76c04e65b729ec56549ce88ca0543c426e06a 100644 (file)
@@ -799,7 +799,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl,
 
 static void gfs2_merge_trans(struct gfs2_trans *old, struct gfs2_trans *new)
 {
-       WARN_ON_ONCE(old->tr_attached != 1);
+       WARN_ON_ONCE(!test_bit(TR_ATTACHED, &old->tr_flags));
 
        old->tr_num_buf_new     += new->tr_num_buf_new;
        old->tr_num_databuf_new += new->tr_num_databuf_new;
@@ -823,9 +823,9 @@ static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
        if (sdp->sd_log_tr) {
                gfs2_merge_trans(sdp->sd_log_tr, tr);
        } else if (tr->tr_num_buf_new || tr->tr_num_databuf_new) {
-               gfs2_assert_withdraw(sdp, tr->tr_alloced);
+               gfs2_assert_withdraw(sdp, test_bit(TR_ALLOCED, &tr->tr_flags));
                sdp->sd_log_tr = tr;
-               tr->tr_attached = 1;
+               set_bit(TR_ATTACHED, &tr->tr_flags);
        }
 
        sdp->sd_log_commited_revoke += tr->tr_num_revoke - tr->tr_num_revoke_rm;
index 373639a597823c0b0b58fe129bf3b0118735599a..a88a347cffe3b6207f5f3b725974b47ec3970bd4 100644 (file)
@@ -293,7 +293,7 @@ int gfs2_meta_read(struct gfs2_glock *gl, u64 blkno, int flags,
        wait_on_buffer(bh);
        if (unlikely(!buffer_uptodate(bh))) {
                struct gfs2_trans *tr = current->journal_info;
-               if (tr && tr->tr_touched)
+               if (tr && test_bit(TR_TOUCHED, &tr->tr_flags))
                        gfs2_io_error_bh(sdp, bh);
                brelse(bh);
                *bhp = NULL;
@@ -320,7 +320,7 @@ int gfs2_meta_wait(struct gfs2_sbd *sdp, struct buffer_head *bh)
 
        if (!buffer_uptodate(bh)) {
                struct gfs2_trans *tr = current->journal_info;
-               if (tr && tr->tr_touched)
+               if (tr && test_bit(TR_TOUCHED, &tr->tr_flags))
                        gfs2_io_error_bh(sdp, bh);
                return -EIO;
        }
@@ -346,7 +346,7 @@ void gfs2_remove_from_journal(struct buffer_head *bh, int meta)
                        tr->tr_num_buf_rm++;
                else
                        tr->tr_num_databuf_rm++;
-               tr->tr_touched = 1;
+               set_bit(TR_TOUCHED, &tr->tr_flags);
                was_pinned = 1;
                brelse(bh);
        }
index 0c1bde395062141045f0c857cba624b9f4ee5a1e..5d7f5b08d60056c1470d663c2e2414b8b0b08a6a 100644 (file)
@@ -48,7 +48,7 @@ int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks,
        tr->tr_blocks = blocks;
        tr->tr_revokes = revokes;
        tr->tr_reserved = 1;
-       tr->tr_alloced = 1;
+       set_bit(TR_ALLOCED, &tr->tr_flags);
        if (blocks)
                tr->tr_reserved += 6 + blocks;
        if (revokes)
@@ -78,7 +78,8 @@ static void gfs2_print_trans(const struct gfs2_trans *tr)
 {
        pr_warn("Transaction created at: %pSR\n", (void *)tr->tr_ip);
        pr_warn("blocks=%u revokes=%u reserved=%u touched=%u\n",
-               tr->tr_blocks, tr->tr_revokes, tr->tr_reserved, tr->tr_touched);
+               tr->tr_blocks, tr->tr_revokes, tr->tr_reserved,
+               test_bit(TR_TOUCHED, &tr->tr_flags));
        pr_warn("Buf %u/%u Databuf %u/%u Revoke %u/%u\n",
                tr->tr_num_buf_new, tr->tr_num_buf_rm,
                tr->tr_num_databuf_new, tr->tr_num_databuf_rm,
@@ -89,12 +90,12 @@ void gfs2_trans_end(struct gfs2_sbd *sdp)
 {
        struct gfs2_trans *tr = current->journal_info;
        s64 nbuf;
-       int alloced = tr->tr_alloced;
+       int alloced = test_bit(TR_ALLOCED, &tr->tr_flags);
 
        BUG_ON(!tr);
        current->journal_info = NULL;
 
-       if (!tr->tr_touched) {
+       if (!test_bit(TR_TOUCHED, &tr->tr_flags)) {
                gfs2_log_release(sdp, tr->tr_reserved);
                if (alloced) {
                        kfree(tr);
@@ -112,8 +113,8 @@ void gfs2_trans_end(struct gfs2_sbd *sdp)
                gfs2_print_trans(tr);
 
        gfs2_log_commit(sdp, tr);
-       if (alloced && !tr->tr_attached)
-                       kfree(tr);
+       if (alloced && !test_bit(TR_ATTACHED, &tr->tr_flags))
+               kfree(tr);
        up_read(&sdp->sd_log_flush_lock);
 
        if (sdp->sd_vfs->s_flags & MS_SYNCHRONOUS)
@@ -182,7 +183,7 @@ void gfs2_trans_add_data(struct gfs2_glock *gl, struct buffer_head *bh)
                gfs2_log_lock(sdp);
        }
        gfs2_assert(sdp, bd->bd_gl == gl);
-       tr->tr_touched = 1;
+       set_bit(TR_TOUCHED, &tr->tr_flags);
        if (list_empty(&bd->bd_list)) {
                set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags);
                set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags);
@@ -201,7 +202,7 @@ static void meta_lo_add(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd)
        enum gfs2_freeze_state state = atomic_read(&sdp->sd_freeze_state);
 
        tr = current->journal_info;
-       tr->tr_touched = 1;
+       set_bit(TR_TOUCHED, &tr->tr_flags);
        if (!list_empty(&bd->bd_list))
                return;
        set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags);
@@ -256,7 +257,7 @@ void gfs2_trans_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd)
 
        BUG_ON(!list_empty(&bd->bd_list));
        gfs2_add_revoke(sdp, bd);
-       tr->tr_touched = 1;
+       set_bit(TR_TOUCHED, &tr->tr_flags);
        tr->tr_num_revoke++;
 }