From c67036b5bcd9ad7255e892fe1b7eeb0f17639e8d Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Tue, 12 Feb 2019 13:46:11 -0500 Subject: [PATCH] dlm: Convert recovery_idr to XArray Signed-off-by: Matthew Wilcox --- fs/dlm/dlm_internal.h | 3 +- fs/dlm/lockspace.c | 5 +--- fs/dlm/recover.c | 65 +++++++++++++++++-------------------------- 3 files changed, 27 insertions(+), 46 deletions(-) diff --git a/fs/dlm/dlm_internal.h b/fs/dlm/dlm_internal.h index 4a9d12ccf897..0140a7979630 100644 --- a/fs/dlm/dlm_internal.h +++ b/fs/dlm/dlm_internal.h @@ -611,8 +611,7 @@ struct dlm_ls { struct list_head ls_recover_list; spinlock_t ls_recover_list_lock; int ls_recover_list_count; - struct idr ls_recover_idr; - spinlock_t ls_recover_idr_lock; + struct xarray ls_recover_array; wait_queue_head_t ls_wait_general; wait_queue_head_t ls_recover_lock_wait; struct mutex ls_clear_proc_locks; diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c index 85b30547933d..743eb99a079c 100644 --- a/fs/dlm/lockspace.c +++ b/fs/dlm/lockspace.c @@ -592,8 +592,7 @@ static int new_lockspace(const char *name, const char *cluster, INIT_LIST_HEAD(&ls->ls_recover_list); spin_lock_init(&ls->ls_recover_list_lock); - idr_init(&ls->ls_recover_idr); - spin_lock_init(&ls->ls_recover_idr_lock); + xa_init_flags(&ls->ls_recover_array, XA_FLAGS_ALLOC1); ls->ls_recover_list_count = 0; ls->ls_local_handle = ls; init_waitqueue_head(&ls->ls_wait_general); @@ -674,7 +673,6 @@ static int new_lockspace(const char *name, const char *cluster, spin_lock(&lslist_lock); list_del(&ls->ls_list); spin_unlock(&lslist_lock); - idr_destroy(&ls->ls_recover_idr); kfree(ls->ls_recover_buf); out_rsbtbl: for (i = 0; i < DLM_REMOVE_NAMES_MAX; i++) @@ -782,7 +780,6 @@ static int release_lockspace(struct dlm_ls *ls, int force) dlm_delete_debug_file(ls); - idr_destroy(&ls->ls_recover_idr); kfree(ls->ls_recover_buf); /* diff --git a/fs/dlm/recover.c b/fs/dlm/recover.c index 8928e99dfd47..375d1dac495c 100644 --- a/fs/dlm/recover.c +++ b/fs/dlm/recover.c @@ -292,75 +292,60 @@ static void recover_list_clear(struct dlm_ls *ls) spin_unlock(&ls->ls_recover_list_lock); } -static int recover_idr_empty(struct dlm_ls *ls) +static int recover_array_empty(struct dlm_ls *ls) { - int empty = 1; - - spin_lock(&ls->ls_recover_idr_lock); - if (ls->ls_recover_list_count) - empty = 0; - spin_unlock(&ls->ls_recover_idr_lock); - - return empty; + return xa_empty(&ls->ls_recover_array); } -static int recover_idr_add(struct dlm_rsb *r) +static int recover_array_add(struct dlm_rsb *r) { struct dlm_ls *ls = r->res_ls; int rv; - idr_preload(GFP_NOFS); - spin_lock(&ls->ls_recover_idr_lock); + xa_lock(&ls->ls_recover_array); if (r->res_id) { rv = -1; goto out_unlock; } - rv = idr_alloc(&ls->ls_recover_idr, r, 1, 0, GFP_NOWAIT); + rv = __xa_alloc(&ls->ls_recover_array, &r->res_id, r, xa_limit_31b, + GFP_NOFS); if (rv < 0) goto out_unlock; - r->res_id = rv; ls->ls_recover_list_count++; dlm_hold_rsb(r); rv = 0; out_unlock: - spin_unlock(&ls->ls_recover_idr_lock); - idr_preload_end(); + xa_unlock(&ls->ls_recover_array); return rv; } -static void recover_idr_del(struct dlm_rsb *r) +static void recover_array_del(struct dlm_rsb *r) { struct dlm_ls *ls = r->res_ls; - spin_lock(&ls->ls_recover_idr_lock); - idr_remove(&ls->ls_recover_idr, r->res_id); + xa_lock(&ls->ls_recover_array); + __xa_erase(&ls->ls_recover_array, r->res_id); r->res_id = 0; ls->ls_recover_list_count--; - spin_unlock(&ls->ls_recover_idr_lock); + xa_unlock(&ls->ls_recover_array); dlm_put_rsb(r); } -static struct dlm_rsb *recover_idr_find(struct dlm_ls *ls, uint64_t id) +static struct dlm_rsb *recover_array_find(struct dlm_ls *ls, uint64_t id) { - struct dlm_rsb *r; - - spin_lock(&ls->ls_recover_idr_lock); - r = idr_find(&ls->ls_recover_idr, (int)id); - spin_unlock(&ls->ls_recover_idr_lock); - return r; + return xa_load(&ls->ls_recover_array, id); } -static void recover_idr_clear(struct dlm_ls *ls) +static void recover_array_clear(struct dlm_ls *ls) { struct dlm_rsb *r; - int id; - - spin_lock(&ls->ls_recover_idr_lock); + unsigned long id; - idr_for_each_entry(&ls->ls_recover_idr, r, id) { - idr_remove(&ls->ls_recover_idr, id); + xa_lock(&ls->ls_recover_array); + xa_for_each(&ls->ls_recover_array, id, r) { + __xa_erase(&ls->ls_recover_array, id); r->res_id = 0; r->res_recover_locks_count = 0; ls->ls_recover_list_count--; @@ -373,7 +358,7 @@ static void recover_idr_clear(struct dlm_ls *ls) ls->ls_recover_list_count); ls->ls_recover_list_count = 0; } - spin_unlock(&ls->ls_recover_idr_lock); + xa_unlock(&ls->ls_recover_array); } @@ -471,7 +456,7 @@ static int recover_master(struct dlm_rsb *r, unsigned int *count) set_new_master(r); error = 0; } else { - recover_idr_add(r); + recover_array_add(r); error = dlm_send_rcom_lookup(r, dir_nodeid); } @@ -556,10 +541,10 @@ int dlm_recover_masters(struct dlm_ls *ls) log_rinfo(ls, "dlm_recover_masters %u of %u", count, total); - error = dlm_wait_function(ls, &recover_idr_empty); + error = dlm_wait_function(ls, &recover_array_empty); out: if (error) - recover_idr_clear(ls); + recover_array_clear(ls); return error; } @@ -568,7 +553,7 @@ int dlm_recover_master_reply(struct dlm_ls *ls, struct dlm_rcom *rc) struct dlm_rsb *r; int ret_nodeid, new_master; - r = recover_idr_find(ls, rc->rc_id); + r = recover_array_find(ls, rc->rc_id); if (!r) { log_error(ls, "dlm_recover_master_reply no id %llx", (unsigned long long)rc->rc_id); @@ -587,9 +572,9 @@ int dlm_recover_master_reply(struct dlm_ls *ls, struct dlm_rcom *rc) r->res_nodeid = new_master; set_new_master(r); unlock_rsb(r); - recover_idr_del(r); + recover_array_del(r); - if (recover_idr_empty(ls)) + if (recover_array_empty(ls)) wake_up(&ls->ls_wait_general); out: return 0; -- 2.50.1