Lines Matching refs:dlm
40 static void dlm_flush_asts(struct dlm_ctxt *dlm);
108 void __dlm_lockres_calc_usage(struct dlm_ctxt *dlm, in __dlm_lockres_calc_usage() argument
111 assert_spin_locked(&dlm->spinlock); in __dlm_lockres_calc_usage()
117 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
121 list_add_tail(&res->purge, &dlm->purge_list); in __dlm_lockres_calc_usage()
122 dlm->purge_count++; in __dlm_lockres_calc_usage()
126 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
130 dlm->purge_count--; in __dlm_lockres_calc_usage()
134 void dlm_lockres_calc_usage(struct dlm_ctxt *dlm, in dlm_lockres_calc_usage() argument
137 spin_lock(&dlm->spinlock); in dlm_lockres_calc_usage()
140 __dlm_lockres_calc_usage(dlm, res); in dlm_lockres_calc_usage()
143 spin_unlock(&dlm->spinlock); in dlm_lockres_calc_usage()
152 void __dlm_do_purge_lockres(struct dlm_ctxt *dlm, in __dlm_do_purge_lockres() argument
155 assert_spin_locked(&dlm->spinlock); in __dlm_do_purge_lockres()
160 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
163 dlm->purge_count--; in __dlm_do_purge_lockres()
168 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
173 __dlm_unhash_lockres(dlm, res); in __dlm_do_purge_lockres()
175 spin_lock(&dlm->track_lock); in __dlm_do_purge_lockres()
180 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
183 spin_unlock(&dlm->track_lock); in __dlm_do_purge_lockres()
192 static void dlm_purge_lockres(struct dlm_ctxt *dlm, in dlm_purge_lockres() argument
198 assert_spin_locked(&dlm->spinlock); in dlm_purge_lockres()
201 master = (res->owner == dlm->node_num); in dlm_purge_lockres()
203 mlog(0, "%s: Purging res %.*s, master %d\n", dlm->name, in dlm_purge_lockres()
209 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
217 spin_unlock(&dlm->spinlock); in dlm_purge_lockres()
225 ret = dlm_drop_lockres_ref(dlm, res); in dlm_purge_lockres()
230 spin_lock(&dlm->spinlock); in dlm_purge_lockres()
236 dlm->name, res->lockname.len, res->lockname.name, master); in dlm_purge_lockres()
239 dlm->purge_count--; in dlm_purge_lockres()
244 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
251 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
256 __dlm_unhash_lockres(dlm, res); in dlm_purge_lockres()
258 spin_lock(&dlm->track_lock); in dlm_purge_lockres()
266 spin_unlock(&dlm->track_lock); in dlm_purge_lockres()
278 static void dlm_run_purge_list(struct dlm_ctxt *dlm, in dlm_run_purge_list() argument
285 spin_lock(&dlm->spinlock); in dlm_run_purge_list()
286 run_max = dlm->purge_count; in dlm_run_purge_list()
288 while(run_max && !list_empty(&dlm->purge_list)) { in dlm_run_purge_list()
291 lockres = list_entry(dlm->purge_list.next, in dlm_run_purge_list()
320 dlm->name, lockres->lockname.len, in dlm_run_purge_list()
324 list_move_tail(&lockres->purge, &dlm->purge_list); in dlm_run_purge_list()
331 dlm_purge_lockres(dlm, lockres); in dlm_run_purge_list()
336 cond_resched_lock(&dlm->spinlock); in dlm_run_purge_list()
339 spin_unlock(&dlm->spinlock); in dlm_run_purge_list()
342 static void dlm_shuffle_lists(struct dlm_ctxt *dlm, in dlm_shuffle_lists() argument
354 assert_spin_locked(&dlm->ast_lock); in dlm_shuffle_lists()
363 mlog(0, "%s: res %.*s has locks on the convert queue\n", dlm->name, in dlm_shuffle_lists()
369 dlm->name, res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
381 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
398 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
412 "%d => %d, node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
429 __dlm_queue_ast(dlm, target); in dlm_shuffle_lists()
446 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
460 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
474 "node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
489 __dlm_queue_ast(dlm, target); in dlm_shuffle_lists()
499 void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_kick_thread() argument
502 spin_lock(&dlm->spinlock); in dlm_kick_thread()
504 __dlm_dirty_lockres(dlm, res); in dlm_kick_thread()
506 spin_unlock(&dlm->spinlock); in dlm_kick_thread()
508 wake_up(&dlm->dlm_thread_wq); in dlm_kick_thread()
511 void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_dirty_lockres() argument
513 assert_spin_locked(&dlm->spinlock); in __dlm_dirty_lockres()
517 if (res->owner == dlm->node_num) { in __dlm_dirty_lockres()
525 list_add_tail(&res->dirty, &dlm->dirty_list); in __dlm_dirty_lockres()
530 mlog(0, "%s: res %.*s\n", dlm->name, res->lockname.len, in __dlm_dirty_lockres()
536 int dlm_launch_thread(struct dlm_ctxt *dlm) in dlm_launch_thread() argument
540 dlm->dlm_thread_task = kthread_run(dlm_thread, dlm, "dlm-%s", in dlm_launch_thread()
541 dlm->name); in dlm_launch_thread()
542 if (IS_ERR(dlm->dlm_thread_task)) { in dlm_launch_thread()
543 mlog_errno(PTR_ERR(dlm->dlm_thread_task)); in dlm_launch_thread()
544 dlm->dlm_thread_task = NULL; in dlm_launch_thread()
551 void dlm_complete_thread(struct dlm_ctxt *dlm) in dlm_complete_thread() argument
553 if (dlm->dlm_thread_task) { in dlm_complete_thread()
555 kthread_stop(dlm->dlm_thread_task); in dlm_complete_thread()
556 dlm->dlm_thread_task = NULL; in dlm_complete_thread()
560 static int dlm_dirty_list_empty(struct dlm_ctxt *dlm) in dlm_dirty_list_empty() argument
564 spin_lock(&dlm->spinlock); in dlm_dirty_list_empty()
565 empty = list_empty(&dlm->dirty_list); in dlm_dirty_list_empty()
566 spin_unlock(&dlm->spinlock); in dlm_dirty_list_empty()
571 static void dlm_flush_asts(struct dlm_ctxt *dlm) in dlm_flush_asts() argument
578 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
579 while (!list_empty(&dlm->pending_asts)) { in dlm_flush_asts()
580 lock = list_entry(dlm->pending_asts.next, in dlm_flush_asts()
586 "node %u\n", dlm->name, res->lockname.len, in dlm_flush_asts()
597 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
599 if (lock->ml.node != dlm->node_num) { in dlm_flush_asts()
600 ret = dlm_do_remote_ast(dlm, res, lock); in dlm_flush_asts()
604 dlm_do_local_ast(dlm, res, lock); in dlm_flush_asts()
606 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
612 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
620 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
623 while (!list_empty(&dlm->pending_basts)) { in dlm_flush_asts()
624 lock = list_entry(dlm->pending_basts.next, in dlm_flush_asts()
642 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
646 dlm->name, res->lockname.len, res->lockname.name, in dlm_flush_asts()
651 if (lock->ml.node != dlm->node_num) { in dlm_flush_asts()
652 ret = dlm_send_proxy_bast(dlm, res, lock, hi); in dlm_flush_asts()
656 dlm_do_local_bast(dlm, res, lock, hi); in dlm_flush_asts()
658 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
664 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
672 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
674 wake_up(&dlm->ast_wq); in dlm_flush_asts()
675 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
685 struct dlm_ctxt *dlm = data; in dlm_thread() local
688 mlog(0, "dlm thread running for %s...\n", dlm->name); in dlm_thread()
697 dlm_run_purge_list(dlm, dlm_shutting_down(dlm)); in dlm_thread()
706 spin_lock(&dlm->spinlock); in dlm_thread()
707 while (!list_empty(&dlm->dirty_list)) { in dlm_thread()
709 res = list_entry(dlm->dirty_list.next, in dlm_thread()
721 spin_unlock(&dlm->spinlock); in dlm_thread()
728 spin_lock(&dlm->ast_lock); in dlm_thread()
730 if (res->owner != dlm->node_num) { in dlm_thread()
733 " dirty %d\n", dlm->name, in dlm_thread()
739 BUG_ON(res->owner != dlm->node_num); in dlm_thread()
751 spin_unlock(&dlm->ast_lock); in dlm_thread()
753 "shuffle, state %d\n", dlm->name, in dlm_thread()
766 dlm_shuffle_lists(dlm, res); in dlm_thread()
769 spin_unlock(&dlm->ast_lock); in dlm_thread()
771 dlm_lockres_calc_usage(dlm, res); in dlm_thread()
775 spin_lock(&dlm->spinlock); in dlm_thread()
780 __dlm_dirty_lockres(dlm, res); in dlm_thread()
789 dlm->name); in dlm_thread()
794 spin_unlock(&dlm->spinlock); in dlm_thread()
795 dlm_flush_asts(dlm); in dlm_thread()
803 wait_event_interruptible_timeout(dlm->dlm_thread_wq, in dlm_thread()
804 !dlm_dirty_list_empty(dlm) || in dlm_thread()