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>
This commit is contained in:

committed by
David Teigland

parent
c3b92c8787
commit
9beb3bf5a9
@@ -715,6 +715,7 @@ void dlm_recover_rsbs(struct dlm_ls *ls)
|
||||
|
||||
int dlm_create_root_list(struct dlm_ls *ls)
|
||||
{
|
||||
struct rb_node *n;
|
||||
struct dlm_rsb *r;
|
||||
int i, error = 0;
|
||||
|
||||
@@ -727,7 +728,8 @@ int dlm_create_root_list(struct dlm_ls *ls)
|
||||
|
||||
for (i = 0; i < ls->ls_rsbtbl_size; i++) {
|
||||
spin_lock(&ls->ls_rsbtbl[i].lock);
|
||||
list_for_each_entry(r, &ls->ls_rsbtbl[i].list, res_hashchain) {
|
||||
for (n = rb_first(&ls->ls_rsbtbl[i].keep); n; n = rb_next(n)) {
|
||||
r = rb_entry(n, struct dlm_rsb, res_hashnode);
|
||||
list_add(&r->res_root_list, &ls->ls_root_list);
|
||||
dlm_hold_rsb(r);
|
||||
}
|
||||
@@ -741,7 +743,8 @@ int dlm_create_root_list(struct dlm_ls *ls)
|
||||
continue;
|
||||
}
|
||||
|
||||
list_for_each_entry(r, &ls->ls_rsbtbl[i].toss, res_hashchain) {
|
||||
for (n = rb_first(&ls->ls_rsbtbl[i].toss); n; n = rb_next(n)) {
|
||||
r = rb_entry(n, struct dlm_rsb, res_hashnode);
|
||||
list_add(&r->res_root_list, &ls->ls_root_list);
|
||||
dlm_hold_rsb(r);
|
||||
}
|
||||
@@ -771,16 +774,18 @@ void dlm_release_root_list(struct dlm_ls *ls)
|
||||
|
||||
void dlm_clear_toss_list(struct dlm_ls *ls)
|
||||
{
|
||||
struct dlm_rsb *r, *safe;
|
||||
struct rb_node *n, *next;
|
||||
struct dlm_rsb *rsb;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ls->ls_rsbtbl_size; i++) {
|
||||
spin_lock(&ls->ls_rsbtbl[i].lock);
|
||||
list_for_each_entry_safe(r, safe, &ls->ls_rsbtbl[i].toss,
|
||||
res_hashchain) {
|
||||
if (dlm_no_directory(ls) || !is_master(r)) {
|
||||
list_del(&r->res_hashchain);
|
||||
dlm_free_rsb(r);
|
||||
for (n = rb_first(&ls->ls_rsbtbl[i].toss); n; n = next) {
|
||||
next = rb_next(n);;
|
||||
rsb = rb_entry(n, struct dlm_rsb, res_hashnode);
|
||||
if (dlm_no_directory(ls) || !is_master(rsb)) {
|
||||
rb_erase(n, &ls->ls_rsbtbl[i].toss);
|
||||
dlm_free_rsb(rsb);
|
||||
}
|
||||
}
|
||||
spin_unlock(&ls->ls_rsbtbl[i].lock);
|
||||
|
Reference in New Issue
Block a user