Linus Torvalds wrote:
On Sat, 22 Feb 2003, Keith Whitwell wrote:

What about processes that *don't* do a close - that just use an fd and exit.


The exit does a close, and you'll see a flush() from the dying process
(and a release() if that was the last user).


In the threaded demo I'm looking at, there is only one close -- in the same thread that did the open. The other threads just die.


If a thread does a close(), then that will have closed it in the other
threads too. You will not get any notification from the other threads,
since they will never have anything to notify about - the file is already
dead as far as they are concerned.


But sadly for me, the thread that does the open isn't the one that sees the flush() or release() events:


Whoever does the close() generates the flush().

And the release() can be generated by anybody, although in practice it's going to be the same one that did the final flush() in 99.99% of all cases (but if you depend on it, you're just asking for trouble).


The last line indicates that 1063 held the lock. I never see a flush() for that pid.


The answer really is that you shouldn't care about the pid at all.

OK, here's a patch, first attempt at doing this. It's not ready to commit yet, unless we start a branch for this...


Things actually work pretty well, and a couple of lockups seem to have disappeared as a result. There are at least two issues:

1) Hard lockup when the X server recycles.
2) This breaks other OS's -- they'll need to play catchup, I think.

otherwise, I'm interested in feedback.

Keith
? diff
? realdiff
? work-queue.diff
? linux/drm/kernel/diff
? shared/drm/kernel/diff
Index: linux/drm/kernel/drmP.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drmP.h,v
retrieving revision 1.56
diff -u -r1.56 drmP.h
--- linux/drm/kernel/drmP.h     11 Jan 2003 20:58:20 -0000      1.56
+++ linux/drm/kernel/drmP.h     23 Feb 2003 19:54:47 -0000
@@ -269,6 +269,17 @@
        (_map) = (_dev)->context_sareas[_ctx];          \
 } while(0)
 
+#define LOCK_TEST_WITH_RETURN( dev, filp )                             \
+do {                                                                   \
+       if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||           \
+            dev->lock.filp != filp ) {                         \
+               DRM_ERROR( "%s called without lock held\n",             \
+                          __FUNCTION__ );                              \
+               return -EINVAL;                                         \
+       }                                                               \
+} while (0)
+
+
 typedef int drm_ioctl_t( struct inode *inode, struct file *filp,
                         unsigned int cmd, unsigned long arg );
 
@@ -317,7 +328,7 @@
        __volatile__ int  waiting;     /* On kernel DMA queue                */
        __volatile__ int  pending;     /* On hardware DMA queue              */
        wait_queue_head_t dma_wait;    /* Processes waiting                  */
