/** * cr_hand_abort - wrapper/helper for CR_OP_HAND_ABORT * @file: (struct file *) of the control node * @flags: abort type * * DESCRIPTION: * This function dispatches to the checkpoint-time or restart-time * "abort" code. */ int cr_hand_abort(struct file *filp, unsigned int flags) { cr_task_t *cr_task; int retval; CR_KTRACE_FUNC_ENTRY(); // Lookup this task retval = -ESRCH; cr_task = cr_task_get(current); if (!cr_task) { // No matching task found. CR_ERR("%s: No matching task found!", __FUNCTION__); goto out_no_task; } // Dispatch according to the matching request if (cr_task->chkpt_proc_req) { retval = cr_chkpt_abort(cr_task, flags); } else if (cr_task->rstrt_proc_req) { retval = cr_rstrt_abort(cr_task, flags); } else { // No matching request found. CR_ERR("%s: No matching request found!", __FUNCTION__); } cr_task_put(cr_task); out_no_task: CR_KTRACE_FUNC_EXIT("Returning %d", retval); return retval; }
// Called to wait on a barrier int __cr_barrier_wait(cr_barrier_t *barrier) { #if CRI_DEBUG DECLARE_WAIT_QUEUE_HEAD_ONSTACK(dummy); const int interval = 60; int sum = 0; do { wait_event_timeout(barrier->wait, CR_BARRIER_WAIT_COND(barrier), interval * HZ); if (CR_BARRIER_WAIT_COND(barrier)) break; sum += interval; CR_ERR("cr_barrier warning: tgid/pid %d/%d still blocked after %d seconds, with signal_pending=%d.", current->tgid, current->pid, sum, signal_pending(current)); } while (1); smp_rmb(); if (barrier->interrupted) { CR_ERR("cr_barrier error: interrupt on non-interruptible barrier"); } #else wait_event(barrier->wait, CR_BARRIER_WAIT_COND(barrier)); #endif return do_barrier_once(barrier); }
/** * cr_proc_init - Initialization code * * DESCRIPTION: * This function registers /proc/checkpoint and /proc/checkpoint/ctrl */ int __init cr_proc_init(void) { CR_KTRACE_FUNC_ENTRY(); proc_checkpoint = create_proc_entry("checkpoint", S_IFDIR, cr_proc_root); if (proc_checkpoint == NULL) { CR_ERR("proc_create_entry(/proc/checkpoint/) failed"); return -ENOMEM; } proc_ctrl = create_proc_entry("ctrl", S_IFREG | S_IRUGO | S_IWUGO, proc_checkpoint); if (proc_ctrl == NULL) { CR_ERR("proc_create_entry(/proc/checkpoint/ctrl) failed"); return -ENOMEM; } proc_ctrl->proc_fops = &cr_ctrl_fops; return 0; }
/** * cr_hand_complete - wrapper/helper for CR_OP_HAND_DONE * @file: (struct file *) of the control node * * DESCRIPTION: * This function dispatches to the checkpoint-time or restart-time * post-handler "task_complete" code. */ int cr_hand_complete(struct file *filp, unsigned int flags) { cr_task_t *cr_task; int retval; CR_KTRACE_FUNC_ENTRY(); retval = -EINVAL; if (flags & ~CR_HOLD_BOTH) { CR_ERR("%s: invalid flags", __FUNCTION__); goto out_no_task; } // Lookup this task retval = -ESRCH; cr_task = cr_task_get(current); if (!cr_task) { // No matching task found. CR_ERR("%s: No matching task found!", __FUNCTION__); goto out_no_task; } // Dispatch according to the matching request if (cr_task->chkpt_proc_req) { retval = cr_chkpt_task_complete(cr_task, flags & CR_HOLD_CONT); } else if (cr_task->rstrt_proc_req) { retval = cr_rstrt_task_complete(cr_task, flags & CR_HOLD_RSTRT, /* need_lock= */ 1); } else { // No matching request found. CR_ERR("%s: No matching request found!", __FUNCTION__); } cr_task_put(cr_task); out_no_task: CR_KTRACE_FUNC_EXIT("Returning %d", retval); return retval; }