Skip to content

Commit

Permalink
[POWERPC] spufs: Extract the file descriptor search logic in SPU core…
Browse files Browse the repository at this point in the history
…dump code

Extract the logic for searching through the file descriptors for spu contexts
into a separate routine, coredump_next_context(), so we can use it elsewhere
in future.  In the process we flatten the for loop, and move the NOSCHED test
into coredump_next_context().

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
Michael Ellerman authored and Paul Mackerras committed Sep 19, 2007
1 parent c70d4ca commit a595ed6
Showing 1 changed file with 38 additions and 20 deletions.
58 changes: 38 additions & 20 deletions arch/powerpc/platforms/cell/spufs/coredump.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,16 +109,11 @@ static int spufs_ctx_note_size(struct spufs_ctx_info *ctx_info)
return total;
}

static int spufs_add_one_context(struct file *file, int dfd)
static int spufs_add_one_context(struct spu_context *ctx, int dfd)
{
struct spu_context *ctx;
struct spufs_ctx_info *ctx_info;
int size;

ctx = SPUFS_I(file->f_dentry->d_inode)->i_ctx;
if (ctx->flags & SPU_CREATE_NOSCHED)
return 0;

ctx_info = kzalloc(sizeof(*ctx_info), GFP_KERNEL);
if (unlikely(!ctx_info))
return -ENOMEM;
Expand All @@ -142,22 +137,45 @@ static int spufs_add_one_context(struct file *file, int dfd)
* internal functionality to dump them without needing to actually
* open the files.
*/
static int spufs_arch_notes_size(void)
static struct spu_context *coredump_next_context(int *fd)
{
struct fdtable *fdt = files_fdtable(current->files);
int size = 0, fd;

for (fd = 0; fd < fdt->max_fds; fd++) {
if (FD_ISSET(fd, fdt->open_fds)) {
struct file *file = fcheck(fd);

if (file && file->f_op == &spufs_context_fops) {
int rval = spufs_add_one_context(file, fd);
if (rval < 0)
break;
size += rval;
}
}
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;
}

static int spufs_arch_notes_size(void)
{
struct spu_context *ctx;
int size = 0, rc, fd;

fd = 0;
while ((ctx = coredump_next_context(&fd)) != NULL) {
rc = spufs_add_one_context(ctx, fd);
if (rc < 0)
break;

size += rc;
}

return size;
Expand Down

0 comments on commit a595ed6

Please sign in to comment.