提交 34a839c6 编写于 作者: D Daniel Vetter

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: NChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: NEmil Velikov <emil.l.velikov@gmail.com>
Signed-off-by: NDaniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1465930269-7883-4-git-send-email-daniel.vetter@ffwll.ch
上级 1a75a222
...@@ -93,7 +93,7 @@ void drm_ut_debug_printk(const char *function_name, const char *format, ...) ...@@ -93,7 +93,7 @@ void drm_ut_debug_printk(const char *function_name, const char *format, ...)
} }
EXPORT_SYMBOL(drm_ut_debug_printk); 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; struct drm_master *master;
...@@ -105,7 +105,7 @@ struct drm_master *drm_master_create(struct drm_minor *minor) ...@@ -105,7 +105,7 @@ struct drm_master *drm_master_create(struct drm_minor *minor)
spin_lock_init(&master->lock.spinlock); spin_lock_init(&master->lock.spinlock);
init_waitqueue_head(&master->lock.lock_queue); init_waitqueue_head(&master->lock.lock_queue);
idr_init(&master->magic_map); idr_init(&master->magic_map);
master->minor = minor; master->dev = dev;
return master; return master;
} }
...@@ -120,7 +120,7 @@ EXPORT_SYMBOL(drm_master_get); ...@@ -120,7 +120,7 @@ EXPORT_SYMBOL(drm_master_get);
static void drm_master_destroy(struct kref *kref) static void drm_master_destroy(struct kref *kref)
{ {
struct drm_master *master = container_of(kref, struct drm_master, refcount); 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) if (dev->driver->master_destroy)
dev->driver->master_destroy(dev, master); dev->driver->master_destroy(dev, master);
......
...@@ -185,7 +185,7 @@ int drm_new_set_master(struct drm_device *dev, struct drm_file *fpriv) ...@@ -185,7 +185,7 @@ int drm_new_set_master(struct drm_device *dev, struct drm_file *fpriv)
lockdep_assert_held_once(&dev->master_mutex); lockdep_assert_held_once(&dev->master_mutex);
/* create a new master */ /* 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) if (!fpriv->minor->master)
return -ENOMEM; return -ENOMEM;
......
...@@ -92,7 +92,7 @@ int drm_setmaster_ioctl(struct drm_device *dev, void *data, ...@@ -92,7 +92,7 @@ int drm_setmaster_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv); struct drm_file *file_priv);
int drm_dropmaster_ioctl(struct drm_device *dev, void *data, int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv); 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 */ /* drm_debugfs.c */
#if defined(CONFIG_DEBUG_FS) #if defined(CONFIG_DEBUG_FS)
......
...@@ -379,16 +379,19 @@ struct drm_lock_data { ...@@ -379,16 +379,19 @@ struct drm_lock_data {
* struct drm_master - drm master structure * struct drm_master - drm master structure
* *
* @refcount: Refcount for this master object. * @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: Unique identifier: e.g. busid. Protected by drm_global_mutex.
* @unique_len: Length of unique field. 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. * @magic_map: Map of used authentication tokens. Protected by struct_mutex.
* @lock: DRI lock information. * @lock: DRI lock information.
* @driver_priv: Pointer to driver-private 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 drm_master {
struct kref refcount; struct kref refcount;
struct drm_minor *minor; struct drm_device *dev;
char *unique; char *unique;
int unique_len; int unique_len;
struct idr magic_map; struct idr magic_map;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册