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

Commit b162d47e authored by Chris Wilson's avatar Chris Wilson Committed by Jani Nikula
Browse files

drm/i915/selftests: Allocate inode/file dynamically



Avoid having too large a stack by creating the fake struct inode/file on
the heap instead.

drivers/gpu/drm/i915/selftests/mock_drm.c: In function 'mock_file':
drivers/gpu/drm/i915/selftests/mock_drm.c:46:1: error: the frame size of 1328 bytes is larger than 1280 bytes [-Werror=frame-larger-than=]
drivers/gpu/drm/i915/selftests/mock_drm.c: In function 'mock_file_free':
drivers/gpu/drm/i915/selftests/mock_drm.c:54:1: error: the frame size of 1312 bytes is larger than 1280 bytes [-Werror=frame-larger-than=]

Reported-by: default avatarArnd Bergmann <arnd@arndb.de>
Fixes: 66d9cb5d ("drm/i915: Mock the GEM device for self-testing")
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
Link: http://patchwork.freedesktop.org/patch/msgid/20170419094143.16922-2-chris@chris-wilson.co.uk


Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
(cherry picked from commit 2310b3c9)
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent acf2dc22
Loading
Loading
Loading
Loading
+32 −13
Original line number Diff line number Diff line
@@ -24,31 +24,50 @@

#include "mock_drm.h"

static inline struct inode fake_inode(struct drm_i915_private *i915)
{
	return (struct inode){ .i_rdev = i915->drm.primary->index };
}

struct drm_file *mock_file(struct drm_i915_private *i915)
{
	struct inode inode = fake_inode(i915);
	struct file filp = {};
	struct file *filp;
	struct inode *inode;
	struct drm_file *file;
	int err;

	err = drm_open(&inode, &filp);
	if (unlikely(err))
		return ERR_PTR(err);
	inode = kzalloc(sizeof(*inode), GFP_KERNEL);
	if (!inode) {
		err = -ENOMEM;
		goto err;
	}

	inode->i_rdev = i915->drm.primary->index;

	file = filp.private_data;
	filp = kzalloc(sizeof(*filp), GFP_KERNEL);
	if (!filp) {
		err = -ENOMEM;
		goto err_inode;
	}

	err = drm_open(inode, filp);
	if (err)
		goto err_filp;

	file = filp->private_data;
	memset(&file->filp, POISON_INUSE, sizeof(file->filp));
	file->authenticated = true;

	kfree(filp);
	kfree(inode);
	return file;

err_filp:
	kfree(filp);
err_inode:
	kfree(inode);
err:
	return ERR_PTR(err);
}

void mock_file_free(struct drm_i915_private *i915, struct drm_file *file)
{
	struct inode inode = fake_inode(i915);
	struct file filp = { .private_data = file };

	drm_release(&inode, &filp);
	drm_release(NULL, &filp);
}