summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <anholt@freebsd.org>2003-11-06 04:48:06 +0000
committerEric Anholt <anholt@freebsd.org>2003-11-06 04:48:06 +0000
commit1f7598245af7e73b34130a44fbaac230e29d7aad (patch)
tree050abd77d041309e17a37649ed41e2e3cc2d03ae
parent2c1172a31794e20f7ba1a2ab234d4dab2f84005b (diff)
downloaddrm-1f7598245af7e73b34130a44fbaac230e29d7aad.tar.gz
Return EBUSY when attempting to addmap a DRM_SHM area with a lock in it if
dev->lock.hw_lock is already set. This fixes the case of two X Servers running on the same head on different VTs with interface 1.1, by making the 2nd head fail to inizialize like before.
-rw-r--r--bsd-core/drm_bufs.c10
-rw-r--r--bsd/drm_bufs.h10
-rw-r--r--linux-core/drm_bufs.c6
-rw-r--r--linux/drm_bufs.h6
4 files changed, 32 insertions, 0 deletions
diff --git a/bsd-core/drm_bufs.c b/bsd-core/drm_bufs.c
index 0dc923d7..0915da84 100644
--- a/bsd-core/drm_bufs.c
+++ b/bsd-core/drm_bufs.c
@@ -136,6 +136,16 @@ int DRM(addmap)( DRM_IOCTL_ARGS )
}
map->offset = (unsigned long)map->handle;
if ( map->flags & _DRM_CONTAINS_LOCK ) {
+ /* Prevent a 2nd X Server from creating a 2nd lock */
+ DRM_LOCK();
+ if (dev->lock.hw_lock != NULL) {
+ DRM_UNLOCK();
+ DRM(free)(map->handle, map->size,
+ DRM_MEM_SAREA);
+ DRM(free)(map, sizeof(*map), DRM_MEM_MAPS);
+ return DRM_ERR(EBUSY);
+ }
+ DRM_UNLOCK();
dev->lock.hw_lock = map->handle; /* Pointer to lock */
}
break;
diff --git a/bsd/drm_bufs.h b/bsd/drm_bufs.h
index 0dc923d7..0915da84 100644
--- a/bsd/drm_bufs.h
+++ b/bsd/drm_bufs.h
@@ -136,6 +136,16 @@ int DRM(addmap)( DRM_IOCTL_ARGS )
}
map->offset = (unsigned long)map->handle;
if ( map->flags & _DRM_CONTAINS_LOCK ) {
+ /* Prevent a 2nd X Server from creating a 2nd lock */
+ DRM_LOCK();
+ if (dev->lock.hw_lock != NULL) {
+ DRM_UNLOCK();
+ DRM(free)(map->handle, map->size,
+ DRM_MEM_SAREA);
+ DRM(free)(map, sizeof(*map), DRM_MEM_MAPS);
+ return DRM_ERR(EBUSY);
+ }
+ DRM_UNLOCK();
dev->lock.hw_lock = map->handle; /* Pointer to lock */
}
break;
diff --git a/linux-core/drm_bufs.c b/linux-core/drm_bufs.c
index 77573709..e30e6de8 100644
--- a/linux-core/drm_bufs.c
+++ b/linux-core/drm_bufs.c
@@ -161,6 +161,12 @@ int DRM(addmap)( struct inode *inode, struct file *filp,
}
map->offset = (unsigned long)map->handle;
if ( map->flags & _DRM_CONTAINS_LOCK ) {
+ /* Prevent a 2nd X Server from creating a 2nd lock */
+ if (dev->lock.hw_lock != NULL) {
+ vfree( map->handle );
+ DRM(free)( map, sizeof(*map), DRM_MEM_MAPS );
+ return -EBUSY;
+ }
dev->sigdata.lock =
dev->lock.hw_lock = map->handle; /* Pointer to lock */
}
diff --git a/linux/drm_bufs.h b/linux/drm_bufs.h
index 77573709..e30e6de8 100644
--- a/linux/drm_bufs.h
+++ b/linux/drm_bufs.h
@@ -161,6 +161,12 @@ int DRM(addmap)( struct inode *inode, struct file *filp,
}
map->offset = (unsigned long)map->handle;
if ( map->flags & _DRM_CONTAINS_LOCK ) {
+ /* Prevent a 2nd X Server from creating a 2nd lock */
+ if (dev->lock.hw_lock != NULL) {
+ vfree( map->handle );
+ DRM(free)( map, sizeof(*map), DRM_MEM_MAPS );
+ return -EBUSY;
+ }
dev->sigdata.lock =
dev->lock.hw_lock = map->handle; /* Pointer to lock */
}