Lines Matching refs:dlm

38 static void dlm_flush_asts(struct dlm_ctxt *dlm);
106 void __dlm_lockres_calc_usage(struct dlm_ctxt *dlm, in __dlm_lockres_calc_usage() argument
109 assert_spin_locked(&dlm->spinlock); in __dlm_lockres_calc_usage()
115 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
119 list_add_tail(&res->purge, &dlm->purge_list); in __dlm_lockres_calc_usage()
120 dlm->purge_count++; in __dlm_lockres_calc_usage()
124 dlm->name, res->lockname.len, res->lockname.name); in __dlm_lockres_calc_usage()
128 dlm->purge_count--; in __dlm_lockres_calc_usage()
132 void dlm_lockres_calc_usage(struct dlm_ctxt *dlm, in dlm_lockres_calc_usage() argument
135 spin_lock(&dlm->spinlock); in dlm_lockres_calc_usage()
138 __dlm_lockres_calc_usage(dlm, res); in dlm_lockres_calc_usage()
141 spin_unlock(&dlm->spinlock); in dlm_lockres_calc_usage()
150 void __dlm_do_purge_lockres(struct dlm_ctxt *dlm, in __dlm_do_purge_lockres() argument
153 assert_spin_locked(&dlm->spinlock); in __dlm_do_purge_lockres()
158 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
161 dlm->purge_count--; in __dlm_do_purge_lockres()
166 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
171 __dlm_unhash_lockres(dlm, res); in __dlm_do_purge_lockres()
173 spin_lock(&dlm->track_lock); in __dlm_do_purge_lockres()
178 dlm->name, res->lockname.len, res->lockname.name); in __dlm_do_purge_lockres()
181 spin_unlock(&dlm->track_lock); in __dlm_do_purge_lockres()
190 static void dlm_purge_lockres(struct dlm_ctxt *dlm, in dlm_purge_lockres() argument
196 assert_spin_locked(&dlm->spinlock); in dlm_purge_lockres()
199 master = (res->owner == dlm->node_num); in dlm_purge_lockres()
201 mlog(0, "%s: Purging res %.*s, master %d\n", dlm->name, in dlm_purge_lockres()
207 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
215 spin_unlock(&dlm->spinlock); in dlm_purge_lockres()
223 ret = dlm_drop_lockres_ref(dlm, res); in dlm_purge_lockres()
228 spin_lock(&dlm->spinlock); in dlm_purge_lockres()
234 dlm->name, res->lockname.len, res->lockname.name, master); in dlm_purge_lockres()
237 dlm->purge_count--; in dlm_purge_lockres()
242 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
249 dlm->name, res->lockname.len, res->lockname.name); in dlm_purge_lockres()
254 __dlm_unhash_lockres(dlm, res); in dlm_purge_lockres()
256 spin_lock(&dlm->track_lock); in dlm_purge_lockres()
264 spin_unlock(&dlm->track_lock); in dlm_purge_lockres()
276 static void dlm_run_purge_list(struct dlm_ctxt *dlm, in dlm_run_purge_list() argument
283 spin_lock(&dlm->spinlock); in dlm_run_purge_list()
284 run_max = dlm->purge_count; in dlm_run_purge_list()
286 while(run_max && !list_empty(&dlm->purge_list)) { in dlm_run_purge_list()
289 lockres = list_entry(dlm->purge_list.next, in dlm_run_purge_list()
318 dlm->name, lockres->lockname.len, in dlm_run_purge_list()
322 list_move_tail(&lockres->purge, &dlm->purge_list); in dlm_run_purge_list()
329 dlm_purge_lockres(dlm, lockres); in dlm_run_purge_list()
334 cond_resched_lock(&dlm->spinlock); in dlm_run_purge_list()
337 spin_unlock(&dlm->spinlock); in dlm_run_purge_list()
340 static void dlm_shuffle_lists(struct dlm_ctxt *dlm, in dlm_shuffle_lists() argument
352 assert_spin_locked(&dlm->ast_lock); in dlm_shuffle_lists()
361 mlog(0, "%s: res %.*s has locks on the convert queue\n", dlm->name, in dlm_shuffle_lists()
367 dlm->name, res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
379 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
396 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
410 "%d => %d, node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
427 __dlm_queue_ast(dlm, target); in dlm_shuffle_lists()
444 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
458 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
472 "node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
487 __dlm_queue_ast(dlm, target); in dlm_shuffle_lists()
497 void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_kick_thread() argument
500 spin_lock(&dlm->spinlock); in dlm_kick_thread()
502 __dlm_dirty_lockres(dlm, res); in dlm_kick_thread()
504 spin_unlock(&dlm->spinlock); in dlm_kick_thread()
506 wake_up(&dlm->dlm_thread_wq); in dlm_kick_thread()
509 void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_dirty_lockres() argument
511 assert_spin_locked(&dlm->spinlock); in __dlm_dirty_lockres()
515 if (res->owner == dlm->node_num) { in __dlm_dirty_lockres()
523 list_add_tail(&res->dirty, &dlm->dirty_list); in __dlm_dirty_lockres()
528 mlog(0, "%s: res %.*s\n", dlm->name, res->lockname.len, in __dlm_dirty_lockres()
534 int dlm_launch_thread(struct dlm_ctxt *dlm) in dlm_launch_thread() argument
538 dlm->dlm_thread_task = kthread_run(dlm_thread, dlm, "dlm-%s", in dlm_launch_thread()
539 dlm->name); in dlm_launch_thread()
540 if (IS_ERR(dlm->dlm_thread_task)) { in dlm_launch_thread()
541 mlog_errno(PTR_ERR(dlm->dlm_thread_task)); in dlm_launch_thread()
542 dlm->dlm_thread_task = NULL; in dlm_launch_thread()
549 void dlm_complete_thread(struct dlm_ctxt *dlm) in dlm_complete_thread() argument
551 if (dlm->dlm_thread_task) { in dlm_complete_thread()
553 kthread_stop(dlm->dlm_thread_task); in dlm_complete_thread()
554 dlm->dlm_thread_task = NULL; in dlm_complete_thread()
558 static int dlm_dirty_list_empty(struct dlm_ctxt *dlm) in dlm_dirty_list_empty() argument
562 spin_lock(&dlm->spinlock); in dlm_dirty_list_empty()
563 empty = list_empty(&dlm->dirty_list); in dlm_dirty_list_empty()
564 spin_unlock(&dlm->spinlock); in dlm_dirty_list_empty()
569 static void dlm_flush_asts(struct dlm_ctxt *dlm) in dlm_flush_asts() argument
576 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
577 while (!list_empty(&dlm->pending_asts)) { in dlm_flush_asts()
578 lock = list_entry(dlm->pending_asts.next, in dlm_flush_asts()
584 "node %u\n", dlm->name, res->lockname.len, in dlm_flush_asts()
595 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
597 if (lock->ml.node != dlm->node_num) { in dlm_flush_asts()
598 ret = dlm_do_remote_ast(dlm, res, lock); in dlm_flush_asts()
602 dlm_do_local_ast(dlm, res, lock); in dlm_flush_asts()
604 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
610 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
618 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
621 while (!list_empty(&dlm->pending_basts)) { in dlm_flush_asts()
622 lock = list_entry(dlm->pending_basts.next, in dlm_flush_asts()
640 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
644 dlm->name, res->lockname.len, res->lockname.name, in dlm_flush_asts()
649 if (lock->ml.node != dlm->node_num) { in dlm_flush_asts()
650 ret = dlm_send_proxy_bast(dlm, res, lock, hi); in dlm_flush_asts()
654 dlm_do_local_bast(dlm, res, lock, hi); in dlm_flush_asts()
656 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
662 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
670 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
672 wake_up(&dlm->ast_wq); in dlm_flush_asts()
673 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
683 struct dlm_ctxt *dlm = data; in dlm_thread() local
686 mlog(0, "dlm thread running for %s...\n", dlm->name); in dlm_thread()
695 dlm_run_purge_list(dlm, dlm_shutting_down(dlm)); in dlm_thread()
704 spin_lock(&dlm->spinlock); in dlm_thread()
705 while (!list_empty(&dlm->dirty_list)) { in dlm_thread()
707 res = list_entry(dlm->dirty_list.next, in dlm_thread()
719 spin_unlock(&dlm->spinlock); in dlm_thread()
726 spin_lock(&dlm->ast_lock); in dlm_thread()
728 if (res->owner != dlm->node_num) { in dlm_thread()
731 " dirty %d\n", dlm->name, in dlm_thread()
737 BUG_ON(res->owner != dlm->node_num); in dlm_thread()
749 spin_unlock(&dlm->ast_lock); in dlm_thread()
751 "shuffle, state %d\n", dlm->name, in dlm_thread()
764 dlm_shuffle_lists(dlm, res); in dlm_thread()
767 spin_unlock(&dlm->ast_lock); in dlm_thread()
769 dlm_lockres_calc_usage(dlm, res); in dlm_thread()
773 spin_lock(&dlm->spinlock); in dlm_thread()
778 __dlm_dirty_lockres(dlm, res); in dlm_thread()
787 dlm->name); in dlm_thread()
792 spin_unlock(&dlm->spinlock); in dlm_thread()
793 dlm_flush_asts(dlm); in dlm_thread()
801 wait_event_interruptible_timeout(dlm->dlm_thread_wq, in dlm_thread()
802 !dlm_dirty_list_empty(dlm) || in dlm_thread()