-       pid_t             pid;         /* PID of holding process             */
+       struct file       *filp;       /* Pointer to holding file descr      */
        int               context;     /* Kernel queue for this buffer       */
        int               while_locked;/* Dispatch this buffer while locked  */
        enum {
@@ -435,7 +446,7 @@
 
 typedef struct drm_lock_data {
        drm_hw_lock_t     *hw_lock;     /* Hardware lock                   */
-       pid_t             pid;          /* PID of lock holder (0=kernel)   */
+       struct file       *filp;        /* File descr of lock holder (0=kernel)   */
        wait_queue_head_t lock_queue;   /* Queue of blocked processes      */
        unsigned long     lock_time;    /* Time of last lock in jiffies    */
 } drm_lock_data_t;
@@ -809,7 +820,7 @@
 extern int          DRM(dma_setup)(drm_device_t *dev);
 extern void         DRM(dma_takedown)(drm_device_t *dev);
 extern void         DRM(free_buffer)(drm_device_t *dev, drm_buf_t *buf);
-extern void         DRM(reclaim_buffers)(drm_device_t *dev, pid_t pid);
+extern void         DRM(reclaim_buffers)( struct file *filp );
 #if __HAVE_OLD_DMA
 /* GH: This is a dirty hack for now...
  */
Index: linux/drm/kernel/drm_bufs.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_bufs.h,v
retrieving revision 1.15
diff -u -r1.15 drm_bufs.h
--- linux/drm/kernel/drm_bufs.h 21 Sep 2002 23:18:54 -0000      1.15
+++ linux/drm/kernel/drm_bufs.h 23 Feb 2003 19:54:47 -0000
@@ -404,7 +404,7 @@
                buf->waiting = 0;
                buf->pending = 0;
                init_waitqueue_head( &buf->dma_wait );
-               buf->pid     = 0;
+               buf->filp    = 0;
 
                buf->dev_priv_size = sizeof(DRIVER_BUF_PRIV_T);
                buf->dev_private = DRM(alloc)( sizeof(DRIVER_BUF_PRIV_T),
@@ -617,7 +617,7 @@
                        buf->waiting = 0;
                        buf->pending = 0;
                        init_waitqueue_head( &buf->dma_wait );
-                       buf->pid     = 0;
+                       buf->filp    = 0;
 #if __HAVE_DMA_HISTOGRAM
                        buf->time_queued     = 0;
                        buf->time_dispatched = 0;
@@ -774,7 +774,7 @@
                buf->waiting = 0;
                buf->pending = 0;
                init_waitqueue_head( &buf->dma_wait );
-               buf->pid     = 0;
+               buf->filp    = 0;
 
                buf->dev_priv_size = sizeof(DRIVER_BUF_PRIV_T);
                buf->dev_private = DRM(alloc)( sizeof(DRIVER_BUF_PRIV_T),
@@ -1012,9 +1012,9 @@
                        return -EINVAL;
                }
                buf = dma->buflist[idx];
-               if ( buf->pid != current->pid ) {
-                       DRM_ERROR( "Process %d freeing buffer owned by %d\n",
-                                  current->pid, buf->pid );
+               if ( buf->filp != filp ) {
+                       DRM_ERROR( "Process %d freeing buffer not owned\n",
+                                  current->pid );
                        return -EINVAL;
                }
                DRM(free_buffer)( dev, buf );
Index: linux/drm/kernel/drm_dma.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_dma.h,v
retrieving revision 1.12
diff -u -r1.12 drm_dma.h
--- linux/drm/kernel/drm_dma.h  2 Feb 2003 03:06:46 -0000       1.12
+++ linux/drm/kernel/drm_dma.h  23 Feb 2003 19:54:47 -0000
@@ -189,7 +189,7 @@
 
        buf->waiting  = 0;
        buf->pending  = 0;
-       buf->pid      = 0;
+       buf->filp     = 0;
        buf->used     = 0;
 #if __HAVE_DMA_HISTOGRAM
        buf->time_completed = get_cycles();
@@ -211,14 +211,16 @@
 }
 
 #if !__HAVE_DMA_RECLAIM
-void DRM(reclaim_buffers)(drm_device_t *dev, pid_t pid)
+void DRM(reclaim_buffers)( struct file *filp )
 {
+       drm_file_t    *priv   = filp->private_data;
+       drm_device_t  *dev    = priv->dev;
        drm_device_dma_t *dma = dev->dma;
        int              i;
 
        if (!dma) return;
        for (i = 0; i < dma->buf_count; i++) {
-               if (dma->buflist[i]->pid == pid) {
+               if (dma->buflist[i]->filp == filp) {
                        switch (dma->buflist[i]->list) {
                        case DRM_LIST_NONE:
                                DRM(free_buffer)(dev, dma->buflist[i]);
@@ -319,8 +321,10 @@
 }
 
 
-int DRM(dma_enqueue)(drm_device_t *dev, drm_dma_t *d)
+int DRM(dma_enqueue)(struct file *filp, drm_dma_t *d)
 {
+       drm_file_t    *priv   = filp->private_data;
+       drm_device_t  *dev    = priv->dev;
        int               i;
        drm_queue_t       *q;
        drm_buf_t         *buf;
@@ -382,10 +386,10 @@
                        return -EINVAL;
                }
                buf = dma->buflist[ idx ];
-               if (buf->pid != current->pid) {
+               if (buf->filp != filp) {
                        atomic_dec(&q->use_count);
-                       DRM_ERROR("Process %d using buffer owned by %d\n",
-                                 current->pid, buf->pid);
+                       DRM_ERROR("Process %d using buffer not owned\n",
+                                 current->pid);
                        return -EINVAL;
                }
                if (buf->list != DRM_LIST_NONE) {
@@ -427,9 +431,11 @@
        return 0;
 }
 
-static int DRM(dma_get_buffers_of_order)(drm_device_t *dev, drm_dma_t *d,
+static int DRM(dma_get_buffers_of_order)(struct file *filp, drm_dma_t *d,
                                         int order)
 {
+       drm_file_t    *priv   = filp->private_data;
+       drm_device_t  *dev    = priv->dev;
        int               i;
        drm_buf_t         *buf;
        drm_device_dma_t  *dma = dev->dma;
@@ -439,13 +445,13 @@
                                        d->flags & _DRM_DMA_WAIT);
                if (!buf) break;
                if (buf->pending || buf->waiting) {
-                       DRM_ERROR("Free buffer %d in use by %d (w%d, p%d)\n",
+                       DRM_ERROR("Free buffer %d in use by %x (w%d, p%d)\n",
                                  buf->idx,
-                                 buf->pid,
+                                 buf->filp,
                                  buf->waiting,
                                  buf->pending);
                }
-               buf->pid     = current->pid;
+               buf->filp     = filp;
                if (copy_to_user(&d->request_indices[i],
                                 &buf->idx,
                                 sizeof(buf->idx)))
Index: linux/drm/kernel/drm_drv.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_drv.h,v
retrieving revision 1.24
diff -u -r1.24 drm_drv.h
--- linux/drm/kernel/drm_drv.h  25 Sep 2002 17:18:19 -0000      1.24
+++ linux/drm/kernel/drm_drv.h  23 Feb 2003 19:54:48 -0000
@@ -496,7 +496,7 @@
 #endif
        if ( dev->lock.hw_lock ) {
                dev->sigdata.lock = dev->lock.hw_lock = NULL; /* SHM removed */
-               dev->lock.pid = 0;
+               dev->lock.filp = 0;
                wake_up_interruptible( &dev->lock.lock_queue );
        }
        up( &dev->struct_sem );
@@ -732,7 +732,8 @@
                return -ENODEV;
        }
 
-       DRM_DEBUG( "open_count = %d\n", dev->open_count );
+       printk( "DRM(open) pid %d open_count = %d\n", 
+               current->pid, dev->open_count );
 
        retcode = DRM(open_helper)( inode, filp, dev );
        if ( !retcode ) {
@@ -765,15 +766,23 @@
         * Begin inline drm_release
         */
 
-       DRM_DEBUG( "pid = %d, device = 0x%x, open_count = %d\n",
+       printk( "%s: pid = %d, device = 0x%x, open_count = %d\n",
+               __FUNCTION__,
                   current->pid, dev->device, dev->open_count );
 
+       printk( "%s: curently hw_lock %p is_held %d lock.filp %p filp %p\n",
+               __FUNCTION__,
+               dev->lock.hw_lock,
+               dev->lock.hw_lock ? _DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) : 0,
+               dev->lock.filp,
+               filp );
+
        if ( dev->lock.hw_lock &&
             _DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) &&
-            dev->lock.pid == current->pid ) {
-               DRM_DEBUG( "Process %d dead, freeing lock for context %d\n",
-                          current->pid,
-                          _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) );
+            dev->lock.filp == filp ) {
+               printk( "File %p released, freeing lock for context %d\n",
+                       filp,
+                       _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) );
 #if __HAVE_RELEASE
                DRIVER_RELEASE();
 #endif
@@ -789,6 +798,9 @@
        else if ( dev->lock.hw_lock ) {
                /* The lock is required to reclaim buffers */
                DECLARE_WAITQUEUE( entry, current );
+
+               printk("grabbing lock for %d\n", current->pid);
+
                add_wait_queue( &dev->lock.lock_queue, &entry );
                for (;;) {
                        current->state = TASK_INTERRUPTIBLE;
@@ -799,7 +811,7 @@
                        }
                        if ( DRM(lock_take)( &dev->lock.hw_lock->lock,
                                             DRM_KERNEL_CONTEXT ) ) {
-                               dev->lock.pid       = priv->pid;
+                               dev->lock.filp      = filp;
                                dev->lock.lock_time = jiffies;
                                 atomic_inc( &dev->counts[_DRM_STAT_LOCKS] );
                                break;  /* Got lock */
@@ -816,6 +828,7 @@
                }
                current->state = TASK_RUNNING;
                remove_wait_queue( &dev->lock.lock_queue, &entry );
+               printk("... done %d\n", retcode);
                if( !retcode ) {
                        DRIVER_RELEASE();
                        DRM(lock_free)( dev, &dev->lock.hw_lock->lock,
@@ -823,7 +836,7 @@
                }
        }
 #elif __HAVE_DMA
-       DRM(reclaim_buffers)( dev, priv->pid );
+       DRM(reclaim_buffers)( filp );
 #endif
 
        DRM(fasync)( -1, filp, 0 );
@@ -847,6 +860,8 @@
                dev->file_last   = priv->prev;
        }
        up( &dev->struct_sem );
+       
+       printk("%d: done 2\n", current->pid);
 
        DRM(free)( priv, sizeof(*priv), DRM_MEM_FILES );
 
@@ -872,6 +887,9 @@
        spin_unlock( &dev->count_lock );
 
        unlock_kernel();
+
+       printk("%d: done 3\n", current->pid);
+
        return retcode;
 }
 
@@ -968,7 +986,7 @@
                         }
                         if ( DRM(lock_take)( &dev->lock.hw_lock->lock,
                                             lock.context ) ) {
-                                dev->lock.pid       = current->pid;
+                                dev->lock.filp      = filp;
                                 dev->lock.lock_time = jiffies;
                                 atomic_inc( &dev->counts[_DRM_STAT_LOCKS] );
                                 break;  /* Got lock */
@@ -1050,7 +1068,7 @@
         * agent to request it then we should just be able to
         * take it immediately and not eat the ioctl.
         */
-       dev->lock.pid = 0;
+       dev->lock.filp = 0;
        {
                __volatile__ unsigned int *plock = &dev->lock.hw_lock->lock;
                unsigned int old, new, prev, ctx;
Index: linux/drm/kernel/drm_fops.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_fops.h,v
retrieving revision 1.8
diff -u -r1.8 drm_fops.h
--- linux/drm/kernel/drm_fops.h 16 May 2002 23:47:15 -0000      1.8
+++ linux/drm/kernel/drm_fops.h 23 Feb 2003 19:54:48 -0000
@@ -92,11 +92,6 @@
 
 int DRM(flush)(struct file *filp)
 {
-       drm_file_t    *priv   = filp->private_data;
-       drm_device_t  *dev    = priv->dev;
-
-       DRM_DEBUG("pid = %d, device = 0x%x, open_count = %d\n",
-                 current->pid, dev->device, dev->open_count);
        return 0;
 }
 
Index: linux/drm/kernel/drm_lists.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_lists.h,v
retrieving revision 1.5
diff -u -r1.5 drm_lists.h
--- linux/drm/kernel/drm_lists.h        14 Feb 2002 02:00:23 -0000      1.5
+++ linux/drm/kernel/drm_lists.h        23 Feb 2003 19:54:48 -0000
@@ -73,8 +73,8 @@
 
        left = DRM_LEFTCOUNT(bl);
        if (!left) {
-               DRM_ERROR("Overflow while adding buffer %d from pid %d\n",
-                         buf->idx, buf->pid);
+               DRM_ERROR("Overflow while adding buffer %d from filp %x\n",
+                         buf->idx, buf->filp);
                return -EINVAL;
        }
 #if __HAVE_DMA_HISTOGRAM
Index: linux/drm/kernel/drm_lock.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_lock.h,v
retrieving revision 1.3
diff -u -r1.3 drm_lock.h
--- linux/drm/kernel/drm_lock.h 21 Sep 2002 23:18:54 -0000      1.3
+++ linux/drm/kernel/drm_lock.h 23 Feb 2003 19:54:48 -0000
@@ -79,7 +79,7 @@
 {
        unsigned int old, new, prev;
 
-       dev->lock.pid = 0;
+       dev->lock.filp = 0;
        do {
                old  = *lock;
                new  = context | _DRM_LOCK_HELD;
@@ -92,19 +92,17 @@
                   __volatile__ unsigned int *lock, unsigned int context)
 {
        unsigned int old, new, prev;
-       pid_t        pid = dev->lock.pid;
 
-       dev->lock.pid = 0;
+       dev->lock.filp = 0;
        do {
                old  = *lock;
                new  = 0;
                prev = cmpxchg(lock, old, new);
        } while (prev != old);
        if (_DRM_LOCK_IS_HELD(old) && _DRM_LOCKING_CONTEXT(old) != context) {
-               DRM_ERROR("%d freed heavyweight lock held by %d (pid %d)\n",
+               DRM_ERROR("%d freed heavyweight lock held by %d\n",
                          context,
-                         _DRM_LOCKING_CONTEXT(old),
-                         pid);
+                         _DRM_LOCKING_CONTEXT(old));
                return 1;
        }
        wake_up_interruptible(&dev->lock.lock_queue);
Index: linux/drm/kernel/drm_os_linux.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_os_linux.h,v
retrieving revision 1.5
diff -u -r1.5 drm_os_linux.h
--- linux/drm/kernel/drm_os_linux.h     9 Oct 2002 16:29:01 -0000       1.5
+++ linux/drm/kernel/drm_os_linux.h     23 Feb 2003 19:54:48 -0000
@@ -3,6 +3,7 @@
 #include <linux/interrupt.h>   /* For task queue support */
 #include <linux/delay.h>
 
+#define DRMFILE                         struct file *
 #define DRM_IOCTL_ARGS                 struct inode *inode, struct file *filp, 
unsigned int cmd, unsigned long data
 #define DRM_ERR(d)                     -(d)
 #define DRM_CURRENTPID                 current->pid
Index: linux/drm/kernel/gamma_drv.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/gamma_drv.h,v
retrieving revision 1.13
diff -u -r1.13 gamma_drv.h
--- linux/drm/kernel/gamma_drv.h        14 Feb 2002 02:00:23 -0000      1.13
+++ linux/drm/kernel/gamma_drv.h        23 Feb 2003 19:54:48 -0000
@@ -42,16 +42,6 @@
        drm_map_t *mmio3;
 } drm_gamma_private_t;
 
-#define LOCK_TEST_WITH_RETURN( dev )                                   \
-do {                                                                   \
-       if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||           \
-            dev->lock.pid != current->pid ) {                          \
-               DRM_ERROR( "%s called without lock held\n",             \
-                          __FUNCTION__ );                              \
-               return -EINVAL;                                         \
-       }                                                               \
-} while (0)
-
                                /* gamma_dma.c */
 extern int gamma_dma_init( struct inode *inode, struct file *filp,
                         unsigned int cmd, unsigned long arg );
Index: linux/drm/kernel/i810.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810.h,v
retrieving revision 1.7
diff -u -r1.7 i810.h
--- linux/drm/kernel/i810.h     5 Jul 2002 08:31:09 -0000       1.7
+++ linux/drm/kernel/i810.h     23 Feb 2003 19:54:48 -0000
@@ -86,7 +86,7 @@
  */
 #define __HAVE_RELEASE         1
 #define DRIVER_RELEASE() do {                                          \
-       i810_reclaim_buffers( dev, priv->pid );                         \
+       i810_reclaim_buffers( filp );                           \
 } while (0)
 
 /* DMA customization:
Index: linux/drm/kernel/i810_dma.c
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_dma.c,v
retrieving revision 1.39
diff -u -r1.39 i810_dma.c
--- linux/drm/kernel/i810_dma.c 12 Dec 2002 16:45:31 -0000      1.39
+++ linux/drm/kernel/i810_dma.c 23 Feb 2003 19:54:48 -0000
@@ -260,7 +260,7 @@
                DRM_DEBUG("mapbuf failed, retcode %d\n", retcode);
                return retcode;
        }
-       buf->pid     = priv->pid;
+       buf->filp = filp;
        buf_priv = buf->dev_private;
        d->granted = 1;
        d->request_idx = buf->idx;
@@ -889,8 +889,10 @@
 }
 
 /* Must be called with the lock held */
-void i810_reclaim_buffers(drm_device_t *dev, pid_t pid)
+void i810_reclaim_buffers(struct file *filp)
 {
+       drm_file_t    *priv   = filp->private_data;
+       drm_device_t  *dev    = priv->dev;
        drm_device_dma_t *dma = dev->dma;
        int              i;
 
Index: linux/drm/kernel/i810_drv.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i810_drv.h,v
retrieving revision 1.15
diff -u -r1.15 i810_drv.h
--- linux/drm/kernel/i810_drv.h 22 Oct 2002 23:38:53 -0000      1.15
+++ linux/drm/kernel/i810_drv.h 23 Feb 2003 19:54:48 -0000
@@ -88,7 +88,7 @@
                          unsigned int cmd, unsigned long arg);
 extern int  i810_flush_ioctl(struct inode *inode, struct file *filp,
                             unsigned int cmd, unsigned long arg);
-extern void i810_reclaim_buffers(drm_device_t *dev, pid_t pid);
+extern void i810_reclaim_buffers(struct file *filp);
 extern int  i810_getage(struct inode *inode, struct file *filp,
                        unsigned int cmd, unsigned long arg);
 extern int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma);
Index: linux/drm/kernel/i830.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i830.h,v
retrieving revision 1.3
diff -u -r1.3 i830.h
--- linux/drm/kernel/i830.h     11 Sep 2002 00:57:49 -0000      1.3
+++ linux/drm/kernel/i830.h     23 Feb 2003 19:54:48 -0000
@@ -72,7 +72,7 @@
  */
 #define __HAVE_RELEASE         1
 #define DRIVER_RELEASE() do {                                          \
-       i830_reclaim_buffers( dev, priv->pid );                         \
+       i830_reclaim_buffers( filp );                           \
 } while (0)
 
 /* DMA customization:
Index: linux/drm/kernel/i830_dma.c
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i830_dma.c,v
retrieving revision 1.11
diff -u -r1.11 i830_dma.c
--- linux/drm/kernel/i830_dma.c 22 Oct 2002 23:38:53 -0000      1.11
+++ linux/drm/kernel/i830_dma.c 23 Feb 2003 19:54:48 -0000
@@ -262,7 +262,7 @@
                DRM_ERROR("mapbuf failed, retcode %d\n", retcode);
                return retcode;
        }
-       buf->pid     = priv->pid;
+       buf->filp = filp;
        buf_priv = buf->dev_private;    
        d->granted = 1;
        d->request_idx = buf->idx;
@@ -1086,8 +1086,10 @@
 }
 
 /* Must be called with the lock held */
-void i830_reclaim_buffers(drm_device_t *dev, pid_t pid)
+void i830_reclaim_buffers( struct file *filp )
 {
+       drm_file_t    *priv   = filp->private_data;
+       drm_device_t  *dev    = priv->dev;
        drm_device_dma_t *dma = dev->dma;
        int              i;
 
Index: linux/drm/kernel/i830_drv.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/i830_drv.h,v
retrieving revision 1.3
diff -u -r1.3 i830_drv.h
--- linux/drm/kernel/i830_drv.h 22 Oct 2002 23:38:53 -0000      1.3
+++ linux/drm/kernel/i830_drv.h 23 Feb 2003 19:54:48 -0000
@@ -88,7 +88,7 @@
                          unsigned int cmd, unsigned long arg);
 extern int  i830_flush_ioctl(struct inode *inode, struct file *filp,
                             unsigned int cmd, unsigned long arg);
-extern void i830_reclaim_buffers(drm_device_t *dev, pid_t pid);
+extern void i830_reclaim_buffers(struct file *filp);
 extern int  i830_getage(struct inode *inode, struct file *filp, unsigned int cmd,
                        unsigned long arg);
 extern int i830_mmap_buffers(struct file *filp, struct vm_area_struct *vma);
Index: shared/drm/kernel/mga_dma.c
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/mga_dma.c,v
retrieving revision 1.6
diff -u -r1.6 mga_dma.c
--- shared/drm/kernel/mga_dma.c 29 Oct 2002 20:29:05 -0000      1.6
+++ shared/drm/kernel/mga_dma.c 23 Feb 2003 19:54:48 -0000
@@ -686,7 +686,7 @@
        drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private;
        drm_lock_t lock;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( lock, (drm_lock_t *)data, sizeof(lock) );
 
@@ -720,7 +720,7 @@
        DRM_DEVICE;
        drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        return mga_do_dma_reset( dev_priv );
 }
@@ -730,7 +730,8 @@
  * DMA buffer management
  */
 
-static int mga_dma_get_buffers( drm_device_t *dev, drm_dma_t *d )
+static int mga_dma_get_buffers( DRMFILE filp,
+                               drm_device_t *dev, drm_dma_t *d )
 {
        drm_buf_t *buf;
        int i;
@@ -739,7 +740,7 @@
                buf = mga_freelist_get( dev );
                if ( !buf ) return DRM_ERR(EAGAIN);
 
-               buf->pid = DRM_CURRENTPID;
+               buf->filp = filp;
 
                if ( DRM_COPY_TO_USER( &d->request_indices[i],
                                   &buf->idx, sizeof(buf->idx) ) )
@@ -761,7 +762,7 @@
        drm_dma_t d;
        int ret = 0;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( d, (drm_dma_t *)data, sizeof(d) );
 
@@ -786,7 +787,7 @@
        d.granted_count = 0;
 
        if ( d.request_count ) {
-               ret = mga_dma_get_buffers( dev, &d );
+               ret = mga_dma_get_buffers( filp, dev, &d );
        }
 
        DRM_COPY_TO_USER_IOCTL( (drm_dma_t *)data, d, sizeof(d) );
Index: shared/drm/kernel/mga_drv.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/mga_drv.h,v
retrieving revision 1.5
diff -u -r1.5 mga_drv.h
--- shared/drm/kernel/mga_drv.h 30 Oct 2002 06:10:33 -0000      1.5
+++ shared/drm/kernel/mga_drv.h 23 Feb 2003 19:54:48 -0000
@@ -186,16 +186,6 @@
        }                                                               \
 } while (0)
 
-#define LOCK_TEST_WITH_RETURN( dev )                                   \
-do {                                                                   \
-       if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||           \
-            dev->lock.pid != DRM_CURRENTPID ) {                                \
-               DRM_ERROR( "%s called without lock held\n",             \
-                          __FUNCTION__ );                                      \
-               return DRM_ERR(EINVAL);                         \
-       }                                                               \
-} while (0)
-
 #define WRAP_TEST_WITH_RETURN( dev_priv )                              \
 do {                                                                   \
        if ( test_bit( 0, &dev_priv->prim.wrapped ) ) {                 \
Index: shared/drm/kernel/mga_state.c
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/mga_state.c,v
retrieving revision 1.6
diff -u -r1.6 mga_state.c
--- shared/drm/kernel/mga_state.c       30 Oct 2002 06:10:34 -0000      1.6
+++ shared/drm/kernel/mga_state.c       23 Feb 2003 19:54:49 -0000
@@ -887,7 +887,7 @@
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
        drm_mga_clear_t clear;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( clear, (drm_mga_clear_t *)data, sizeof(clear) );
 
@@ -911,7 +911,7 @@
        drm_mga_private_t *dev_priv = dev->dev_private;
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS )
                sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
@@ -936,7 +936,7 @@
        drm_mga_buf_priv_t *buf_priv;
        drm_mga_vertex_t vertex;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( vertex,
                             (drm_mga_vertex_t *)data,
@@ -975,7 +975,7 @@
        drm_mga_buf_priv_t *buf_priv;
        drm_mga_indices_t indices;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( indices,
                             (drm_mga_indices_t *)data,
@@ -1015,7 +1015,7 @@
        drm_mga_iload_t iload;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( iload, (drm_mga_iload_t *)data, sizeof(iload) );
 
@@ -1055,7 +1055,7 @@
        drm_mga_blit_t blit;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( blit, (drm_mga_blit_t *)data, sizeof(blit) );
 
Index: shared/drm/kernel/r128_cce.c
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/r128_cce.c,v
retrieving revision 1.3
diff -u -r1.3 r128_cce.c
--- shared/drm/kernel/r128_cce.c        29 Aug 2002 07:34:49 -0000      1.3
+++ shared/drm/kernel/r128_cce.c        23 Feb 2003 19:54:49 -0000
@@ -663,7 +663,7 @@
        drm_r128_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( dev_priv->cce_running || dev_priv->cce_mode == R128_PM4_NONPM4 ) {
                DRM_DEBUG( "%s while CCE running\n", __FUNCTION__ );
@@ -686,7 +686,7 @@
        int ret;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL(stop, (drm_r128_cce_stop_t *)data, sizeof(stop) );
 
@@ -725,7 +725,7 @@
        drm_r128_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_DEBUG( "%s called before init done\n", __FUNCTION__ );
@@ -746,7 +746,7 @@
        drm_r128_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( dev_priv->cce_running ) {
                r128_do_cce_flush( dev_priv );
@@ -760,7 +760,7 @@
        DRM_DEVICE;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        return r128_do_engine_reset( dev );
 }
@@ -807,7 +807,7 @@
        DRM_DEVICE;
        drm_r128_fullscreen_t fs;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( fs, (drm_r128_fullscreen_t *)data, sizeof(fs) );
 
@@ -889,7 +889,7 @@
        for ( i = 0 ; i < dma->buf_count ; i++ ) {
                buf = dma->buflist[i];
                buf_priv = buf->dev_private;
-               if ( buf->pid == 0 )
+               if ( buf->filp == 0 )
                        return buf;
        }
 
@@ -948,7 +948,7 @@
        return DRM_ERR(EBUSY);
 }
 
-static int r128_cce_get_buffers( drm_device_t *dev, drm_dma_t *d )
+static int r128_cce_get_buffers( DRMFILE filp, drm_device_t *dev, drm_dma_t *d )
 {
        int i;
        drm_buf_t *buf;
@@ -957,7 +957,7 @@
                buf = r128_freelist_get( dev );
                if ( !buf ) return DRM_ERR(EAGAIN);
 
-               buf->pid = DRM_CURRENTPID;
+               buf->filp = filp;
 
                if ( DRM_COPY_TO_USER( &d->request_indices[i], &buf->idx,
                                   sizeof(buf->idx) ) )
@@ -978,7 +978,7 @@
        int ret = 0;
        drm_dma_t d;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( d, (drm_dma_t *) data, sizeof(d) );
 
@@ -1001,7 +1001,7 @@
        d.granted_count = 0;
 
        if ( d.request_count ) {
-               ret = r128_cce_get_buffers( dev, &d );
+               ret = r128_cce_get_buffers( filp, dev, &d );
        }
 
        DRM_COPY_TO_USER_IOCTL((drm_dma_t *) data, d, sizeof(d) );
Index: shared/drm/kernel/r128_drv.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/r128_drv.h,v
retrieving revision 1.4
diff -u -r1.4 r128_drv.h
--- shared/drm/kernel/r128_drv.h        30 Oct 2002 06:10:34 -0000      1.4
+++ shared/drm/kernel/r128_drv.h        23 Feb 2003 19:54:49 -0000
@@ -403,15 +403,6 @@
  * Misc helper macros
  */
 
-#define LOCK_TEST_WITH_RETURN( dev )                                   \
-do {                                                                   \
-       if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||           \
-            dev->lock.pid != DRM_CURRENTPID ) {                        \
-               DRM_ERROR( "%s called without lock held\n", __FUNCTION__ );     \
-               return DRM_ERR(EINVAL);                         \
-       }                                                               \
-} while (0)
-
 #define RING_SPACE_TEST_WITH_RETURN( dev_priv )                                \
 do {                                                                   \
        drm_r128_ring_buffer_t *ring = &dev_priv->ring; int i;          \
Index: shared/drm/kernel/r128_state.c
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/r128_state.c,v
retrieving revision 1.4
diff -u -r1.4 r128_state.c
--- shared/drm/kernel/r128_state.c      30 Oct 2002 06:10:34 -0000      1.4
+++ shared/drm/kernel/r128_state.c      23 Feb 2003 19:54:49 -0000
@@ -778,7 +778,8 @@
        sarea_priv->nbox = 0;
 }
 
-static int r128_cce_dispatch_blit( drm_device_t *dev,
+static int r128_cce_dispatch_blit( DRMFILE filp,
+                                  drm_device_t *dev,
                                   drm_r128_blit_t *blit )
 {
        drm_r128_private_t *dev_priv = dev->dev_private;
@@ -829,9 +830,9 @@
        buf = dma->buflist[blit->idx];
        buf_priv = buf->dev_private;
 
-       if ( buf->pid != DRM_CURRENTPID ) {
+       if ( buf->filp != filp ) {
                DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1240,7 +1241,7 @@
        drm_r128_clear_t clear;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( clear, (drm_r128_clear_t *) data,
                             sizeof(clear) );
@@ -1266,7 +1267,7 @@
        drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
 
@@ -1293,7 +1294,7 @@
        drm_r128_buf_priv_t *buf_priv;
        drm_r128_vertex_t vertex;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1324,9 +1325,9 @@
        buf = dma->buflist[vertex.idx];
        buf_priv = buf->dev_private;
 
-       if ( buf->pid != DRM_CURRENTPID ) {
+       if ( buf->filp != filp ) {
                DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1353,7 +1354,7 @@
        drm_r128_indices_t elts;
        int count;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1383,9 +1384,9 @@
        buf = dma->buflist[elts.idx];
        buf_priv = buf->dev_private;
 
-       if ( buf->pid != DRM_CURRENTPID ) {
+       if ( buf->filp != filp ) {
                DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1421,7 +1422,7 @@
        drm_r128_private_t *dev_priv = dev->dev_private;
        drm_r128_blit_t blit;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( blit, (drm_r128_blit_t *) data,
                             sizeof(blit) );
@@ -1437,7 +1438,7 @@
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
        VB_AGE_TEST_WITH_RETURN( dev_priv );
 
-       return r128_cce_dispatch_blit( dev, &blit );
+       return r128_cce_dispatch_blit( filp, dev, &blit );
 }
 
 int r128_cce_depth( DRM_IOCTL_ARGS )
@@ -1446,7 +1447,7 @@
        drm_r128_private_t *dev_priv = dev->dev_private;
        drm_r128_depth_t depth;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( depth, (drm_r128_depth_t *) data,
                             sizeof(depth) );
@@ -1474,7 +1475,7 @@
        drm_r128_stipple_t stipple;
        u32 mask[32];
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( stipple, (drm_r128_stipple_t *) data,
                             sizeof(stipple) );
@@ -1502,7 +1503,7 @@
        RING_LOCALS;
 #endif
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1525,9 +1526,9 @@
        buf = dma->buflist[indirect.idx];
        buf_priv = buf->dev_private;
 
-       if ( buf->pid != DRM_CURRENTPID ) {
+       if ( buf->filp != filp ) {
                DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
Index: shared/drm/kernel/radeon.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon.h,v
retrieving revision 1.12
diff -u -r1.12 radeon.h
--- shared/drm/kernel/radeon.h  8 Feb 2003 18:02:02 -0000       1.12
+++ shared/drm/kernel/radeon.h  23 Feb 2003 19:54:49 -0000
@@ -120,19 +120,17 @@
                if ( dev_priv->page_flipping ) {                        \
                        radeon_do_cleanup_pageflip( dev );              \
                }                                                       \
-                radeon_mem_release( dev_priv->agp_heap );              \
-                radeon_mem_release( dev_priv->fb_heap );               \
+                radeon_mem_release( filp, dev_priv->agp_heap );                \
+                radeon_mem_release( filp, dev_priv->fb_heap );         \
        }                                                               \
 } while (0)
 
 /* When the last client dies, shut down the CP and free dev->dev_priv.
  */
-#define __HAVE_RELEASE 1
-#define DRIVER_RELEASE()                       \
+/* #define __HAVE_RELEASE 1 */
+#define DRIVER_PRETAKEDOWN()                   \
 do {                                           \
-        DRM(reclaim_buffers)( dev, priv->pid ); \
-       if ( dev->open_count == 1)              \
-                 radeon_do_release( dev );     \
+    radeon_do_release( dev );                  \
 } while (0)
 
 
Index: shared/drm/kernel/radeon_cp.c
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_cp.c,v
retrieving revision 1.17
diff -u -r1.17 radeon_cp.c
--- shared/drm/kernel/radeon_cp.c       16 Jan 2003 06:20:44 -0000      1.17
+++ shared/drm/kernel/radeon_cp.c       23 Feb 2003 19:54:49 -0000
@@ -1322,7 +1322,7 @@
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( dev_priv->cp_running ) {
                DRM_DEBUG( "%s while CP running\n", __FUNCTION__ );
@@ -1350,7 +1350,7 @@
        int ret;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( stop, (drm_radeon_cp_stop_t *)data, sizeof(stop) );
 
@@ -1425,7 +1425,7 @@
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_DEBUG( "%s called before init done\n", __FUNCTION__ );
@@ -1446,7 +1446,7 @@
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        return radeon_do_cp_idle( dev_priv );
 }
@@ -1456,7 +1456,7 @@
        DRM_DEVICE;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        return radeon_do_engine_reset( dev );
 }
@@ -1515,7 +1515,7 @@
                for ( i = start ; i < dma->buf_count ; i++ ) {
                        buf = dma->buflist[i];
                        buf_priv = buf->dev_private;
-                       if ( buf->pid == 0 || (buf->pending && 
+                       if ( buf->filp == 0 || (buf->pending && 
                                               buf_priv->age <= done_age) ) {
                                dev_priv->stats.requested_bufs++;
                                buf->pending = 0;
@@ -1554,7 +1554,7 @@
                for ( i = start ; i < dma->buf_count ; i++ ) {
                        buf = dma->buflist[i];
                        buf_priv = buf->dev_private;
-                       if ( buf->pid == 0 || (buf->pending && 
+                       if ( buf->filp == 0 || (buf->pending && 
                                               buf_priv->age <= done_age) ) {
                                dev_priv->stats.requested_bufs++;
                                buf->pending = 0;
@@ -1619,7 +1619,7 @@
        return DRM_ERR(EBUSY);
 }
 
-static int radeon_cp_get_buffers( drm_device_t *dev, drm_dma_t *d )
+static int radeon_cp_get_buffers( DRMFILE filp, drm_device_t *dev, drm_dma_t *d )
 {
        int i;
        drm_buf_t *buf;
@@ -1628,7 +1628,7 @@
                buf = radeon_freelist_get( dev );
                if ( !buf ) return DRM_ERR(EBUSY); /* NOTE: broken client */
 
-               buf->pid = DRM_CURRENTPID;
+               buf->filp = filp;
 
                if ( DRM_COPY_TO_USER( &d->request_indices[i], &buf->idx,
                                   sizeof(buf->idx) ) )
@@ -1649,7 +1649,7 @@
        int ret = 0;
        drm_dma_t d;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( d, (drm_dma_t *)data, sizeof(d) );
 
@@ -1672,7 +1672,7 @@
        d.granted_count = 0;
 
        if ( d.request_count ) {
-               ret = radeon_cp_get_buffers( dev, &d );
+               ret = radeon_cp_get_buffers( filp, dev, &d );
        }
 
        DRM_COPY_TO_USER_IOCTL( (drm_dma_t *)data, d, sizeof(d) );
Index: shared/drm/kernel/radeon_drv.h
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_drv.h,v
retrieving revision 1.13
diff -u -r1.13 radeon_drv.h
--- shared/drm/kernel/radeon_drv.h      4 Feb 2003 19:20:18 -0000       1.13
+++ shared/drm/kernel/radeon_drv.h      23 Feb 2003 19:54:49 -0000
@@ -67,7 +67,7 @@
        struct mem_block *prev;
        int start;
        int size;
-       int pid;                /* 0: free, -1: heap, other: real pids */
+       DRMFILE filp;           /* 0: free, -1: heap, other: real files */
 };
 
 typedef struct drm_radeon_private {
@@ -183,7 +183,7 @@
 extern int radeon_mem_free( DRM_IOCTL_ARGS );
 extern int radeon_mem_init_heap( DRM_IOCTL_ARGS );
 extern void radeon_mem_takedown( struct mem_block **heap );
-extern void radeon_mem_release( struct mem_block *heap );
+extern void radeon_mem_release( DRMFILE filp, struct mem_block *heap );
 
                                /* radeon_irq.c */
 extern int radeon_irq_emit( DRM_IOCTL_ARGS );
@@ -771,16 +771,6 @@
 /* ================================================================
  * Misc helper macros
  */
-
-#define LOCK_TEST_WITH_RETURN( dev )                                   \
-do {                                                                   \
-       if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||           \
-            dev->lock.pid != DRM_CURRENTPID ) {                        \
-               DRM_ERROR( "%s called without lock held\n", __FUNCTION__ );     \
-               return DRM_ERR(EINVAL);                         \
-       }                                                               \
-} while (0)
-
 
 /* Perfbox functionality only.  
  */
Index: shared/drm/kernel/radeon_irq.c
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_irq.c,v
retrieving revision 1.12
diff -u -r1.12 radeon_irq.c
--- shared/drm/kernel/radeon_irq.c      4 Feb 2003 15:56:37 -0000       1.12
+++ shared/drm/kernel/radeon_irq.c      23 Feb 2003 19:54:49 -0000
@@ -179,7 +179,7 @@
        drm_radeon_irq_emit_t emit;
        int result;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
Index: shared/drm/kernel/radeon_mem.c
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_mem.c,v
retrieving revision 1.4
diff -u -r1.4 radeon_mem.c
--- shared/drm/kernel/radeon_mem.c      6 Jan 2003 07:38:25 -0000       1.4
+++ shared/drm/kernel/radeon_mem.c      23 Feb 2003 19:54:49 -0000
@@ -40,7 +40,7 @@
  */
 
 static struct mem_block *split_block(struct mem_block *p, int start, int size,
-                                    int pid )
+                                    DRMFILE filp )
 {
        /* Maybe cut off the start of an existing block */
        if (start > p->start) {
@@ -49,7 +49,7 @@
                        goto out;
                newblock->start = start;
                newblock->size = p->size - (start - p->start);
-               newblock->pid = 0;
+               newblock->filp = 0;
                newblock->next = p->next;
                newblock->prev = p;
                p->next->prev = newblock;
@@ -65,7 +65,7 @@
                        goto out;
                newblock->start = start + size;
                newblock->size = p->size - size;
-               newblock->pid = 0;
+               newblock->filp = 0;
                newblock->next = p->next;
                newblock->prev = p;
                p->next->prev = newblock;
@@ -75,20 +75,20 @@
 
  out:
        /* Our block is in the middle */
-       p->pid = pid;
+       p->filp = filp;
        return p;
 }
 
 static struct mem_block *alloc_block( struct mem_block *heap, int size, 
-                                     int align2, int pid )
+                                     int align2, DRMFILE filp )
 {
        struct mem_block *p;
        int mask = (1 << align2)-1;
 
        for (p = heap->next ; p != heap ; p = p->next) {
                int start = (p->start + mask) & ~mask;
-               if (p->pid == 0 && start + size <= p->start + p->size)
-                       return split_block( p, start, size, pid );
+               if (p->filp == 0 && start + size <= p->start + p->size)
+                       return split_block( p, start, size, filp );
        }
 
        return NULL;
@@ -108,12 +108,12 @@
 
 static void free_block( struct mem_block *p )
 {
-       p->pid = 0;
+       p->filp = 0;
 
-       /* Assumes a single contiguous range.  Needs a special pid in
+       /* Assumes a single contiguous range.  Needs a special filp in
         * 'heap' to stop it being subsumed.
         */
-       if (p->next->pid == 0) {
+       if (p->next->filp == 0) {
                struct mem_block *q = p->next;
                p->size += q->size;
                p->next = q->next;
@@ -121,7 +121,7 @@
                DRM_FREE(q);
        }
 
-       if (p->prev->pid == 0) {
+       if (p->prev->filp == 0) {
                struct mem_block *q = p->prev;
                q->size += p->size;
                q->next = p->next;
@@ -147,36 +147,35 @@
 
        blocks->start = start;
        blocks->size = size;
-       blocks->pid = 0;
+       blocks->filp = 0;
        blocks->next = blocks->prev = *heap;
 
        memset( *heap, 0, sizeof(**heap) );
-       (*heap)->pid = -1;
+       (*heap)->filp = (DRMFILE) -1;
        (*heap)->next = (*heap)->prev = blocks;
        return 0;
 }
 
 
-/* Free all blocks associated with the releasing pid.
+/* Free all blocks associated with the releasing file.
  */
-void radeon_mem_release( struct mem_block *heap )
+void radeon_mem_release( DRMFILE filp, struct mem_block *heap )
 {
-       int pid = DRM_CURRENTPID;
        struct mem_block *p;
 
        if (!heap || !heap->next)
                return;
 
        for (p = heap->next ; p != heap ; p = p->next) {
-               if (p->pid == pid) 
-                       p->pid = 0;
+               if (p->filp == filp) 
+                       p->filp = 0;
        }
 
-       /* Assumes a single contiguous range.  Needs a special pid in
+       /* Assumes a single contiguous range.  Needs a special filp in
         * 'heap' to stop it being subsumed.
         */
        for (p = heap->next ; p != heap ; p = p->next) {
-               while (p->pid == 0 && p->next->pid == 0) {
+               while (p->filp == 0 && p->next->filp == 0) {
                        struct mem_block *q = p->next;
                        p->size += q->size;
                        p->next = q->next;
@@ -248,7 +247,7 @@
                alloc.alignment = 12;
 
        block = alloc_block( *heap, alloc.size, alloc.alignment,
-                            DRM_CURRENTPID );
+                            filp );
 
        if (!block) 
                return DRM_ERR(ENOMEM);
@@ -287,7 +286,7 @@
        if (!block)
                return DRM_ERR(EFAULT);
 
-       if (block->pid != DRM_CURRENTPID)
+       if (block->filp != filp)
                return DRM_ERR(EPERM);
 
        free_block( block );    
Index: shared/drm/kernel/radeon_state.c
===================================================================
RCS file: 
/cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/radeon_state.c,v
retrieving revision 1.16
diff -u -r1.16 radeon_state.c
--- shared/drm/kernel/radeon_state.c    6 Feb 2003 18:20:00 -0000       1.16
+++ shared/drm/kernel/radeon_state.c    23 Feb 2003 19:54:49 -0000
@@ -1063,7 +1063,8 @@
 
 #define RADEON_MAX_TEXTURE_SIZE (RADEON_BUFFER_SIZE - 8 * sizeof(u32))
 
-static int radeon_cp_dispatch_texture( drm_device_t *dev,
+static int radeon_cp_dispatch_texture( DRMFILE filp,
+                                      drm_device_t *dev,
                                       drm_radeon_texture_t *tex,
                                       drm_radeon_tex_image_t *image )
 {
@@ -1216,7 +1217,7 @@
                        }
                }
 
-               buf->pid = DRM_CURRENTPID;
+               buf->filp = filp;
                buf->used = (dwords + 8) * sizeof(u32);
                radeon_cp_dispatch_indirect( dev, buf, 0, buf->used );
                radeon_cp_discard_buffer( dev, buf );
@@ -1273,7 +1274,7 @@
        drm_radeon_clear_rect_t depth_boxes[RADEON_NR_SAREA_CLIPRECTS];
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( clear, (drm_radeon_clear_t *)data,
                             sizeof(clear) );
@@ -1342,7 +1343,7 @@
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
 
@@ -1362,7 +1363,7 @@
        drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
 
@@ -1386,7 +1387,7 @@
        drm_radeon_vertex_t vertex;
        drm_radeon_tcl_prim_t prim;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1416,9 +1417,9 @@
 
        buf = dma->buflist[vertex.idx];
 
-       if ( buf->pid != DRM_CURRENTPID ) {
-               DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+       if ( buf->filp != filp ) {
+               DRM_ERROR( "process %d using buffer owned by %p\n",
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1473,7 +1474,7 @@
        drm_radeon_tcl_prim_t prim;
        int count;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1503,9 +1504,9 @@
 
        buf = dma->buflist[elts.idx];
 
-       if ( buf->pid != DRM_CURRENTPID ) {
-               DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+       if ( buf->filp != filp ) {
+               DRM_ERROR( "process %d using buffer owned by %p\n",
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1568,7 +1569,7 @@
        drm_radeon_tex_image_t image;
        int ret;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( tex, (drm_radeon_texture_t *)data, sizeof(tex) );
 
@@ -1585,7 +1586,7 @@
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
        VB_AGE_TEST_WITH_RETURN( dev_priv );
 
-       ret = radeon_cp_dispatch_texture( dev, &tex, &image );
+       ret = radeon_cp_dispatch_texture( filp, dev, &tex, &image );
 
        COMMIT_RING();
        return ret;
@@ -1598,7 +1599,7 @@
        drm_radeon_stipple_t stipple;
        u32 mask[32];
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( stipple, (drm_radeon_stipple_t *)data,
                             sizeof(stipple) );
@@ -1623,7 +1624,7 @@
        drm_radeon_indirect_t indirect;
        RING_LOCALS;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1645,9 +1646,9 @@
 
        buf = dma->buflist[indirect.idx];
 
-       if ( buf->pid != DRM_CURRENTPID ) {
-               DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+       if ( buf->filp != filp ) {
+               DRM_ERROR( "process %d using buffer owned by %p\n",
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1700,7 +1701,7 @@
        int i;
        unsigned char laststate;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1725,9 +1726,9 @@
 
        buf = dma->buflist[vertex.idx];
 
-       if ( buf->pid != DRM_CURRENTPID ) {
-               DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+       if ( buf->filp != filp ) {
+               DRM_ERROR( "process %d using buffer owned by %p\n",
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
 
@@ -2027,7 +2028,7 @@
        drm_radeon_cmd_header_t header;
        int orig_nbox;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -2096,8 +2097,9 @@
                        }
 
                        buf = dma->buflist[idx];
-                       if ( buf->pid != DRM_CURRENTPID || buf->pending ) {
-                               DRM_ERROR( "bad buffer\n" );
+                       if ( buf->filp != filp || buf->pending ) {
+                               DRM_ERROR( "bad buffer %p %p %d\n",
+                                          buf->filp, filp, buf->pending);
                                return DRM_ERR(EINVAL);
                        }
 

Reply via email to