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/lockspace.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/lockspace.c')
-rw-r--r-- | fs/dlm/lockspace.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c index a1d8f1af144b..1d16a23b0a06 100644 --- a/fs/dlm/lockspace.c +++ b/fs/dlm/lockspace.c | |||
@@ -457,8 +457,8 @@ static int new_lockspace(const char *name, int namelen, void **lockspace, | |||
457 | if (!ls->ls_rsbtbl) | 457 | if (!ls->ls_rsbtbl) |
458 | goto out_lsfree; | 458 | goto out_lsfree; |
459 | for (i = 0; i < size; i++) { | 459 | for (i = 0; i < size; i++) { |
460 | INIT_LIST_HEAD(&ls->ls_rsbtbl[i].list); | 460 | ls->ls_rsbtbl[i].keep.rb_node = NULL; |
461 | INIT_LIST_HEAD(&ls->ls_rsbtbl[i].toss); | 461 | ls->ls_rsbtbl[i].toss.rb_node = NULL; |
462 | spin_lock_init(&ls->ls_rsbtbl[i].lock); | 462 | spin_lock_init(&ls->ls_rsbtbl[i].lock); |
463 | } | 463 | } |
464 | 464 | ||
@@ -685,7 +685,7 @@ static int lockspace_busy(struct dlm_ls *ls, int force) | |||
685 | static int release_lockspace(struct dlm_ls *ls, int force) | 685 | static int release_lockspace(struct dlm_ls *ls, int force) |
686 | { | 686 | { |
687 | struct dlm_rsb *rsb; | 687 | struct dlm_rsb *rsb; |
688 | struct list_head *head; | 688 | struct rb_node *n; |
689 | int i, busy, rv; | 689 | int i, busy, rv; |
690 | 690 | ||
691 | busy = lockspace_busy(ls, force); | 691 | busy = lockspace_busy(ls, force); |
@@ -746,20 +746,15 @@ static int release_lockspace(struct dlm_ls *ls, int force) | |||
746 | */ | 746 | */ |
747 | 747 | ||
748 | for (i = 0; i < ls->ls_rsbtbl_size; i++) { | 748 | for (i = 0; i < ls->ls_rsbtbl_size; i++) { |
749 | head = &ls->ls_rsbtbl[i].list; | 749 | while ((n = rb_first(&ls->ls_rsbtbl[i].keep))) { |
750 | while (!list_empty(head)) { | 750 | rsb = rb_entry(n, struct dlm_rsb, res_hashnode); |
751 | rsb = list_entry(head->next, struct dlm_rsb, | 751 | rb_erase(n, &ls->ls_rsbtbl[i].keep); |
752 | res_hashchain); | ||
753 | |||
754 | list_del(&rsb->res_hashchain); | ||
755 | dlm_free_rsb(rsb); | 752 | dlm_free_rsb(rsb); |
756 | } | 753 | } |
757 | 754 | ||
758 | head = &ls->ls_rsbtbl[i].toss; | 755 | while ((n = rb_first(&ls->ls_rsbtbl[i].toss))) { |
759 | while (!list_empty(head)) { | 756 | rsb = rb_entry(n, struct dlm_rsb, res_hashnode); |
760 | rsb = list_entry(head->next, struct dlm_rsb, | 757 | rb_erase(n, &ls->ls_rsbtbl[i].toss); |
761 | res_hashchain); | ||
762 | list_del(&rsb->res_hashchain); | ||
763 | dlm_free_rsb(rsb); | 758 | dlm_free_rsb(rsb); |
764 | } | 759 | } |
765 | } | 760 | } |