Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[GFS2] Only do lo_incore_commit once

This patch is performance related. When we're doing a log flush,
I noticed we were calling buf_lo_incore_commit twice: once for
data bufs and once for metadata bufs. Since this is the same
function and does the same thing in both cases, there should be
no reason to call it twice. Since we only need to call it once,
we can also make it faster by removing it from the generic "lops"
code and making it a stand-along static function.

Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>

authored by

Bob Peterson and committed by
Steven Whitehouse
d0109bfa ca390601

+17 -29
-1
fs/gfs2/incore.h
··· 44 44 45 45 struct gfs2_log_operations { 46 46 void (*lo_add) (struct gfs2_sbd *sdp, struct gfs2_log_element *le); 47 - void (*lo_incore_commit) (struct gfs2_sbd *sdp, struct gfs2_trans *tr); 48 47 void (*lo_before_commit) (struct gfs2_sbd *sdp); 49 48 void (*lo_after_commit) (struct gfs2_sbd *sdp, struct gfs2_ail *ai); 50 49 void (*lo_before_scan) (struct gfs2_jdesc *jd,
+16 -1
fs/gfs2/log.c
··· 779 779 gfs2_log_unlock(sdp); 780 780 } 781 781 782 + static void buf_lo_incore_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr) 783 + { 784 + struct list_head *head = &tr->tr_list_buf; 785 + struct gfs2_bufdata *bd; 786 + 787 + gfs2_log_lock(sdp); 788 + while (!list_empty(head)) { 789 + bd = list_entry(head->next, struct gfs2_bufdata, bd_list_tr); 790 + list_del_init(&bd->bd_list_tr); 791 + tr->tr_num_buf--; 792 + } 793 + gfs2_log_unlock(sdp); 794 + gfs2_assert_warn(sdp, !tr->tr_num_buf); 795 + } 796 + 782 797 /** 783 798 * gfs2_log_commit - Commit a transaction to the log 784 799 * @sdp: the filesystem ··· 805 790 void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr) 806 791 { 807 792 log_refund(sdp, tr); 808 - lops_incore_commit(sdp, tr); 793 + buf_lo_incore_commit(sdp, tr); 809 794 810 795 sdp->sd_vfs->s_dirt = 1; 811 796 up_read(&sdp->sd_log_flush_lock);
-17
fs/gfs2/lops.c
··· 152 152 unlock_buffer(bd->bd_bh); 153 153 } 154 154 155 - static void buf_lo_incore_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr) 156 - { 157 - struct list_head *head = &tr->tr_list_buf; 158 - struct gfs2_bufdata *bd; 159 - 160 - gfs2_log_lock(sdp); 161 - while (!list_empty(head)) { 162 - bd = list_entry(head->next, struct gfs2_bufdata, bd_list_tr); 163 - list_del_init(&bd->bd_list_tr); 164 - tr->tr_num_buf--; 165 - } 166 - gfs2_log_unlock(sdp); 167 - gfs2_assert_warn(sdp, !tr->tr_num_buf); 168 - } 169 - 170 155 static void buf_lo_before_commit(struct gfs2_sbd *sdp) 171 156 { 172 157 struct buffer_head *bh; ··· 722 737 723 738 const struct gfs2_log_operations gfs2_buf_lops = { 724 739 .lo_add = buf_lo_add, 725 - .lo_incore_commit = buf_lo_incore_commit, 726 740 .lo_before_commit = buf_lo_before_commit, 727 741 .lo_after_commit = buf_lo_after_commit, 728 742 .lo_before_scan = buf_lo_before_scan, ··· 747 763 748 764 const struct gfs2_log_operations gfs2_databuf_lops = { 749 765 .lo_add = databuf_lo_add, 750 - .lo_incore_commit = buf_lo_incore_commit, 751 766 .lo_before_commit = databuf_lo_before_commit, 752 767 .lo_after_commit = databuf_lo_after_commit, 753 768 .lo_scan_elements = databuf_lo_scan_elements,
+1 -10
fs/gfs2/lops.h
··· 1 1 /* 2 2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. 3 - * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. 3 + * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. 4 4 * 5 5 * This copyrighted material is made available to anyone wishing to use, 6 6 * modify, copy, or redistribute it subject to the terms and conditions ··· 55 55 { 56 56 if (le->le_ops->lo_add) 57 57 le->le_ops->lo_add(sdp, le); 58 - } 59 - 60 - static inline void lops_incore_commit(struct gfs2_sbd *sdp, 61 - struct gfs2_trans *tr) 62 - { 63 - int x; 64 - for (x = 0; gfs2_log_ops[x]; x++) 65 - if (gfs2_log_ops[x]->lo_incore_commit) 66 - gfs2_log_ops[x]->lo_incore_commit(sdp, tr); 67 58 } 68 59 69 60 static inline void lops_before_commit(struct gfs2_sbd *sdp)