[Devel] Re: [PATCH 0/6] /proc/pid/checkpointable
Sukadev Bhattiprolu
sukadev at linux.vnet.ibm.com
Mon Mar 16 23:39:58 PDT 2009
From: Sukadev Bhattiprolu <sukadev at linux.vnet.ibm.com>
Date: Sat, 14 Mar 2009 10:21:07 -0700
Subject: [PATCH 6/6] Explain reason for task being uncheckpointable
Try to give an useful message on why a task is uncheckpointable.
Signed-off-by: Sukadev Bhattiprolu <sukadev at linux.vnet.ibm.com>
---
checkpoint/checkpoint.c | 13 +++++++++----
fs/proc/base.c | 19 ++++++++++++++++++-
include/linux/checkpoint.h | 7 +++++++
3 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/checkpoint/checkpoint.c b/checkpoint/checkpoint.c
index ad0956c..c8c377d 100644
--- a/checkpoint/checkpoint.c
+++ b/checkpoint/checkpoint.c
@@ -264,18 +264,23 @@ static int cr_write_all_tasks(struct cr_ctx *ctx)
return ret;
}
-int task_checkpointable(struct task_struct *t)
+int __task_checkpointable(struct task_struct *t)
{
if (t->state == TASK_DEAD) {
pr_warning("c/r: task %d is TASK_DEAD\n", task_pid_vnr(t));
- return 0;
+ return CR_DEAD;
}
/* Verify that task is frozen, unless it is self-checkpoint */
if (t != current && !frozen(t))
- return 0;
+ return CR_NOT_FROZEN;
+
+ return CR_CHECKPOINTABLE;
+}
- return 1;
+int task_checkpointable(struct task_struct *t)
+{
+ return __task_checkpointable(t) == CR_CHECKPOINTABLE;
}
static int cr_may_checkpoint_task(struct task_struct *t, struct cr_ctx *ctx)
diff --git a/fs/proc/base.c b/fs/proc/base.c
index 989ca93..6e4c07c 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -2502,9 +2502,26 @@ static int proc_pid_personality(struct seq_file *m, struct pid_namespace *ns,
}
#ifdef CONFIG_CHECKPOINT_RESTART
+static char *explain_checkpointable(int reason)
+{
+ char *message;
+
+ switch(reason) {
+ case CR_CHECKPOINTABLE: message = "1"; break;
+ case CR_DEAD: message = "0 (dead)"; break;
+ case CR_NOT_FROZEN: message = "0 (not frozen)"; break;
+ default: message = "0 (unknown)"; break;
+ }
+ return message;
+}
+
static int proc_pid_checkpointable(struct task_struct *task, char *buffer)
{
- return sprintf(buffer, "%d\n", task_checkpointable(task));
+ int rc;
+
+ rc = __task_checkpointable(task);
+
+ return scnprintf(buffer, PAGE_SIZE, "%s\n", explain_checkpointable(rc));
}
#endif
diff --git a/include/linux/checkpoint.h b/include/linux/checkpoint.h
index d1f53a6..a1eba73 100644
--- a/include/linux/checkpoint.h
+++ b/include/linux/checkpoint.h
@@ -142,6 +142,13 @@ static inline int cr_enabled(void)
return 1;
}
+enum cr_uncheckpointable_reason {
+ CR_CHECKPOINTABLE = 0,
+ CR_DEAD,
+ CR_NOT_FROZEN
+};
+
+int __task_checkpointable(struct task_struct *t);
int task_checkpointable(struct task_struct *t);
#else /* !CONFIG_CHECKPOINT_RESTART */
--
1.5.2.5
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list