コード例 #1
0
ファイル: cr_fops.c プロジェクト: AvengerMoJo/apc-8750
/**
 * 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;
}
コード例 #2
0
ファイル: cr_barrier.c プロジェクト: AvengerMoJo/apc-8750
// 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);
}
コード例 #3
0
/**
 * 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;
}
コード例 #4
0
ファイル: cr_fops.c プロジェクト: AvengerMoJo/apc-8750
/**
 * 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;
}