Generate the magic id using idgen32(). While i'm here fix the locking a
authoroga <oga@openbsd.org>
Wed, 13 Aug 2008 19:33:29 +0000 (19:33 +0000)
committeroga <oga@openbsd.org>
Wed, 13 Aug 2008 19:33:29 +0000 (19:33 +0000)
bit so we don't sleep with a spinlock.

ok djm@.

sys/dev/pci/drm/drmP.h
sys/dev/pci/drm/drm_auth.c
sys/dev/pci/drm/drm_drv.c

index 6676647..5529ce2 100644 (file)
@@ -66,6 +66,7 @@
 #include <dev/pci/vga_pcivar.h>
 #include <machine/param.h>
 #include <machine/bus.h>
+#include <crypto/idgen.h>
 
 #include "drm.h"
 #include "drm_linux_list.h"
@@ -634,6 +635,7 @@ struct drm_device {
 
                                /* Authentication */
        drm_file_list_t   files;
+       struct idgen32_ctx magicid;
        SPLAY_HEAD(drm_magic_tree, drm_magic_entry)     magiclist;
 
        /* Linked list of mappable regions. Protected by dev_lock */
index 02568d9..4b1e20c 100644 (file)
@@ -70,7 +70,10 @@ drm_add_magic(struct drm_device *dev, struct drm_file *priv, drm_magic_t magic)
 
        DRM_SPINLOCK_ASSERT(&dev->dev_lock);
 
-       if ((entry = drm_alloc(sizeof(*entry), DRM_MEM_MAGIC)) == NULL)
+       DRM_UNLOCK();
+       entry = drm_alloc(sizeof(*entry), DRM_MEM_MAGIC);
+       DRM_LOCK();
+       if (entry == NULL)
                return (ENOMEM);
        entry->magic = magic;
        entry->priv = priv;
@@ -97,7 +100,9 @@ drm_remove_magic(struct drm_device *dev, drm_magic_t magic)
        if ((pt = SPLAY_FIND(drm_magic_tree, &dev->magiclist, &key)) == NULL)
                return (EINVAL);
        SPLAY_REMOVE(drm_magic_tree, &dev->magiclist, pt);
+       DRM_UNLOCK();
        drm_free(pt, sizeof(*pt), DRM_MEM_MAGIC);
+       DRM_LOCK();
        return (0);
 }
 
@@ -112,8 +117,7 @@ drm_remove_magic(struct drm_device *dev, drm_magic_t magic)
 int
 drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv)
 {
-       static drm_magic_t       sequence = 0;
-       drm_auth_t              *auth = data;
+       drm_auth_t      *auth = data;
 
        /* Find unique magic */
        if (file_priv->magic) {
@@ -121,12 +125,7 @@ drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv)
        } else {
                DRM_LOCK();
                do {
-                       int old = sequence;
-
-                       auth->magic = ++old;
-
-                       if (!atomic_cmpset_int(&sequence, old, auth->magic))
-                               continue;
+                       auth->magic = idgen32(&dev->magicid);
                } while (drm_find_file(dev, auth->magic));
 
                file_priv->magic = auth->magic;
index 88fc531..f5b201e 100644 (file)
@@ -253,6 +253,7 @@ drm_firstopen(struct drm_device *dev)
        for ( i = 0 ; i < DRM_ARRAY_SIZE(dev->counts) ; i++ )
                atomic_set( &dev->counts[i], 0 );
 
+       idgen32_init(&dev->magicid);
        SPLAY_INIT(&dev->magiclist);
 
        dev->lock.lock_queue = 0;