[PATCH 09/11] drm: replace drawable ioctl by noops

Kristian Høgsberg krh at bitplanet.net
Thu Apr 29 07:48:44 PDT 2010


On Thu, Apr 29, 2010 at 5:14 AM, Daniel Vetter <daniel.vetter at ffwll.ch> wrote:
> The information supplied by userspace through these ioctls is only
> accessible by dev->drw_idr. But there's no in-tree user of that.
> Information might also leak via the RM_DRAW ioctl (in the form of
> a negative return code in case the drawable doesn't exist). But the
> only user of these ioctls, mesas' miniglx, does not use the RM_DRAW
> ioctl.
>
> Therefore it's safe to replace these three ioctls with noops and rip
> out the implementation.

Looks almost exactly like this one:

http://www.mail-archive.com/dri-devel@lists.sourceforge.net/msg39176.html

Except I made adddraw a stub that always returns 1, but reading
through the code (hw/xfree86/dri, glx/glxdri.c and the radeon dri
driver) I don't see anything that fails if we just return zero (or a
random number for that matter).  The only difference is that if we
return zero, hw/xfree86/dri/dri.c will keep trying to create a drm
drawable (look for drmCreateDrawable) every time somebody creates a
dri drawable, but since that's a noop, who cares.

Reviewed-by: Kristian Høgsberg <krh at bitplanet.net>

> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
>  drivers/gpu/drm/Makefile       |    2 +-
>  drivers/gpu/drm/drm_drawable.c |  197 ----------------------------------------
>  drivers/gpu/drm/drm_drv.c      |    8 +-
>  drivers/gpu/drm/drm_stub.c     |    3 -
>  include/drm/drmP.h             |   15 ---
>  5 files changed, 4 insertions(+), 221 deletions(-)
>  delete mode 100644 drivers/gpu/drm/drm_drawable.c
>
> diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
> index abe3f44..10585ce 100644
> --- a/drivers/gpu/drm/Makefile
> +++ b/drivers/gpu/drm/Makefile
> @@ -5,7 +5,7 @@
>  ccflags-y := -Iinclude/drm
>
>  drm-y       := drm_auth.o drm_buffer.o drm_bufs.o drm_cache.o \
> -               drm_context.o drm_dma.o drm_drawable.o \
> +               drm_context.o drm_dma.o \
>                drm_drv.o drm_fops.o drm_gem.o drm_ioctl.o drm_irq.o \
>                drm_lock.o drm_memory.o drm_proc.o drm_stub.o drm_vm.o \
>                drm_agpsupport.o drm_scatter.o ati_pcigart.o drm_pci.o \
> diff --git a/drivers/gpu/drm/drm_drawable.c b/drivers/gpu/drm/drm_drawable.c
> deleted file mode 100644
> index 170e531..0000000
> --- a/drivers/gpu/drm/drm_drawable.c
> +++ /dev/null
> @@ -1,197 +0,0 @@
> -/**
> - * \file drm_drawable.c
> - * IOCTLs for drawables
> - *
> - * \author Rickard E. (Rik) Faith <faith at valinux.com>
> - * \author Gareth Hughes <gareth at valinux.com>
> - * \author Michel Dänzer <michel at tungstengraphics.com>
> - */
> -
> -/*
> - * Created: Tue Feb  2 08:37:54 1999 by faith at valinux.com
> - *
> - * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
> - * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
> - * Copyright 2006 Tungsten Graphics, Inc., Bismarck, North Dakota.
> - * All Rights Reserved.
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining a
> - * copy of this software and associated documentation files (the "Software"),
> - * to deal in the Software without restriction, including without limitation
> - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> - * and/or sell copies of the Software, and to permit persons to whom the
> - * Software is furnished to do so, subject to the following conditions:
> - *
> - * The above copyright notice and this permission notice (including the next
> - * paragraph) shall be included in all copies or substantial portions of the
> - * Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> - * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> - * OTHER DEALINGS IN THE SOFTWARE.
> - */
> -
> -#include "drmP.h"
> -
> -/**
> - * Allocate drawable ID and memory to store information about it.
> - */
> -int drm_adddraw(struct drm_device *dev, void *data, struct drm_file *file_priv)
> -{
> -       unsigned long irqflags;
> -       struct drm_draw *draw = data;
> -       int new_id = 0;
> -       int ret;
> -
> -again:
> -       if (idr_pre_get(&dev->drw_idr, GFP_KERNEL) == 0) {
> -               DRM_ERROR("Out of memory expanding drawable idr\n");
> -               return -ENOMEM;
> -       }
> -
> -       spin_lock_irqsave(&dev->drw_lock, irqflags);
> -       ret = idr_get_new_above(&dev->drw_idr, NULL, 1, &new_id);
> -       if (ret == -EAGAIN) {
> -               spin_unlock_irqrestore(&dev->drw_lock, irqflags);
> -               goto again;
> -       }
> -
> -       spin_unlock_irqrestore(&dev->drw_lock, irqflags);
> -
> -       draw->handle = new_id;
> -
> -       DRM_DEBUG("%d\n", draw->handle);
> -
> -       return 0;
> -}
> -
> -/**
> - * Free drawable ID and memory to store information about it.
> - */
> -int drm_rmdraw(struct drm_device *dev, void *data, struct drm_file *file_priv)
> -{
> -       struct drm_draw *draw = data;
> -       unsigned long irqflags;
> -       struct drm_drawable_info *info;
> -
> -       spin_lock_irqsave(&dev->drw_lock, irqflags);
> -
> -       info = drm_get_drawable_info(dev, draw->handle);
> -       if (info == NULL) {
> -               spin_unlock_irqrestore(&dev->drw_lock, irqflags);
> -               return -EINVAL;
> -       }
> -       kfree(info->rects);
> -       kfree(info);
> -
> -       idr_remove(&dev->drw_idr, draw->handle);
> -
> -       spin_unlock_irqrestore(&dev->drw_lock, irqflags);
> -       DRM_DEBUG("%d\n", draw->handle);
> -       return 0;
> -}
> -
> -int drm_update_drawable_info(struct drm_device *dev, void *data, struct drm_file *file_priv)
> -{
> -       struct drm_update_draw *update = data;
> -       unsigned long irqflags;
> -       struct drm_clip_rect *rects;
> -       struct drm_drawable_info *info;
> -       int err;
> -
> -       info = idr_find(&dev->drw_idr, update->handle);
> -       if (!info) {
> -               info = kzalloc(sizeof(*info), GFP_KERNEL);
> -               if (!info)
> -                       return -ENOMEM;
> -               if (IS_ERR(idr_replace(&dev->drw_idr, info, update->handle))) {
> -                       DRM_ERROR("No such drawable %d\n", update->handle);
> -                       kfree(info);
> -                       return -EINVAL;
> -               }
> -       }
> -
> -       switch (update->type) {
> -       case DRM_DRAWABLE_CLIPRECTS:
> -               if (update->num == 0)
> -                       rects = NULL;
> -               else if (update->num != info->num_rects) {
> -                       rects = kmalloc(update->num *
> -                                       sizeof(struct drm_clip_rect),
> -                                       GFP_KERNEL);
> -               } else
> -                       rects = info->rects;
> -
> -               if (update->num && !rects) {
> -                       DRM_ERROR("Failed to allocate cliprect memory\n");
> -                       err = -ENOMEM;
> -                       goto error;
> -               }
> -
> -               if (update->num && DRM_COPY_FROM_USER(rects,
> -                                                    (struct drm_clip_rect __user *)
> -                                                    (unsigned long)update->data,
> -                                                    update->num *
> -                                                    sizeof(*rects))) {
> -                       DRM_ERROR("Failed to copy cliprects from userspace\n");
> -                       err = -EFAULT;
> -                       goto error;
> -               }
> -
> -               spin_lock_irqsave(&dev->drw_lock, irqflags);
> -
> -               if (rects != info->rects) {
> -                       kfree(info->rects);
> -               }
> -
> -               info->rects = rects;
> -               info->num_rects = update->num;
> -
> -               spin_unlock_irqrestore(&dev->drw_lock, irqflags);
> -
> -               DRM_DEBUG("Updated %d cliprects for drawable %d\n",
> -                         info->num_rects, update->handle);
> -               break;
> -       default:
> -               DRM_ERROR("Invalid update type %d\n", update->type);
> -               return -EINVAL;
> -       }
> -
> -       return 0;
> -
> -error:
> -       if (rects != info->rects)
> -               kfree(rects);
> -
> -       return err;
> -}
> -
> -/**
> - * Caller must hold the drawable spinlock!
> - */
> -static struct drm_drawable_info *drm_get_drawable_info(struct drm_device *dev, drm_drawable_t id)
> -{
> -       return idr_find(&dev->drw_idr, id);
> -}
> -
> -static int drm_drawable_free(int idr, void *p, void *data)
> -{
> -       struct drm_drawable_info *info = p;
> -
> -       if (info) {
> -               kfree(info->rects);
> -               kfree(info);
> -       }
> -
> -       return 0;
> -}
> -
> -void drm_drawable_free_all(struct drm_device *dev)
> -{
> -       idr_for_each(&dev->drw_idr, drm_drawable_free, NULL);
> -       idr_remove_all(&dev->drw_idr);
> -}
> diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
> index 4a66201..ea4b6c2 100644
> --- a/drivers/gpu/drm/drm_drv.c
> +++ b/drivers/gpu/drm/drm_drv.c
> @@ -88,8 +88,8 @@ static struct drm_ioctl_desc drm_ioctls[] = {
>        DRM_IOCTL_DEF(DRM_IOCTL_NEW_CTX, drm_newctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
>        DRM_IOCTL_DEF(DRM_IOCTL_RES_CTX, drm_resctx, DRM_AUTH),
>
> -       DRM_IOCTL_DEF(DRM_IOCTL_ADD_DRAW, drm_adddraw, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
> -       DRM_IOCTL_DEF(DRM_IOCTL_RM_DRAW, drm_rmdraw, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
> +       DRM_IOCTL_DEF(DRM_IOCTL_ADD_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
> +       DRM_IOCTL_DEF(DRM_IOCTL_RM_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
>
>        DRM_IOCTL_DEF(DRM_IOCTL_LOCK, drm_lock, DRM_AUTH),
>        DRM_IOCTL_DEF(DRM_IOCTL_UNLOCK, drm_unlock, DRM_AUTH),
> @@ -124,7 +124,7 @@ static struct drm_ioctl_desc drm_ioctls[] = {
>
>        DRM_IOCTL_DEF(DRM_IOCTL_MODESET_CTL, drm_modeset_ctl, 0),
>
> -       DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_update_drawable_info, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
> +       DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
>
>        DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, DRM_UNLOCKED),
>        DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH|DRM_UNLOCKED),
> @@ -177,8 +177,6 @@ int drm_lastclose(struct drm_device * dev)
>
>        mutex_lock(&dev->struct_mutex);
>
> -       /* Free drawable information memory */
> -       drm_drawable_free_all(dev);
>        del_timer(&dev->timer);
>
>        /* Clear AGP information */
> diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
> index b743411..e3b5cfc 100644
> --- a/drivers/gpu/drm/drm_stub.c
> +++ b/drivers/gpu/drm/drm_stub.c
> @@ -237,14 +237,11 @@ static int drm_fill_in_dev(struct drm_device * dev, struct pci_dev *pdev,
>        INIT_LIST_HEAD(&dev->vblank_event_list);
>
>        spin_lock_init(&dev->count_lock);
> -       spin_lock_init(&dev->drw_lock);
>        spin_lock_init(&dev->event_lock);
>        init_timer(&dev->timer);
>        mutex_init(&dev->struct_mutex);
>        mutex_init(&dev->ctxlist_mutex);
>
> -       idr_init(&dev->drw_idr);
> -
>        dev->pdev = pdev;
>        dev->pci_device = pdev->device;
>        dev->pci_vendor = pdev->vendor;
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index af62612..540cab6 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -1026,12 +1026,6 @@ struct drm_device {
>        struct drm_minor *control;              /**< Control node for card */
>        struct drm_minor *primary;              /**< render type primary screen head */
>
> -       /** \name Drawable information */
> -       /*@{ */
> -       spinlock_t drw_lock;
> -       struct idr drw_idr;
> -       /*@} */
> -
>         struct drm_mode_config mode_config;    /**< Current mode config */
>
>        /** \name GEM information */
> @@ -1202,15 +1196,6 @@ extern int drm_setsareactx(struct drm_device *dev, void *data,
>  extern int drm_getsareactx(struct drm_device *dev, void *data,
>                           struct drm_file *file_priv);
>
> -                               /* Drawable IOCTL support (drm_drawable.h) */
> -extern int drm_adddraw(struct drm_device *dev, void *data,
> -                      struct drm_file *file_priv);
> -extern int drm_rmdraw(struct drm_device *dev, void *data,
> -                     struct drm_file *file_priv);
> -extern int drm_update_drawable_info(struct drm_device *dev, void *data,
> -                                   struct drm_file *file_priv);
> -extern void drm_drawable_free_all(struct drm_device *dev);
> -
>                                /* Authentication IOCTL support (drm_auth.h) */
>  extern int drm_getmagic(struct drm_device *dev, void *data,
>                        struct drm_file *file_priv);
> --
> 1.7.1
>
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
>


More information about the dri-devel mailing list