Lines Matching defs:dlm

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