summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Bornecrantz <jakob@vmware.com>2010-01-15 20:13:20 +0000
committerJakob Bornecrantz <jakob@vmware.com>2010-01-15 20:13:20 +0000
commit2959266188dd564975503d74e24b55013f58f861 (patch)
tree62589f2cf5d276b994910944dfa81de93a127081
parent320811b282d7f57b364f8414e2e7b714f89b0503 (diff)
libkms: Fix multiple map unmap in vmwgfx and add comment in intel
-rw-r--r--libkms/intel.c5
-rw-r--r--libkms/vmwgfx.c20
2 files changed, 15 insertions, 10 deletions
diff --git a/libkms/intel.c b/libkms/intel.c
index 784ee7b6..670494e7 100644
--- a/libkms/intel.c
+++ b/libkms/intel.c
@@ -220,8 +220,11 @@ intel_bo_destroy(struct kms_bo *_bo)
struct drm_gem_close arg;
int ret;
- if (bo->base.ptr)
+ if (bo->base.ptr) {
+ /* XXX Sanity check map_count */
munmap(bo->base.ptr, bo->base.size);
+ bo->base.ptr = NULL;
+ }
memset(&arg, 0, sizeof(arg));
arg.handle = bo->base.handle;
diff --git a/libkms/vmwgfx.c b/libkms/vmwgfx.c
index 5030b7e3..bcbc240a 100644
--- a/libkms/vmwgfx.c
+++ b/libkms/vmwgfx.c
@@ -160,16 +160,17 @@ vmwgfx_bo_map(struct kms_bo *_bo, void **out)
struct vmwgfx_bo *bo = (struct vmwgfx_bo *)_bo;
void *map;
- if (!bo->map_count) {
- map = mmap(NULL, bo->base.size, PROT_READ | PROT_WRITE,
- MAP_SHARED, bo->base.kms->fd, bo->map_handle);
-
- if (!map)
- return -ENOMEM;
-
- bo->base.ptr = map;
+ if (bo->base.ptr) {
+ bo->map_count++;
+ *out = bo->base.ptr;
+ return 0;
}
+ map = mmap(NULL, bo->base.size, PROT_READ | PROT_WRITE, MAP_SHARED, bo->base.kms->fd, bo->map_handle);
+ if (map == MAP_FAILED)
+ return -errno;
+
+ bo->base.ptr = map;
bo->map_count++;
*out = bo->base.ptr;
@@ -190,7 +191,8 @@ vmwgfx_bo_destroy(struct kms_bo *_bo)
struct vmwgfx_bo *bo = (struct vmwgfx_bo *)_bo;
struct drm_vmw_unref_dmabuf_arg arg;
- if (bo->map_count) {
+ if (bo->base.ptr) {
+ /* XXX Sanity check map_count */
munmap(bo->base.ptr, bo->base.size);
bo->base.ptr = NULL;
}