[PATCH] spufs: move spu_run call to its own file
authorArnd Bergmann <arnd@arndb.de>
Wed, 4 Jan 2006 19:31:29 +0000 (20:31 +0100)
committerPaul Mackerras <paulus@samba.org>
Mon, 9 Jan 2006 04:44:45 +0000 (15:44 +1100)
The logic for sys_spu_run keeps growing and it does
not really belong into file.c any more since we
moved away from using regular file operations to our
own syscall.

No functional change in here.

Signed-off-by: Arnd Bergmann <arndb@de.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/platforms/cell/spufs/Makefile
arch/powerpc/platforms/cell/spufs/file.c
arch/powerpc/platforms/cell/spufs/run.c [new file with mode: 0644]
arch/powerpc/platforms/cell/spufs/spufs.h

index 9bfaba8791e3db803b88bc5aae6dc9a6f99b6b81..a7cddf40e3d92573f7d7849528b71f196cffbeaf 100644 (file)
@@ -1,6 +1,6 @@
 obj-$(CONFIG_SPU_FS) += spufs.o
 spufs-y += inode.o file.o context.o switch.o syscalls.o
-spufs-y += sched.o backing_ops.o hw_ops.o
+spufs-y += sched.o backing_ops.o hw_ops.o run.o
 
 # Rules to build switch.o with the help of SPU tool chain
 SPU_CROSS      := spu-
index e63426822fd522e32411db58ca6f259b4512b858..dfa649c9b95662ea2605ca18dc94207dc5e5e493 100644 (file)
@@ -304,34 +304,6 @@ static struct file_operations spufs_mbox_stat_fops = {
        .read   = spufs_mbox_stat_read,
 };
 
-/*
- * spufs_wait
- *     Same as wait_event_interruptible(), except that here
- *     we need to call spu_release(ctx) before sleeping, and
- *     then spu_acquire(ctx) when awoken.
- */
-
-#define spufs_wait(wq, condition)                                      \
-({                                                                     \
-       int __ret = 0;                                                  \
-       DEFINE_WAIT(__wait);                                            \
-       for (;;) {                                                      \
-               prepare_to_wait(&(wq), &__wait, TASK_INTERRUPTIBLE);    \
-               if (condition)                                          \
-                       break;                                          \
-               if (!signal_pending(current)) {                         \
-                       spu_release(ctx);                               \
-                       schedule();                                     \
-                       spu_acquire(ctx);                               \
-                       continue;                                       \
-               }                                                       \
-               __ret = -ERESTARTSYS;                                   \
-               break;                                                  \
-       }                                                               \
-       finish_wait(&(wq), &__wait);                                    \
-       __ret;                                                          \
-})
-
 /* low-level ibox access function */
 size_t spu_ibox_read(struct spu_context *ctx, u32 *data)
 {
@@ -529,130 +501,6 @@ static struct file_operations spufs_wbox_stat_fops = {
        .read   = spufs_wbox_stat_read,
 };
 
-/* interrupt-level stop callback function. */
-void spufs_stop_callback(struct spu *spu)
-{
-       struct spu_context *ctx = spu->ctx;
-
-       wake_up_all(&ctx->stop_wq);
-}
-
-static inline int spu_stopped(struct spu_context *ctx, u32 * stat)
-{
-       struct spu *spu;
-       u64 pte_fault;
-
-       *stat = ctx->ops->status_read(ctx);
-       if (ctx->state != SPU_STATE_RUNNABLE)
-               return 1;
-       spu = ctx->spu;
-       pte_fault = spu->dsisr &
-           (MFC_DSISR_PTE_NOT_FOUND | MFC_DSISR_ACCESS_DENIED);
-       return (!(*stat & 0x1) || pte_fault || spu->class_0_pending) ? 1 : 0;
-}
-
-static inline int spu_run_init(struct spu_context *ctx, u32 * npc,
-                              u32 * status)
-{
-       int ret;
-
-       if ((ret = spu_acquire_runnable(ctx)) != 0)
-               return ret;
-       ctx->ops->npc_write(ctx, *npc);
-       ctx->ops->runcntl_write(ctx, SPU_RUNCNTL_RUNNABLE);
-       return 0;
-}
-
-static inline int spu_run_fini(struct spu_context *ctx, u32 * npc,
-                              u32 * status)
-{
-       int ret = 0;
-
-       *status = ctx->ops->status_read(ctx);
-       *npc = ctx->ops->npc_read(ctx);
-       spu_release(ctx);
-
-       if (signal_pending(current))
-               ret = -ERESTARTSYS;
-       if (unlikely(current->ptrace & PT_PTRACED)) {
-               if ((*status & SPU_STATUS_STOPPED_BY_STOP)
-                   && (*status >> SPU_STOP_STATUS_SHIFT) == 0x3fff) {
-                       force_sig(SIGTRAP, current);
-                       ret = -ERESTARTSYS;
-               }
-       }
-       return ret;
-}
-
-static inline int spu_reacquire_runnable(struct spu_context *ctx, u32 *npc,
-                                        u32 *status)
-{
-       int ret;
-
-       if ((ret = spu_run_fini(ctx, npc, status)) != 0)
-               return ret;
-       if (*status & (SPU_STATUS_STOPPED_BY_STOP |
-                      SPU_STATUS_STOPPED_BY_HALT)) {
-               return *status;
-       }
-       if ((ret = spu_run_init(ctx, npc, status)) != 0)
-               return ret;
-       return 0;
-}
-
-static inline int spu_process_events(struct spu_context *ctx)
-{
-       struct spu *spu = ctx->spu;
-       u64 pte_fault = MFC_DSISR_PTE_NOT_FOUND | MFC_DSISR_ACCESS_DENIED;
-       int ret = 0;
-
-       if (spu->dsisr & pte_fault)
-               ret = spu_irq_class_1_bottom(spu);
-       if (spu->class_0_pending)
-               ret = spu_irq_class_0_bottom(spu);
-       if (!ret && signal_pending(current))
-               ret = -ERESTARTSYS;
-       return ret;
-}
-
-long spufs_run_spu(struct file *file, struct spu_context *ctx,
-                  u32 * npc, u32 * status)
-{
-       int ret;
-
-       if (down_interruptible(&ctx->run_sema))
-               return -ERESTARTSYS;
-
-       ret = spu_run_init(ctx, npc, status);
-       if (ret)
-               goto out;
-
-       do {
-               ret = spufs_wait(ctx->stop_wq, spu_stopped(ctx, status));
-               if (unlikely(ret))
-                       break;
-               if (unlikely(ctx->state != SPU_STATE_RUNNABLE)) {
-                       ret = spu_reacquire_runnable(ctx, npc, status);
-                       if (ret)
-                               goto out;
-                       continue;
-               }
-               ret = spu_process_events(ctx);
-
-       } while (!ret && !(*status & (SPU_STATUS_STOPPED_BY_STOP |
-                                     SPU_STATUS_STOPPED_BY_HALT)));
-
-       ctx->ops->runcntl_stop(ctx);
-       ret = spu_run_fini(ctx, npc, status);
-       if (!ret)
-               ret = *status;
-       spu_yield(ctx);
-
-out:
-       up(&ctx->run_sema);
-       return ret;
-}
-
 static ssize_t spufs_signal1_read(struct file *file, char __user *buf,
                        size_t len, loff_t *pos)
 {
diff --git a/arch/powerpc/platforms/cell/spufs/run.c b/arch/powerpc/platforms/cell/spufs/run.c
new file mode 100644 (file)
index 0000000..18ea886
--- /dev/null
@@ -0,0 +1,131 @@
+#include <linux/wait.h>
+#include <linux/ptrace.h>
+
+#include <asm/spu.h>
+
+#include "spufs.h"
+
+/* interrupt-level stop callback function. */
+void spufs_stop_callback(struct spu *spu)
+{
+       struct spu_context *ctx = spu->ctx;
+
+       wake_up_all(&ctx->stop_wq);
+}
+
+static inline int spu_stopped(struct spu_context *ctx, u32 * stat)
+{
+       struct spu *spu;
+       u64 pte_fault;
+
+       *stat = ctx->ops->status_read(ctx);
+       if (ctx->state != SPU_STATE_RUNNABLE)
+               return 1;
+       spu = ctx->spu;
+       pte_fault = spu->dsisr &
+           (MFC_DSISR_PTE_NOT_FOUND | MFC_DSISR_ACCESS_DENIED);
+       return (!(*stat & 0x1) || pte_fault || spu->class_0_pending) ? 1 : 0;
+}
+
+static inline int spu_run_init(struct spu_context *ctx, u32 * npc,
+                              u32 * status)
+{
+       int ret;
+
+       if ((ret = spu_acquire_runnable(ctx)) != 0)
+               return ret;
+       ctx->ops->npc_write(ctx, *npc);
+       ctx->ops->runcntl_write(ctx, SPU_RUNCNTL_RUNNABLE);
+       return 0;
+}
+
+static inline int spu_run_fini(struct spu_context *ctx, u32 * npc,
+                              u32 * status)
+{
+       int ret = 0;
+
+       *status = ctx->ops->status_read(ctx);
+       *npc = ctx->ops->npc_read(ctx);
+       spu_release(ctx);
+
+       if (signal_pending(current))
+               ret = -ERESTARTSYS;
+       if (unlikely(current->ptrace & PT_PTRACED)) {
+               if ((*status & SPU_STATUS_STOPPED_BY_STOP)
+                   && (*status >> SPU_STOP_STATUS_SHIFT) == 0x3fff) {
+                       force_sig(SIGTRAP, current);
+                       ret = -ERESTARTSYS;
+               }
+       }
+       return ret;
+}
+
+static inline int spu_reacquire_runnable(struct spu_context *ctx, u32 *npc,
+                                        u32 *status)
+{
+       int ret;
+
+       if ((ret = spu_run_fini(ctx, npc, status)) != 0)
+               return ret;
+       if (*status & (SPU_STATUS_STOPPED_BY_STOP |
+                      SPU_STATUS_STOPPED_BY_HALT)) {
+               return *status;
+       }
+       if ((ret = spu_run_init(ctx, npc, status)) != 0)
+               return ret;
+       return 0;
+}
+
+static inline int spu_process_events(struct spu_context *ctx)
+{
+       struct spu *spu = ctx->spu;
+       u64 pte_fault = MFC_DSISR_PTE_NOT_FOUND | MFC_DSISR_ACCESS_DENIED;
+       int ret = 0;
+
+       if (spu->dsisr & pte_fault)
+               ret = spu_irq_class_1_bottom(spu);
+       if (spu->class_0_pending)
+               ret = spu_irq_class_0_bottom(spu);
+       if (!ret && signal_pending(current))
+               ret = -ERESTARTSYS;
+       return ret;
+}
+
+long spufs_run_spu(struct file *file, struct spu_context *ctx,
+                  u32 * npc, u32 * status)
+{
+       int ret;
+
+       if (down_interruptible(&ctx->run_sema))
+               return -ERESTARTSYS;
+
+       ret = spu_run_init(ctx, npc, status);
+       if (ret)
+               goto out;
+
+       do {
+               ret = spufs_wait(ctx->stop_wq, spu_stopped(ctx, status));
+               if (unlikely(ret))
+                       break;
+               if (unlikely(ctx->state != SPU_STATE_RUNNABLE)) {
+                       ret = spu_reacquire_runnable(ctx, npc, status);
+                       if (ret)
+                               goto out;
+                       continue;
+               }
+               ret = spu_process_events(ctx);
+
+       } while (!ret && !(*status & (SPU_STATUS_STOPPED_BY_STOP |
+                                     SPU_STATUS_STOPPED_BY_HALT)));
+
+       ctx->ops->runcntl_stop(ctx);
+       ret = spu_run_fini(ctx, npc, status);
+       if (!ret)
+               ret = *status;
+       spu_yield(ctx);
+
+out:
+       up(&ctx->run_sema);
+       return ret;
+}
+
index 48961ac584a11270960c6e3786e831c4c6778056..c715ed0c4014c86743ae6a4f34813da7f87a9a81 100644 (file)
@@ -124,6 +124,34 @@ void spu_yield(struct spu_context *ctx);
 int __init spu_sched_init(void);
 void __exit spu_sched_exit(void);
 
+/*
+ * spufs_wait
+ *     Same as wait_event_interruptible(), except that here
+ *     we need to call spu_release(ctx) before sleeping, and
+ *     then spu_acquire(ctx) when awoken.
+ */
+
+#define spufs_wait(wq, condition)                                      \
+({                                                                     \
+       int __ret = 0;                                                  \
+       DEFINE_WAIT(__wait);                                            \
+       for (;;) {                                                      \
+               prepare_to_wait(&(wq), &__wait, TASK_INTERRUPTIBLE);    \
+               if (condition)                                          \
+                       break;                                          \
+               if (!signal_pending(current)) {                         \
+                       spu_release(ctx);                               \
+                       schedule();                                     \
+                       spu_acquire(ctx);                               \
+                       continue;                                       \
+               }                                                       \
+               __ret = -ERESTARTSYS;                                   \
+               break;                                                  \
+       }                                                               \
+       finish_wait(&(wq), &__wait);                                    \
+       __ret;                                                          \
+})
+
 size_t spu_wbox_write(struct spu_context *ctx, u32 data);
 size_t spu_ibox_read(struct spu_context *ctx, u32 *data);