Revert "drm: drop redundant drm_file->is_master"
authorDave Airlie <airlied@gmail.com>
Thu, 7 Aug 2014 21:30:53 +0000 (07:30 +1000)
committerDave Airlie <airlied@gmail.com>
Thu, 7 Aug 2014 21:30:53 +0000 (07:30 +1000)
This reverts commit 48ba813701eb14b3008edefef4a0789b328e278c.

Thanks to Chris:
"drm_file->is_master is not synomous with having drm_file->master ==
drm_file->minor->master. This is because drm_file->master is the same
for all drm_files of the same generation and so when there is a master,
every drm_file believes itself to be the master. Confusion ensues and
things go pear shaped when one file is closed and there is no master
anymore."

Conflicts:
drivers/gpu/drm/drm_drv.c
drivers/gpu/drm/drm_stub.c

drivers/gpu/drm/drm_crtc.c
drivers/gpu/drm/drm_drv.c
drivers/gpu/drm/drm_fops.c
drivers/gpu/drm/drm_ioctl.c
drivers/gpu/drm/drm_lock.c
drivers/gpu/drm/i915/i915_gem_execbuffer.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
drivers/staging/imx-drm/imx-drm-core.c
include/drm/drmP.h

index ca8bb1b..fa2be24 100644 (file)
@@ -3244,7 +3244,7 @@ int drm_mode_getfb(struct drm_device *dev,
        r->bpp = fb->bits_per_pixel;
        r->pitch = fb->pitches[0];
        if (fb->funcs->create_handle) {
-               if (drm_is_master(file_priv) || capable(CAP_SYS_ADMIN) ||
+               if (file_priv->is_master || capable(CAP_SYS_ADMIN) ||
                    drm_is_control_client(file_priv)) {
                        ret = fb->funcs->create_handle(fb, file_priv,
                                                       &r->handle);
index 92bc6b1..3242e20 100644 (file)
@@ -179,7 +179,7 @@ int drm_setmaster_ioctl(struct drm_device *dev, void *data,
        int ret = 0;
 
        mutex_lock(&dev->master_mutex);
-       if (drm_is_master(file_priv))
+       if (file_priv->is_master)
                goto out_unlock;
 
        if (file_priv->minor->master) {
@@ -193,10 +193,13 @@ int drm_setmaster_ioctl(struct drm_device *dev, void *data,
        }
 
        file_priv->minor->master = drm_master_get(file_priv->master);
+       file_priv->is_master = 1;
        if (dev->driver->master_set) {
                ret = dev->driver->master_set(dev, file_priv, false);
-               if (unlikely(ret != 0))
+               if (unlikely(ret != 0)) {
+                       file_priv->is_master = 0;
                        drm_master_put(&file_priv->minor->master);
+               }
        }
 
 out_unlock:
@@ -210,7 +213,7 @@ int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
        int ret = -EINVAL;
 
        mutex_lock(&dev->master_mutex);
-       if (!drm_is_master(file_priv))
+       if (!file_priv->is_master)
                goto out_unlock;
 
        if (!file_priv->minor->master)
@@ -220,6 +223,7 @@ int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
        if (dev->driver->master_drop)
                dev->driver->master_drop(dev, file_priv, false);
        drm_master_put(&file_priv->minor->master);
+       file_priv->is_master = 0;
 
 out_unlock:
        mutex_unlock(&dev->master_mutex);
index 4b06094..79d5221 100644 (file)
@@ -194,6 +194,7 @@ static int drm_open_helper(struct file *filp, struct drm_minor *minor)
                        goto out_close;
                }
 
+               priv->is_master = 1;
                /* take another reference for the copy in the local file priv */
                priv->master = drm_master_get(priv->minor->master);
                priv->authenticated = 1;
@@ -425,7 +426,7 @@ int drm_release(struct inode *inode, struct file *filp)
 
        mutex_lock(&dev->master_mutex);
 
-       if (drm_is_master(file_priv)) {
+       if (file_priv->is_master) {
                struct drm_master *master = file_priv->master;
 
                /**
@@ -453,6 +454,7 @@ int drm_release(struct inode *inode, struct file *filp)
        /* drop the master reference held by the file priv */
        if (file_priv->master)
                drm_master_put(&file_priv->master);
+       file_priv->is_master = 0;
        mutex_unlock(&dev->master_mutex);
 
        if (dev->driver->postclose)
index d3d1a8c..40be746 100644 (file)
@@ -607,7 +607,7 @@ static int drm_ioctl_permit(u32 flags, struct drm_file *file_priv)
                return -EACCES;
 
        /* MASTER is only for master or control clients */
-       if (unlikely((flags & DRM_MASTER) && !drm_is_master(file_priv) &&
+       if (unlikely((flags & DRM_MASTER) && !file_priv->is_master &&
                     !drm_is_control_client(file_priv)))
                return -EACCES;
 
index ea15725..e26b59e 100644 (file)
@@ -112,7 +112,7 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv)
        /* don't set the block all signals on the master process for now 
         * really probably not the correct answer but lets us debug xkb
         * xserver for now */
-       if (!drm_is_master(file_priv)) {
+       if (!file_priv->is_master) {
                sigemptyset(&dev->sigmask);
                sigaddset(&dev->sigmask, SIGSTOP);
                sigaddset(&dev->sigmask, SIGTSTP);
index 2dd19da..60998fc 100644 (file)
@@ -1260,7 +1260,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
 
        flags = 0;
        if (args->flags & I915_EXEC_SECURE) {
-               if (!drm_is_master(file) || !capable(CAP_SYS_ADMIN))
+               if (!file->is_master || !capable(CAP_SYS_ADMIN))
                    return -EPERM;
 
                flags |= I915_DISPATCH_SECURE;
@@ -1369,7 +1369,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
                ret = i915_parse_cmds(ring,
                                      batch_obj,
                                      args->batch_start_offset,
-                                     drm_is_master(file));
+                                     file->is_master);
                if (ret)
                        goto err;
 
index 63c4d6f..18b54ac 100644 (file)
@@ -990,7 +990,7 @@ static struct vmw_master *vmw_master_check(struct drm_device *dev,
        if (unlikely(ret != 0))
                return ERR_PTR(-ERESTARTSYS);
 
-       if (drm_is_master(file_priv)) {
+       if (file_priv->is_master) {
                mutex_unlock(&dev->master_mutex);
                return NULL;
        }
index 72913b2..6f54ff4 100644 (file)
@@ -182,7 +182,7 @@ static void imx_drm_driver_preclose(struct drm_device *drm,
 {
        int i;
 
-       if (!drm_is_master(file))
+       if (!file->is_master)
                return;
 
        for (i = 0; i < MAX_CRTC; i++)
index a576463..a12fbba 100644 (file)
@@ -384,6 +384,8 @@ struct drm_prime_file_private {
 /** File private data */
 struct drm_file {
        unsigned authenticated :1;
+       /* Whether we're master for a minor. Protected by master_mutex */
+       unsigned is_master :1;
        /* true when the client has asked us to expose stereo 3D mode flags */
        unsigned stereo_allowed :1;
        /*
@@ -1020,7 +1022,7 @@ struct drm_device {
        /** \name Locks */
        /*@{ */
        struct mutex struct_mutex;      /**< For others */
-       struct mutex master_mutex;      /**< For drm_minor::master */
+       struct mutex master_mutex;      /**< For drm_minor::master and drm_file::is_master */
        /*@} */
 
        /** \name Usage Counters */
@@ -1158,21 +1160,6 @@ static inline bool drm_is_primary_client(const struct drm_file *file_priv)
        return file_priv->minor->type == DRM_MINOR_LEGACY;
 }
 
-/**
- * drm_is_master() - Check whether a DRM open-file is DRM-Master
- * @file: DRM open-file context
- *
- * This checks whether a DRM open-file context is owner of the master context
- * attached to it. If a file owns a master context, it's called DRM-Master.
- * Per DRM device, only one such file can be DRM-Master at a time.
- *
- * Returns: True if the file is DRM-Master, otherwise false.
- */
-static inline bool drm_is_master(const struct drm_file *file)
-{
-       return file->master && file->master == file->minor->master;
-}
-
 /******************************************************************/
 /** \name Internal function definitions */
 /*@{*/