mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-04 21:18:05 +02:00
make sure we never oops because the hardware lock pointer in the sigdata
structure is out of date
This commit is contained in:
parent
c4318a5c64
commit
cfa1a918b6
6 changed files with 8 additions and 6 deletions
|
|
@ -137,6 +137,7 @@ int DRM(addmap)( struct inode *inode, struct file *filp,
|
|||
}
|
||||
map->offset = (unsigned long)map->handle;
|
||||
if ( map->flags & _DRM_CONTAINS_LOCK ) {
|
||||
dev->sigdata.lock =
|
||||
dev->lock.hw_lock = map->handle; /* Pointer to lock */
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -306,7 +306,7 @@ static int DRM(setup)( drm_device_t *dev )
|
|||
dev->map_count = 0;
|
||||
|
||||
dev->vmalist = NULL;
|
||||
dev->lock.hw_lock = NULL;
|
||||
dev->sigdata.lock = dev->lock.hw_lock = NULL;
|
||||
init_waitqueue_head( &dev->lock.lock_queue );
|
||||
dev->queue_count = 0;
|
||||
dev->queue_reserved = 0;
|
||||
|
|
@ -491,7 +491,7 @@ static int DRM(takedown)( drm_device_t *dev )
|
|||
DRM(dma_takedown)( dev );
|
||||
#endif
|
||||
if ( dev->lock.hw_lock ) {
|
||||
dev->lock.hw_lock = NULL; /* SHM removed */
|
||||
dev->sigdata.lock = dev->lock.hw_lock = NULL; /* SHM removed */
|
||||
dev->lock.pid = 0;
|
||||
wake_up_interruptible( &dev->lock.lock_queue );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -237,7 +237,7 @@ int DRM(notifier)(void *priv)
|
|||
|
||||
|
||||
/* Allow signal delivery if lock isn't held */
|
||||
if (!_DRM_LOCK_IS_HELD(s->lock->lock)
|
||||
if (!s->lock || !_DRM_LOCK_IS_HELD(s->lock->lock)
|
||||
|| _DRM_LOCKING_CONTEXT(s->lock->lock) != s->context) return 1;
|
||||
|
||||
/* Otherwise, set flag to force call to
|
||||
|
|
|
|||
|
|
@ -137,6 +137,7 @@ int DRM(addmap)( struct inode *inode, struct file *filp,
|
|||
}
|
||||
map->offset = (unsigned long)map->handle;
|
||||
if ( map->flags & _DRM_CONTAINS_LOCK ) {
|
||||
dev->sigdata.lock =
|
||||
dev->lock.hw_lock = map->handle; /* Pointer to lock */
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -306,7 +306,7 @@ static int DRM(setup)( drm_device_t *dev )
|
|||
dev->map_count = 0;
|
||||
|
||||
dev->vmalist = NULL;
|
||||
dev->lock.hw_lock = NULL;
|
||||
dev->sigdata.lock = dev->lock.hw_lock = NULL;
|
||||
init_waitqueue_head( &dev->lock.lock_queue );
|
||||
dev->queue_count = 0;
|
||||
dev->queue_reserved = 0;
|
||||
|
|
@ -491,7 +491,7 @@ static int DRM(takedown)( drm_device_t *dev )
|
|||
DRM(dma_takedown)( dev );
|
||||
#endif
|
||||
if ( dev->lock.hw_lock ) {
|
||||
dev->lock.hw_lock = NULL; /* SHM removed */
|
||||
dev->sigdata.lock = dev->lock.hw_lock = NULL; /* SHM removed */
|
||||
dev->lock.pid = 0;
|
||||
wake_up_interruptible( &dev->lock.lock_queue );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -237,7 +237,7 @@ int DRM(notifier)(void *priv)
|
|||
|
||||
|
||||
/* Allow signal delivery if lock isn't held */
|
||||
if (!_DRM_LOCK_IS_HELD(s->lock->lock)
|
||||
if (!s->lock || !_DRM_LOCK_IS_HELD(s->lock->lock)
|
||||
|| _DRM_LOCKING_CONTEXT(s->lock->lock) != s->context) return 1;
|
||||
|
||||
/* Otherwise, set flag to force call to
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue