static long do_spu_run(struct file *filp, __u32 __user *unpc, __u32 __user *ustatus) { long ret; struct spufs_inode_info *i; u32 npc, status; ret = -EFAULT; if (get_user(npc, unpc)) goto out; /* check if this file was created by spu_create */ ret = -EINVAL; if (filp->f_op != &spufs_context_fops) goto out; i = SPUFS_I(filp->f_path.dentry->d_inode); ret = spufs_run_spu(i->i_ctx, &npc, &status); if (put_user(npc, unpc)) ret = -EFAULT; if (ustatus && put_user(status, ustatus)) ret = -EFAULT; out: return ret; }
/* * The additional architecture-specific notes for Cell are various * context files in the spu context. * * This function iterates over all open file descriptors and sees * if they are a directory in spufs. In that case we use spufs * internal functionality to dump them without needing to actually * open the files. */ static struct spu_context *coredump_next_context(int *fd) { struct fdtable *fdt = files_fdtable(current->files); struct file *file; struct spu_context *ctx = NULL; for (; *fd < fdt->max_fds; (*fd)++) { if (!FD_ISSET(*fd, fdt->open_fds)) continue; file = fcheck(*fd); if (!file || file->f_op != &spufs_context_fops) continue; ctx = SPUFS_I(file->f_dentry->d_inode)->i_ctx; if (ctx->flags & SPU_CREATE_NOSCHED) continue; /* start searching the next fd next time we're called */ (*fd)++; break; } return ctx; }
/* * descriptor table is not shared, so files can't change or go away. */ static struct spu_context *coredump_next_context(int *fd) { struct file *file; int n = iterate_fd(current->files, *fd, match_context, NULL); if (!n) return NULL; *fd = n - 1; file = fcheck(*fd); return SPUFS_I(file->f_dentry->d_inode)->i_ctx; }
static int match_context(const void *v, struct file *file, unsigned fd) { struct spu_context *ctx; if (file->f_op != &spufs_context_fops) return 0; ctx = SPUFS_I(file->f_dentry->d_inode)->i_ctx; if (ctx->flags & SPU_CREATE_NOSCHED) return 0; return fd + 1; }
/* * The additional architecture-specific notes for Cell are various * context files in the spu context. * * This function iterates over all open file descriptors and sees * if they are a directory in spufs. In that case we use spufs * internal functionality to dump them without needing to actually * open the files. */ static struct spu_context *coredump_next_context(int *fd) { struct fdtable *fdt = files_fdtable(current->files); struct file *file; struct spu_context *ctx = NULL; for (; *fd < fdt->max_fds; (*fd)++) { if (!fd_is_open(*fd, fdt)) continue; file = fcheck(*fd); if (!file || file->f_op != &spufs_context_fops) continue; ctx = SPUFS_I(file->f_dentry->d_inode)->i_ctx; if (ctx->flags & SPU_CREATE_NOSCHED) continue; break; } return ctx; }