Re: [RFC v16][PATCH 19/43] c/r: external checkpoint of a task other than ourself
From: Alexey Dobriyan <hidden>
Date: 2009-05-27 21:20:04
Also in:
linux-mm, lkml
On Wed, May 27, 2009 at 01:32:45PM -0400, Oren Laadan wrote:
Now we can do "external" checkpoint, i.e. act on another task.
+static int may_checkpoint_task(struct ckpt_ctx *ctx, struct task_struct *t)
+{
+ if (t->state == TASK_DEAD) {
+ pr_warning("c/r: task %d is TASK_DEAD\n", task_pid_vnr(t));
+ return -EAGAIN;
+ }
+
+ if (!ptrace_may_access(t, PTRACE_MODE_READ)) {
+ __ckpt_write_err(ctx, "access to task %d (%s) denied",
+ task_pid_vnr(t), t->comm);
+ return -EPERM;
+ }
+
+ /* verify that the task is frozen (unless self) */
+ if (t != current && !frozen(t)) {
+ __ckpt_write_err(ctx, "task %d (%s) is not frozen",
+ task_pid_vnr(t), t->comm);
+ return -EBUSY;
+ }
+
+ /* FIX: add support for ptraced tasks */
+ if (task_ptrace(t)) {
+ __ckpt_write_err(ctx, "task %d (%s) is ptraced",
+ task_pid_vnr(t), t->comm);
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
+static int get_container(struct ckpt_ctx *ctx, pid_t pid)
+{
+ struct task_struct *task = NULL;
+ struct nsproxy *nsproxy = NULL;
+ int ret;
+
+ ctx->root_pid = pid;
+
+ read_lock(&tasklist_lock);
+ task = find_task_by_vpid(pid);
+ if (task)
+ get_task_struct(task);
+ read_unlock(&tasklist_lock);
+
+ if (!task)
+ return -ESRCH;
+
+ ret = may_checkpoint_task(ctx, task);
+ if (ret) {
+ ckpt_write_err(ctx, NULL);
+ put_task_struct(task);
+ return ret;
+ }
+
+ rcu_read_lock();
+ nsproxy = task_nsproxy(task);
+ get_nsproxy(nsproxy);Will oops if init is multi-threaded and thread group leader exited (nsproxy = NULL). I need to think what to do, too.
+ rcu_read_unlock(); + + ctx->root_task = task; + ctx->root_nsproxy = nsproxy; + + return 0; +}
-- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>