diff options
author | Bob Peterson <rpeterso@redhat.com> | 2011-10-26 16:24:55 -0400 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2011-11-18 11:20:15 -0500 |
commit | 9beb3bf5a92bb8fc6503f844bf0772df29f14a02 (patch) | |
tree | c60963c27d0a93ae1f572e6fda9c090a4a702d4e /fs/dlm/recover.c | |
parent | c3b92c8787367a8bb53d57d9789b558f1295cc96 (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.c | 21 |
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 | ||
716 | int dlm_create_root_list(struct dlm_ls *ls) | 716 | int 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 | ||
772 | void dlm_clear_toss_list(struct dlm_ls *ls) | 775 | void 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); |