Lines Matching defs:dlm

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