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()
224 static void dlm_run_purge_list(struct dlm_ctxt *dlm, in dlm_run_purge_list() argument
231 spin_lock(&dlm->spinlock); in dlm_run_purge_list()
232 run_max = dlm->purge_count; in dlm_run_purge_list()
234 while(run_max && !list_empty(&dlm->purge_list)) { in dlm_run_purge_list()
237 lockres = list_entry(dlm->purge_list.next, in dlm_run_purge_list()
266 dlm->name, lockres->lockname.len, in dlm_run_purge_list()
270 list_move_tail(&lockres->purge, &dlm->purge_list); in dlm_run_purge_list()
277 dlm_purge_lockres(dlm, lockres); in dlm_run_purge_list()
282 cond_resched_lock(&dlm->spinlock); in dlm_run_purge_list()
285 spin_unlock(&dlm->spinlock); in dlm_run_purge_list()
288 static void dlm_shuffle_lists(struct dlm_ctxt *dlm, in dlm_shuffle_lists() argument
300 assert_spin_locked(&dlm->ast_lock); in dlm_shuffle_lists()
309 mlog(0, "%s: res %.*s has locks on the convert queue\n", dlm->name, in dlm_shuffle_lists()
315 dlm->name, res->lockname.len, res->lockname.name); in dlm_shuffle_lists()
327 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
344 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
358 "%d => %d, node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
375 __dlm_queue_ast(dlm, target); in dlm_shuffle_lists()
392 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
406 __dlm_queue_bast(dlm, lock); in dlm_shuffle_lists()
420 "node %u\n", dlm->name, res->lockname.len, in dlm_shuffle_lists()
435 __dlm_queue_ast(dlm, target); in dlm_shuffle_lists()
445 void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in dlm_kick_thread() argument
448 spin_lock(&dlm->spinlock); in dlm_kick_thread()
450 __dlm_dirty_lockres(dlm, res); in dlm_kick_thread()
452 spin_unlock(&dlm->spinlock); in dlm_kick_thread()
454 wake_up(&dlm->dlm_thread_wq); in dlm_kick_thread()
457 void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res) in __dlm_dirty_lockres() argument
459 assert_spin_locked(&dlm->spinlock); in __dlm_dirty_lockres()
463 if ((res->owner == dlm->node_num)) { in __dlm_dirty_lockres()
471 list_add_tail(&res->dirty, &dlm->dirty_list); in __dlm_dirty_lockres()
476 mlog(0, "%s: res %.*s\n", dlm->name, res->lockname.len, in __dlm_dirty_lockres()
482 int dlm_launch_thread(struct dlm_ctxt *dlm) in dlm_launch_thread() argument
486 dlm->dlm_thread_task = kthread_run(dlm_thread, dlm, "dlm_thread"); in dlm_launch_thread()
487 if (IS_ERR(dlm->dlm_thread_task)) { in dlm_launch_thread()
488 mlog_errno(PTR_ERR(dlm->dlm_thread_task)); in dlm_launch_thread()
489 dlm->dlm_thread_task = NULL; in dlm_launch_thread()
496 void dlm_complete_thread(struct dlm_ctxt *dlm) in dlm_complete_thread() argument
498 if (dlm->dlm_thread_task) { in dlm_complete_thread()
500 kthread_stop(dlm->dlm_thread_task); in dlm_complete_thread()
501 dlm->dlm_thread_task = NULL; in dlm_complete_thread()
505 static int dlm_dirty_list_empty(struct dlm_ctxt *dlm) in dlm_dirty_list_empty() argument
509 spin_lock(&dlm->spinlock); in dlm_dirty_list_empty()
510 empty = list_empty(&dlm->dirty_list); in dlm_dirty_list_empty()
511 spin_unlock(&dlm->spinlock); in dlm_dirty_list_empty()
516 static void dlm_flush_asts(struct dlm_ctxt *dlm) in dlm_flush_asts() argument
523 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
524 while (!list_empty(&dlm->pending_asts)) { in dlm_flush_asts()
525 lock = list_entry(dlm->pending_asts.next, in dlm_flush_asts()
531 "node %u\n", dlm->name, res->lockname.len, in dlm_flush_asts()
542 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
544 if (lock->ml.node != dlm->node_num) { in dlm_flush_asts()
545 ret = dlm_do_remote_ast(dlm, res, lock); in dlm_flush_asts()
549 dlm_do_local_ast(dlm, res, lock); in dlm_flush_asts()
551 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
557 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
565 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
568 while (!list_empty(&dlm->pending_basts)) { in dlm_flush_asts()
569 lock = list_entry(dlm->pending_basts.next, in dlm_flush_asts()
587 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
591 dlm->name, res->lockname.len, res->lockname.name, in dlm_flush_asts()
596 if (lock->ml.node != dlm->node_num) { in dlm_flush_asts()
597 ret = dlm_send_proxy_bast(dlm, res, lock, hi); in dlm_flush_asts()
601 dlm_do_local_bast(dlm, res, lock, hi); in dlm_flush_asts()
603 spin_lock(&dlm->ast_lock); in dlm_flush_asts()
609 "one\n", dlm->name, res->lockname.len, in dlm_flush_asts()
617 dlm_lockres_release_ast(dlm, res); in dlm_flush_asts()
619 wake_up(&dlm->ast_wq); in dlm_flush_asts()
620 spin_unlock(&dlm->ast_lock); in dlm_flush_asts()
631 struct dlm_ctxt *dlm = data; in dlm_thread() local
634 mlog(0, "dlm thread running for %s...\n", dlm->name); in dlm_thread()
643 dlm_run_purge_list(dlm, dlm_shutting_down(dlm)); in dlm_thread()
652 spin_lock(&dlm->spinlock); in dlm_thread()
653 while (!list_empty(&dlm->dirty_list)) { in dlm_thread()
655 res = list_entry(dlm->dirty_list.next, in dlm_thread()
667 spin_unlock(&dlm->spinlock); in dlm_thread()
674 spin_lock(&dlm->ast_lock); in dlm_thread()
676 if (res->owner != dlm->node_num) { in dlm_thread()
679 " dirty %d\n", dlm->name, in dlm_thread()
685 BUG_ON(res->owner != dlm->node_num); in dlm_thread()
696 spin_unlock(&dlm->ast_lock); in dlm_thread()
698 "shuffle, state %d\n", dlm->name, in dlm_thread()
711 dlm_shuffle_lists(dlm, res); in dlm_thread()
714 spin_unlock(&dlm->ast_lock); in dlm_thread()
716 dlm_lockres_calc_usage(dlm, res); in dlm_thread()
720 spin_lock(&dlm->spinlock); in dlm_thread()
725 __dlm_dirty_lockres(dlm, res); in dlm_thread()
734 dlm->name); in dlm_thread()
739 spin_unlock(&dlm->spinlock); in dlm_thread()
740 dlm_flush_asts(dlm); in dlm_thread()
748 wait_event_interruptible_timeout(dlm->dlm_thread_wq, in dlm_thread()
749 !dlm_dirty_list_empty(dlm) || in dlm_thread()