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
125 void __dlm_lockres_calc_usage(struct dlm_ctxt *dlm, in __dlm_lockres_calc_usage() argument
128 assert_spin_locked(&dlm->spinlock); in __dlm_lockres_calc_usage()
134 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
138 list_add_tail(&res->purge, &dlm->purge_list); in __dlm_lockres_calc_usage()
139 dlm->purge_count++; in __dlm_lockres_calc_usage()
143 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
147 dlm->purge_count--; in __dlm_lockres_calc_usage()
151 void dlm_lockres_calc_usage(struct dlm_ctxt *dlm, in dlm_lockres_calc_usage() argument
154 spin_lock(&dlm->spinlock); in dlm_lockres_calc_usage()
157 __dlm_lockres_calc_usage(dlm, res); in dlm_lockres_calc_usage()
160 spin_unlock(&dlm->spinlock); in dlm_lockres_calc_usage()
169 void __dlm_do_purge_lockres(struct dlm_ctxt *dlm, in __dlm_do_purge_lockres() argument
172 assert_spin_locked(&dlm->spinlock); in __dlm_do_purge_lockres()
177 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
180 dlm->purge_count--; in __dlm_do_purge_lockres()
185 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
190 __dlm_unhash_lockres(dlm, res); in __dlm_do_purge_lockres()
192 spin_lock(&dlm->track_lock); in __dlm_do_purge_lockres()
197 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
200 spin_unlock(&dlm->track_lock); in __dlm_do_purge_lockres()
209 static void dlm_purge_lockres(struct dlm_ctxt *dlm, in dlm_purge_lockres() argument
215 assert_spin_locked(&dlm->spinlock); in dlm_purge_lockres()
218 master = (res->owner == dlm->node_num); in dlm_purge_lockres()
220 mlog(0, "%s: Purging res %.*s, master %d\n", dlm->name, in dlm_purge_lockres()
226 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
234 spin_unlock(&dlm->spinlock); in dlm_purge_lockres()
242 ret = dlm_drop_lockres_ref(dlm, res); in dlm_purge_lockres()
247 spin_lock(&dlm->spinlock); in dlm_purge_lockres()
253 dlm->name, res->lockname.len, res->lockname.name, master); in dlm_purge_lockres()
256 dlm->purge_count--; in dlm_purge_lockres()
261 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
268 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
273 __dlm_unhash_lockres(dlm, res); in dlm_purge_lockres()
275 spin_lock(&dlm->track_lock); in dlm_purge_lockres()
283 spin_unlock(&dlm->track_lock); in dlm_purge_lockres()
295 static void dlm_run_purge_list(struct dlm_ctxt *dlm, in dlm_run_purge_list() argument
302 spin_lock(&dlm->spinlock); in dlm_run_purge_list()
303 run_max = dlm->purge_count; in dlm_run_purge_list()
305 while(run_max && !list_empty(&dlm->purge_list)) { in dlm_run_purge_list()
308 lockres = list_entry(dlm->purge_list.next, in dlm_run_purge_list()
337 dlm->name, lockres->lockname.len, in dlm_run_purge_list()
341 list_move_tail(&lockres->purge, &dlm->purge_list); in dlm_run_purge_list()
348 dlm_purge_lockres(dlm, lockres); in dlm_run_purge_list()
353 cond_resched_lock(&dlm->spinlock); in dlm_run_purge_list()
356 spin_unlock(&dlm->spinlock); in dlm_run_purge_list()
359 static void dlm_shuffle_lists(struct dlm_ctxt *dlm, in dlm_shuffle_lists() argument
371 assert_spin_locked(&dlm->ast_lock); in dlm_shuffle_lists()
380 mlog(0, "%s: res %.*s has locks on the convert queue\n", dlm->name, in dlm_shuffle_lists()
386 dlm->name, res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
398 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
415 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
429 "%d => %d, node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
446 __dlm_queue_ast(dlm, target); in dlm_shuffle_lists()
463 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
477 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
491 "node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
506 __dlm_queue_ast(dlm, target); in dlm_shuffle_lists()
516 void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_kick_thread() argument
519 spin_lock(&dlm->spinlock); in dlm_kick_thread()
521 __dlm_dirty_lockres(dlm, res); in dlm_kick_thread()
523 spin_unlock(&dlm->spinlock); in dlm_kick_thread()
525 wake_up(&dlm->dlm_thread_wq); in dlm_kick_thread()
528 void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_dirty_lockres() argument
530 assert_spin_locked(&dlm->spinlock); in __dlm_dirty_lockres()
534 if ((res->owner == dlm->node_num)) { in __dlm_dirty_lockres()
542 list_add_tail(&res->dirty, &dlm->dirty_list); in __dlm_dirty_lockres()
547 mlog(0, "%s: res %.*s\n", dlm->name, res->lockname.len, in __dlm_dirty_lockres()
553 int dlm_launch_thread(struct dlm_ctxt *dlm) in dlm_launch_thread() argument
557 dlm->dlm_thread_task = kthread_run(dlm_thread, dlm, "dlm-%s", in dlm_launch_thread()
558 dlm->name); in dlm_launch_thread()
559 if (IS_ERR(dlm->dlm_thread_task)) { in dlm_launch_thread()
560 mlog_errno(PTR_ERR(dlm->dlm_thread_task)); in dlm_launch_thread()
561 dlm->dlm_thread_task = NULL; in dlm_launch_thread()
568 void dlm_complete_thread(struct dlm_ctxt *dlm) in dlm_complete_thread() argument
570 if (dlm->dlm_thread_task) { in dlm_complete_thread()
572 kthread_stop(dlm->dlm_thread_task); in dlm_complete_thread()
573 dlm->dlm_thread_task = NULL; in dlm_complete_thread()
577 static int dlm_dirty_list_empty(struct dlm_ctxt *dlm) in dlm_dirty_list_empty() argument
581 spin_lock(&dlm->spinlock); in dlm_dirty_list_empty()
582 empty = list_empty(&dlm->dirty_list); in dlm_dirty_list_empty()
583 spin_unlock(&dlm->spinlock); in dlm_dirty_list_empty()
588 static void dlm_flush_asts(struct dlm_ctxt *dlm) in dlm_flush_asts() argument
595 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
596 while (!list_empty(&dlm->pending_asts)) { in dlm_flush_asts()
597 lock = list_entry(dlm->pending_asts.next, in dlm_flush_asts()
603 "node %u\n", dlm->name, res->lockname.len, in dlm_flush_asts()
614 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
616 if (lock->ml.node != dlm->node_num) { in dlm_flush_asts()
617 ret = dlm_do_remote_ast(dlm, res, lock); in dlm_flush_asts()
621 dlm_do_local_ast(dlm, res, lock); in dlm_flush_asts()
623 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
629 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
637 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
640 while (!list_empty(&dlm->pending_basts)) { in dlm_flush_asts()
641 lock = list_entry(dlm->pending_basts.next, in dlm_flush_asts()
659 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
663 dlm->name, res->lockname.len, res->lockname.name, in dlm_flush_asts()
668 if (lock->ml.node != dlm->node_num) { in dlm_flush_asts()
669 ret = dlm_send_proxy_bast(dlm, res, lock, hi); in dlm_flush_asts()
673 dlm_do_local_bast(dlm, res, lock, hi); in dlm_flush_asts()
675 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
681 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
689 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
691 wake_up(&dlm->ast_wq); in dlm_flush_asts()
692 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
703 struct dlm_ctxt *dlm = data; in dlm_thread() local
706 mlog(0, "dlm thread running for %s...\n", dlm->name); in dlm_thread()
715 dlm_run_purge_list(dlm, dlm_shutting_down(dlm)); in dlm_thread()
724 spin_lock(&dlm->spinlock); in dlm_thread()
725 while (!list_empty(&dlm->dirty_list)) { in dlm_thread()
727 res = list_entry(dlm->dirty_list.next, in dlm_thread()
739 spin_unlock(&dlm->spinlock); in dlm_thread()
746 spin_lock(&dlm->ast_lock); in dlm_thread()
748 if (res->owner != dlm->node_num) { in dlm_thread()
751 " dirty %d\n", dlm->name, in dlm_thread()
757 BUG_ON(res->owner != dlm->node_num); in dlm_thread()
769 spin_unlock(&dlm->ast_lock); in dlm_thread()
771 "shuffle, state %d\n", dlm->name, in dlm_thread()
784 dlm_shuffle_lists(dlm, res); in dlm_thread()
787 spin_unlock(&dlm->ast_lock); in dlm_thread()
789 dlm_lockres_calc_usage(dlm, res); in dlm_thread()
793 spin_lock(&dlm->spinlock); in dlm_thread()
798 __dlm_dirty_lockres(dlm, res); in dlm_thread()
807 dlm->name); in dlm_thread()
812 spin_unlock(&dlm->spinlock); in dlm_thread()
813 dlm_flush_asts(dlm); in dlm_thread()
821 wait_event_interruptible_timeout(dlm->dlm_thread_wq, in dlm_thread()
822 !dlm_dirty_list_empty(dlm) || in dlm_thread()