[Cbe-oss-dev] [PATCH 8:11] spufs: provide ctxt debug file

Luke Browning lukebr at linux.vnet.ibm.com
Fri May 23 06:10:47 EST 2008


Provide ctxt debug file

Add a ctxt file to the spu virtual file system that shows 
spu context information that is used in scheduling.  This info is
essential for debugging spufs scheduler hangs.  It can also be
used to isolate between application and spufs problems as it shows
a lot of state such as priorities, dispatch counts, ...  It is 
an extremely important tool for supporting cell in the field as 
there is no real alternative at this point.  

This file contains internal spufs state and is subject to change 
at any time.  No applications should depend on it.  The file 
is intended for the use of spufs kernel developers.

Signed-off-by: Luke Browning <lukebrowning at us.ibm.com>

---
Index: linux-2.6.25/arch/powerpc/platforms/cell/spufs/file.c
===================================================================
--- linux-2.6.25.orig/arch/powerpc/platforms/cell/spufs/file.c
+++ linux-2.6.25/arch/powerpc/platforms/cell/spufs/file.c
@@ -2577,6 +2577,59 @@ void spu_switch_log_notify(struct spu *s
 	wake_up(&ctx->switch_log->wait);
 }
 
+static int spufs_show_x_ctxt(struct seq_file *s, void *private)
+{
+	struct spu_context *ctx = s->private;
+	u64 mfc_control_RW;
+
+	mutex_lock(&ctx->state_mutex);
+	if (ctx->spu) {
+		struct spu *spu = ctx->spu;
+		struct spu_priv2 __iomem *priv2 = spu->priv2;
+
+		spin_lock_irq(&spu->register_lock);
+		mfc_control_RW = in_be64(&priv2->mfc_control_RW);
+		spin_unlock_irq(&spu->register_lock);
+	} else {
+		struct spu_state *csa = &ctx->csa;
+
+		mfc_control_RW = csa->priv2.mfc_control_RW;
+	}
+
+	seq_printf(s, "%c flgs(%lx) sflgs(%lx) pri(%d) ts(%d) scnt(0x%04x)"
+		" spu(%02d) %c %lx %lx %lx %lx %x %x\n",
+		ctx->state == SPU_STATE_SAVED ? 'S' : 'R',
+		ctx->flags,
+		ctx->sched_flags,
+		ctx->prio,
+		ctx->time_slice,
+		ctx->sched_count,
+		ctx->spu ? ctx->spu->number : -1,
+		!list_empty(&ctx->rq) ? 'q' : ' ',
+		ctx->csa.class_0_pending,
+		ctx->csa.class_0_dar,
+		ctx->csa.class_1_dsisr,
+		mfc_control_RW,
+		ctx->ops->runcntl_read(ctx),
+		ctx->ops->status_read(ctx));
+
+	mutex_unlock(&ctx->state_mutex);
+
+	return 0;
+}
+
+static int spufs_x_ctxt_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, spufs_show_x_ctxt, SPUFS_I(inode)->i_ctx);
+}
+
+static const struct file_operations spufs_x_ctxt_fops = {
+	.open           = spufs_x_ctxt_open,
+	.read           = seq_read,
+	.llseek         = seq_lseek,
+	.release        = single_release,
+};
+
 struct tree_descr spufs_dir_contents[] = {
 	{ "capabilities", &spufs_caps_fops, 0444, },
 	{ "mem",  &spufs_mem_fops,  0666, },
@@ -2613,6 +2666,7 @@ struct tree_descr spufs_dir_contents[] =
 	{ "tid", &spufs_tid_fops, 0444, },
 	{ "stat", &spufs_stat_fops, 0444, },
 	{ "switch_log", &spufs_switch_log_fops, 0444 },
+	{ "x_ctxt", &spufs_x_ctxt_fops, 0444, },
 	{},
 };
 
@@ -2638,6 +2692,7 @@ struct tree_descr spufs_dir_nosched_cont
 	{ "object-id", &spufs_object_id_ops, 0666, },
 	{ "tid", &spufs_tid_fops, 0444, },
 	{ "stat", &spufs_stat_fops, 0444, },
+	{ "x_ctxt", &spufs_x_ctxt_fops, 0444, },
 	{},
 };
 





More information about the cbe-oss-dev mailing list