Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a595ed66 authored by Michael Ellerman's avatar Michael Ellerman Committed by Paul Mackerras
Browse files

[POWERPC] spufs: Extract the file descriptor search logic in SPU coredump 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: default avatarMichael Ellerman <michael@ellerman.id.au>
Signed-off-by: default avatarJeremy Kerr <jk@ozlabs.org>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent c70d4ca5
Loading
Loading
Loading
Loading
+38 −20
Original line number Diff line number Diff line
@@ -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;
@@ -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;
	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);

	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)
			continue;

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

	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;