aboutsummaryrefslogtreecommitdiffstats
path: root/fs/dlm/recover.c
diff options
context:
space:
mode:
authorBob Peterson <rpeterso@redhat.com>2011-10-26 16:24:55 -0400
committerDavid Teigland <teigland@redhat.com>2011-11-18 11:20:15 -0500
commit9beb3bf5a92bb8fc6503f844bf0772df29f14a02 (patch)
treec60963c27d0a93ae1f572e6fda9c090a4a702d4e /fs/dlm/recover.c
parentc3b92c8787367a8bb53d57d9789b558f1295cc96 (diff)
dlm: convert rsb list to rb_tree
Change the linked lists to rb_tree's in the rsb hash table to speed up searches. Slow rsb searches were having a large impact on gfs2 performance due to the large number of dlm locks gfs2 uses. Signed-off-by: Bob Peterson <rpeterso@redhat.com> Signed-off-by: David Teigland <teigland@redhat.com>
Diffstat (limited to 'fs/dlm/recover.c')
-rw-r--r--fs/dlm/recover.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/fs/dlm/recover.c b/fs/dlm/recover.c
index 14638235f7b2..50467cefdbd8 100644
--- a/fs/dlm/recover.c
+++ b/fs/dlm/recover.c
@@ -715,6 +715,7 @@ void dlm_recover_rsbs(struct dlm_ls *ls)
715 715
716int dlm_create_root_list(struct dlm_ls *ls) 716int dlm_create_root_list(struct dlm_ls *ls)
717{ 717{
718 struct rb_node *n;
718 struct dlm_rsb *r; 719 struct dlm_rsb *r;
719 int i, error = 0; 720 int i, error = 0;
720 721
@@ -727,7 +728,8 @@ int dlm_create_root_list(struct dlm_ls *ls)
727 728
728 for (i = 0; i < ls->ls_rsbtbl_size; i++) { 729 for (i = 0; i < ls->ls_rsbtbl_size; i++) {
729 spin_lock(&ls->ls_rsbtbl[i].lock); 730 spin_lock(&ls->ls_rsbtbl[i].lock);
730 list_for_each_entry(r, &ls->ls_rsbtbl[i].list, res_hashchain) { 731 for (n = rb_first(&ls->ls_rsbtbl[i].keep); n; n = rb_next(n)) {
732 r = rb_entry(n, struct dlm_rsb, res_hashnode);
731 list_add(&r->res_root_list, &ls->ls_root_list); 733 list_add(&r->res_root_list, &ls->ls_root_list);
732 dlm_hold_rsb(r); 734 dlm_hold_rsb(r);
733 } 735 }
@@ -741,7 +743,8 @@ int dlm_create_root_list(struct dlm_ls *ls)
741 continue; 743 continue;
742 } 744 }
743 745
744 list_for_each_entry(r, &ls->ls_rsbtbl[i].toss, res_hashchain) { 746 for (n = rb_first(&ls->ls_rsbtbl[i].toss); n; n = rb_next(n)) {
747 r = rb_entry(n, struct dlm_rsb, res_hashnode);
745 list_add(&r->res_root_list, &ls->ls_root_list); 748 list_add(&r->res_root_list, &ls->ls_root_list);
746 dlm_hold_rsb(r); 749 dlm_hold_rsb(r);
747 } 750 }
@@ -771,16 +774,18 @@ void dlm_release_root_list(struct dlm_ls *ls)
771 774
772void dlm_clear_toss_list(struct dlm_ls *ls) 775void dlm_clear_toss_list(struct dlm_ls *ls)
773{ 776{
774 struct dlm_rsb *r, *safe; 777 struct rb_node *n, *next;
778 struct dlm_rsb *rsb;
775 int i; 779 int i;
776 780
777 for (i = 0; i < ls->ls_rsbtbl_size; i++) { 781 for (i = 0; i < ls->ls_rsbtbl_size; i++) {
778 spin_lock(&ls->ls_rsbtbl[i].lock); 782 spin_lock(&ls->ls_rsbtbl[i].lock);
779 list_for_each_entry_safe(r, safe, &ls->ls_rsbtbl[i].toss, 783 for (n = rb_first(&ls->ls_rsbtbl[i].toss); n; n = next) {
780 res_hashchain) { 784 next = rb_next(n);;
781 if (dlm_no_directory(ls) || !is_master(r)) { 785 rsb = rb_entry(n, struct dlm_rsb, res_hashnode);
782 list_del(&r->res_hashchain); 786 if (dlm_no_directory(ls) || !is_master(rsb)) {
783 dlm_free_rsb(r); 787 rb_erase(n, &ls->ls_rsbtbl[i].toss);
788 dlm_free_rsb(rsb);
784 } 789 }
785 } 790 }
786 spin_unlock(&ls->ls_rsbtbl[i].lock); 791 spin_unlock(&ls->ls_rsbtbl[i].lock);