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

Commit 34a839c6 authored by Daniel Vetter's avatar Daniel Vetter
Browse files

drm: Link directly from drm_master to drm_device



Master-based auth only exists for the legacy/primary drm_minor, hence
there can only be one per device. The goal here is to untangle the
epic dereference games of minor->master and master->minor which is
just massively confusing.

Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarEmil Velikov <emil.l.velikov@gmail.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1465930269-7883-4-git-send-email-daniel.vetter@ffwll.ch
parent 1a75a222
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -93,7 +93,7 @@ void drm_ut_debug_printk(const char *function_name, const char *format, ...)
}
EXPORT_SYMBOL(drm_ut_debug_printk);

struct drm_master *drm_master_create(struct drm_minor *minor)
struct drm_master *drm_master_create(struct drm_device *dev)
{
	struct drm_master *master;

@@ -105,7 +105,7 @@ struct drm_master *drm_master_create(struct drm_minor *minor)
	spin_lock_init(&master->lock.spinlock);
	init_waitqueue_head(&master->lock.lock_queue);
	idr_init(&master->magic_map);
	master->minor = minor;
	master->dev = dev;

	return master;
}
@@ -120,7 +120,7 @@ EXPORT_SYMBOL(drm_master_get);
static void drm_master_destroy(struct kref *kref)
{
	struct drm_master *master = container_of(kref, struct drm_master, refcount);
	struct drm_device *dev = master->minor->dev;
	struct drm_device *dev = master->dev;

	if (dev->driver->master_destroy)
		dev->driver->master_destroy(dev, master);
+1 −1
Original line number Diff line number Diff line
@@ -185,7 +185,7 @@ int drm_new_set_master(struct drm_device *dev, struct drm_file *fpriv)
	lockdep_assert_held_once(&dev->master_mutex);

	/* create a new master */
	fpriv->minor->master = drm_master_create(fpriv->minor);
	fpriv->minor->master = drm_master_create(fpriv->minor->dev);
	if (!fpriv->minor->master)
		return -ENOMEM;

+1 −1
Original line number Diff line number Diff line
@@ -92,7 +92,7 @@ int drm_setmaster_ioctl(struct drm_device *dev, void *data,
			struct drm_file *file_priv);
int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
			 struct drm_file *file_priv);
struct drm_master *drm_master_create(struct drm_minor *minor);
struct drm_master *drm_master_create(struct drm_device *dev);

/* drm_debugfs.c */
#if defined(CONFIG_DEBUG_FS)
+5 −2
Original line number Diff line number Diff line
@@ -379,16 +379,19 @@ struct drm_lock_data {
 * struct drm_master - drm master structure
 *
 * @refcount: Refcount for this master object.
 * @minor: Link back to minor char device we are master for. Immutable.
 * @dev: Link back to the DRM device
 * @unique: Unique identifier: e.g. busid. Protected by drm_global_mutex.
 * @unique_len: Length of unique field. Protected by drm_global_mutex.
 * @magic_map: Map of used authentication tokens. Protected by struct_mutex.
 * @lock: DRI lock information.
 * @driver_priv: Pointer to driver-private information.
 *
 * Note that master structures are only relevant for the legacy/primary device
 * nodes, hence there can only be one per device, not one per drm_minor.
 */
struct drm_master {
	struct kref refcount;
	struct drm_minor *minor;
	struct drm_device *dev;
	char *unique;
	int unique_len;
	struct idr magic_map;