Lines Matching refs:dlm
40 static void dlm_flush_asts(struct dlm_ctxt *dlm);
42 #define dlm_lock_is_remote(dlm, lock) ((lock)->ml.node != (dlm)->node_num) argument
110 void __dlm_lockres_calc_usage(struct dlm_ctxt *dlm, in __dlm_lockres_calc_usage() argument
113 assert_spin_locked(&dlm->spinlock); in __dlm_lockres_calc_usage()
119 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
123 list_add_tail(&res->purge, &dlm->purge_list); in __dlm_lockres_calc_usage()
124 dlm->purge_count++; in __dlm_lockres_calc_usage()
128 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
132 dlm->purge_count--; in __dlm_lockres_calc_usage()
136 void dlm_lockres_calc_usage(struct dlm_ctxt *dlm, in dlm_lockres_calc_usage() argument
139 spin_lock(&dlm->spinlock); in dlm_lockres_calc_usage()
142 __dlm_lockres_calc_usage(dlm, res); in dlm_lockres_calc_usage()
145 spin_unlock(&dlm->spinlock); in dlm_lockres_calc_usage()
154 void __dlm_do_purge_lockres(struct dlm_ctxt *dlm, in __dlm_do_purge_lockres() argument
157 assert_spin_locked(&dlm->spinlock); in __dlm_do_purge_lockres()
162 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
165 dlm->purge_count--; in __dlm_do_purge_lockres()
170 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
175 __dlm_unhash_lockres(dlm, res); in __dlm_do_purge_lockres()
177 spin_lock(&dlm->track_lock); in __dlm_do_purge_lockres()
182 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
185 spin_unlock(&dlm->track_lock); in __dlm_do_purge_lockres()
194 static void dlm_purge_lockres(struct dlm_ctxt *dlm, in dlm_purge_lockres() argument
200 assert_spin_locked(&dlm->spinlock); in dlm_purge_lockres()
203 master = (res->owner == dlm->node_num); in dlm_purge_lockres()
205 mlog(0, "%s: Purging res %.*s, master %d\n", dlm->name, in dlm_purge_lockres()
211 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
219 spin_unlock(&dlm->spinlock); in dlm_purge_lockres()
227 ret = dlm_drop_lockres_ref(dlm, res); in dlm_purge_lockres()
232 spin_lock(&dlm->spinlock); in dlm_purge_lockres()
238 dlm->name, res->lockname.len, res->lockname.name, master); in dlm_purge_lockres()
241 dlm->purge_count--; in dlm_purge_lockres()
246 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
253 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
258 __dlm_unhash_lockres(dlm, res); in dlm_purge_lockres()
260 spin_lock(&dlm->track_lock); in dlm_purge_lockres()
268 spin_unlock(&dlm->track_lock); in dlm_purge_lockres()
280 static void dlm_run_purge_list(struct dlm_ctxt *dlm, in dlm_run_purge_list() argument
287 spin_lock(&dlm->spinlock); in dlm_run_purge_list()
288 run_max = dlm->purge_count; in dlm_run_purge_list()
290 while(run_max && !list_empty(&dlm->purge_list)) { in dlm_run_purge_list()
293 lockres = list_entry(dlm->purge_list.next, in dlm_run_purge_list()
322 dlm->name, lockres->lockname.len, in dlm_run_purge_list()
326 list_move_tail(&lockres->purge, &dlm->purge_list); in dlm_run_purge_list()
333 dlm_purge_lockres(dlm, lockres); in dlm_run_purge_list()
338 cond_resched_lock(&dlm->spinlock); in dlm_run_purge_list()
341 spin_unlock(&dlm->spinlock); in dlm_run_purge_list()
344 static void dlm_shuffle_lists(struct dlm_ctxt *dlm, in dlm_shuffle_lists() argument
356 assert_spin_locked(&dlm->ast_lock); in dlm_shuffle_lists()
365 mlog(0, "%s: res %.*s has locks on the convert queue\n", dlm->name, in dlm_shuffle_lists()
371 dlm->name, res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
383 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
400 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
414 "%d => %d, node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
431 __dlm_queue_ast(dlm, target); in dlm_shuffle_lists()
448 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
462 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
476 "node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
491 __dlm_queue_ast(dlm, target); in dlm_shuffle_lists()
501 void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_kick_thread() argument
504 spin_lock(&dlm->spinlock); in dlm_kick_thread()
506 __dlm_dirty_lockres(dlm, res); in dlm_kick_thread()
508 spin_unlock(&dlm->spinlock); in dlm_kick_thread()
510 wake_up(&dlm->dlm_thread_wq); in dlm_kick_thread()
513 void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_dirty_lockres() argument
515 assert_spin_locked(&dlm->spinlock); in __dlm_dirty_lockres()
519 if (res->owner == dlm->node_num) { in __dlm_dirty_lockres()
527 list_add_tail(&res->dirty, &dlm->dirty_list); in __dlm_dirty_lockres()
532 mlog(0, "%s: res %.*s\n", dlm->name, res->lockname.len, in __dlm_dirty_lockres()
538 int dlm_launch_thread(struct dlm_ctxt *dlm) in dlm_launch_thread() argument
542 dlm->dlm_thread_task = kthread_run(dlm_thread, dlm, "dlm-%s", in dlm_launch_thread()
543 dlm->name); in dlm_launch_thread()
544 if (IS_ERR(dlm->dlm_thread_task)) { in dlm_launch_thread()
545 mlog_errno(PTR_ERR(dlm->dlm_thread_task)); in dlm_launch_thread()
546 dlm->dlm_thread_task = NULL; in dlm_launch_thread()
553 void dlm_complete_thread(struct dlm_ctxt *dlm) in dlm_complete_thread() argument
555 if (dlm->dlm_thread_task) { in dlm_complete_thread()
557 kthread_stop(dlm->dlm_thread_task); in dlm_complete_thread()
558 dlm->dlm_thread_task = NULL; in dlm_complete_thread()
562 static int dlm_dirty_list_empty(struct dlm_ctxt *dlm) in dlm_dirty_list_empty() argument
566 spin_lock(&dlm->spinlock); in dlm_dirty_list_empty()
567 empty = list_empty(&dlm->dirty_list); in dlm_dirty_list_empty()
568 spin_unlock(&dlm->spinlock); in dlm_dirty_list_empty()
573 static void dlm_flush_asts(struct dlm_ctxt *dlm) in dlm_flush_asts() argument
580 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
581 while (!list_empty(&dlm->pending_asts)) { in dlm_flush_asts()
582 lock = list_entry(dlm->pending_asts.next, in dlm_flush_asts()
588 "node %u\n", dlm->name, res->lockname.len, in dlm_flush_asts()
599 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
601 if (lock->ml.node != dlm->node_num) { in dlm_flush_asts()
602 ret = dlm_do_remote_ast(dlm, res, lock); in dlm_flush_asts()
606 dlm_do_local_ast(dlm, res, lock); in dlm_flush_asts()
608 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
614 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
622 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
625 while (!list_empty(&dlm->pending_basts)) { in dlm_flush_asts()
626 lock = list_entry(dlm->pending_basts.next, in dlm_flush_asts()
644 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
648 dlm->name, res->lockname.len, res->lockname.name, in dlm_flush_asts()
653 if (lock->ml.node != dlm->node_num) { in dlm_flush_asts()
654 ret = dlm_send_proxy_bast(dlm, res, lock, hi); in dlm_flush_asts()
658 dlm_do_local_bast(dlm, res, lock, hi); in dlm_flush_asts()
660 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
666 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
674 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
676 wake_up(&dlm->ast_wq); in dlm_flush_asts()
677 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
688 struct dlm_ctxt *dlm = data; in dlm_thread() local
691 mlog(0, "dlm thread running for %s...\n", dlm->name); in dlm_thread()
700 dlm_run_purge_list(dlm, dlm_shutting_down(dlm)); in dlm_thread()
709 spin_lock(&dlm->spinlock); in dlm_thread()
710 while (!list_empty(&dlm->dirty_list)) { in dlm_thread()
712 res = list_entry(dlm->dirty_list.next, in dlm_thread()
724 spin_unlock(&dlm->spinlock); in dlm_thread()
731 spin_lock(&dlm->ast_lock); in dlm_thread()
733 if (res->owner != dlm->node_num) { in dlm_thread()
736 " dirty %d\n", dlm->name, in dlm_thread()
742 BUG_ON(res->owner != dlm->node_num); in dlm_thread()
754 spin_unlock(&dlm->ast_lock); in dlm_thread()
756 "shuffle, state %d\n", dlm->name, in dlm_thread()
769 dlm_shuffle_lists(dlm, res); in dlm_thread()
772 spin_unlock(&dlm->ast_lock); in dlm_thread()
774 dlm_lockres_calc_usage(dlm, res); in dlm_thread()
778 spin_lock(&dlm->spinlock); in dlm_thread()
783 __dlm_dirty_lockres(dlm, res); in dlm_thread()
792 dlm->name); in dlm_thread()
797 spin_unlock(&dlm->spinlock); in dlm_thread()
798 dlm_flush_asts(dlm); in dlm_thread()
806 wait_event_interruptible_timeout(dlm->dlm_thread_wq, in dlm_thread()
807 !dlm_dirty_list_empty(dlm) || in dlm_thread()