Lines Matching refs:dlm

55 static void dlm_flush_asts(struct dlm_ctxt *dlm);
57 #define dlm_lock_is_remote(dlm, lock) ((lock)->ml.node != (dlm)->node_num) argument
124 void __dlm_lockres_calc_usage(struct dlm_ctxt *dlm, in __dlm_lockres_calc_usage() argument
127 assert_spin_locked(&dlm->spinlock); in __dlm_lockres_calc_usage()
133 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
137 list_add_tail(&res->purge, &dlm->purge_list); in __dlm_lockres_calc_usage()
138 dlm->purge_count++; in __dlm_lockres_calc_usage()
142 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
146 dlm->purge_count--; in __dlm_lockres_calc_usage()
150 void dlm_lockres_calc_usage(struct dlm_ctxt *dlm, in dlm_lockres_calc_usage() argument
153 spin_lock(&dlm->spinlock); in dlm_lockres_calc_usage()
156 __dlm_lockres_calc_usage(dlm, res); in dlm_lockres_calc_usage()
159 spin_unlock(&dlm->spinlock); in dlm_lockres_calc_usage()
162 static void dlm_purge_lockres(struct dlm_ctxt *dlm, in dlm_purge_lockres() argument
168 assert_spin_locked(&dlm->spinlock); in dlm_purge_lockres()
171 master = (res->owner == dlm->node_num); in dlm_purge_lockres()
173 mlog(0, "%s: Purging res %.*s, master %d\n", dlm->name, in dlm_purge_lockres()
180 spin_unlock(&dlm->spinlock); in dlm_purge_lockres()
188 ret = dlm_drop_lockres_ref(dlm, res); in dlm_purge_lockres()
193 spin_lock(&dlm->spinlock); in dlm_purge_lockres()
199 dlm->name, res->lockname.len, res->lockname.name, master); in dlm_purge_lockres()
202 dlm->purge_count--; in dlm_purge_lockres()
207 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
212 __dlm_unhash_lockres(dlm, res); in dlm_purge_lockres()
214 spin_lock(&dlm->track_lock); in dlm_purge_lockres()
222 spin_unlock(&dlm->track_lock); in dlm_purge_lockres()
234 static void dlm_run_purge_list(struct dlm_ctxt *dlm, in dlm_run_purge_list() argument
241 spin_lock(&dlm->spinlock); in dlm_run_purge_list()
242 run_max = dlm->purge_count; in dlm_run_purge_list()
244 while(run_max && !list_empty(&dlm->purge_list)) { in dlm_run_purge_list()
247 lockres = list_entry(dlm->purge_list.next, in dlm_run_purge_list()
276 dlm->name, lockres->lockname.len, in dlm_run_purge_list()
280 list_move_tail(&lockres->purge, &dlm->purge_list); in dlm_run_purge_list()
287 dlm_purge_lockres(dlm, lockres); in dlm_run_purge_list()
292 cond_resched_lock(&dlm->spinlock); in dlm_run_purge_list()
295 spin_unlock(&dlm->spinlock); in dlm_run_purge_list()
298 static void dlm_shuffle_lists(struct dlm_ctxt *dlm, in dlm_shuffle_lists() argument
310 assert_spin_locked(&dlm->ast_lock); in dlm_shuffle_lists()
319 mlog(0, "%s: res %.*s has locks on the convert queue\n", dlm->name, in dlm_shuffle_lists()
325 dlm->name, res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
337 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
354 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
368 "%d => %d, node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
385 __dlm_queue_ast(dlm, target); in dlm_shuffle_lists()
402 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
416 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
430 "node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
445 __dlm_queue_ast(dlm, target); in dlm_shuffle_lists()
455 void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_kick_thread() argument
458 spin_lock(&dlm->spinlock); in dlm_kick_thread()
460 __dlm_dirty_lockres(dlm, res); in dlm_kick_thread()
462 spin_unlock(&dlm->spinlock); in dlm_kick_thread()
464 wake_up(&dlm->dlm_thread_wq); in dlm_kick_thread()
467 void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_dirty_lockres() argument
469 assert_spin_locked(&dlm->spinlock); in __dlm_dirty_lockres()
473 if ((res->owner == dlm->node_num)) { in __dlm_dirty_lockres()
481 list_add_tail(&res->dirty, &dlm->dirty_list); in __dlm_dirty_lockres()
486 mlog(0, "%s: res %.*s\n", dlm->name, res->lockname.len, in __dlm_dirty_lockres()
492 int dlm_launch_thread(struct dlm_ctxt *dlm) in dlm_launch_thread() argument
496 dlm->dlm_thread_task = kthread_run(dlm_thread, dlm, "dlm-%s", in dlm_launch_thread()
497 dlm->name); in dlm_launch_thread()
498 if (IS_ERR(dlm->dlm_thread_task)) { in dlm_launch_thread()
499 mlog_errno(PTR_ERR(dlm->dlm_thread_task)); in dlm_launch_thread()
500 dlm->dlm_thread_task = NULL; in dlm_launch_thread()
507 void dlm_complete_thread(struct dlm_ctxt *dlm) in dlm_complete_thread() argument
509 if (dlm->dlm_thread_task) { in dlm_complete_thread()
511 kthread_stop(dlm->dlm_thread_task); in dlm_complete_thread()
512 dlm->dlm_thread_task = NULL; in dlm_complete_thread()
516 static int dlm_dirty_list_empty(struct dlm_ctxt *dlm) in dlm_dirty_list_empty() argument
520 spin_lock(&dlm->spinlock); in dlm_dirty_list_empty()
521 empty = list_empty(&dlm->dirty_list); in dlm_dirty_list_empty()
522 spin_unlock(&dlm->spinlock); in dlm_dirty_list_empty()
527 static void dlm_flush_asts(struct dlm_ctxt *dlm) in dlm_flush_asts() argument
534 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
535 while (!list_empty(&dlm->pending_asts)) { in dlm_flush_asts()
536 lock = list_entry(dlm->pending_asts.next, in dlm_flush_asts()
542 "node %u\n", dlm->name, res->lockname.len, in dlm_flush_asts()
553 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
555 if (lock->ml.node != dlm->node_num) { in dlm_flush_asts()
556 ret = dlm_do_remote_ast(dlm, res, lock); in dlm_flush_asts()
560 dlm_do_local_ast(dlm, res, lock); in dlm_flush_asts()
562 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
568 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
576 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
579 while (!list_empty(&dlm->pending_basts)) { in dlm_flush_asts()
580 lock = list_entry(dlm->pending_basts.next, in dlm_flush_asts()
598 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
602 dlm->name, res->lockname.len, res->lockname.name, in dlm_flush_asts()
607 if (lock->ml.node != dlm->node_num) { in dlm_flush_asts()
608 ret = dlm_send_proxy_bast(dlm, res, lock, hi); in dlm_flush_asts()
612 dlm_do_local_bast(dlm, res, lock, hi); in dlm_flush_asts()
614 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
620 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
628 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
630 wake_up(&dlm->ast_wq); in dlm_flush_asts()
631 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
642 struct dlm_ctxt *dlm = data; in dlm_thread() local
645 mlog(0, "dlm thread running for %s...\n", dlm->name); in dlm_thread()
654 dlm_run_purge_list(dlm, dlm_shutting_down(dlm)); in dlm_thread()
663 spin_lock(&dlm->spinlock); in dlm_thread()
664 while (!list_empty(&dlm->dirty_list)) { in dlm_thread()
666 res = list_entry(dlm->dirty_list.next, in dlm_thread()
678 spin_unlock(&dlm->spinlock); in dlm_thread()
685 spin_lock(&dlm->ast_lock); in dlm_thread()
687 if (res->owner != dlm->node_num) { in dlm_thread()
690 " dirty %d\n", dlm->name, in dlm_thread()
696 BUG_ON(res->owner != dlm->node_num); in dlm_thread()
707 spin_unlock(&dlm->ast_lock); in dlm_thread()
709 "shuffle, state %d\n", dlm->name, in dlm_thread()
722 dlm_shuffle_lists(dlm, res); in dlm_thread()
725 spin_unlock(&dlm->ast_lock); in dlm_thread()
727 dlm_lockres_calc_usage(dlm, res); in dlm_thread()
731 spin_lock(&dlm->spinlock); in dlm_thread()
736 __dlm_dirty_lockres(dlm, res); in dlm_thread()
745 dlm->name); in dlm_thread()
750 spin_unlock(&dlm->spinlock); in dlm_thread()
751 dlm_flush_asts(dlm); in dlm_thread()
759 wait_event_interruptible_timeout(dlm->dlm_thread_wq, in dlm_thread()
760 !dlm_dirty_list_empty(dlm) || in dlm_thread()