gralloc: Fix issue with mmap/munmap meta due to reserved size am: 5996c60385 am: e71b43ab61
Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/qcom/sm7250/display/+/19355798
Change-Id: If3e067b334bfd88314c875d930407327d0fed043
Signed-off-by: Automerger Merge Worker <[email protected]>
diff --git a/gralloc/gr_buf_mgr.cpp b/gralloc/gr_buf_mgr.cpp
index 3110192..cd14a6b 100644
--- a/gralloc/gr_buf_mgr.cpp
+++ b/gralloc/gr_buf_mgr.cpp
@@ -67,14 +67,15 @@
return static_cast<uint64_t>(ROUND_UP_PAGESIZE(sizeof(MetaData_t) + reserved_region_size));
}
-static void unmapAndReset(private_handle_t *handle, uint64_t reserved_region_size = 0) {
+static void unmapAndReset(private_handle_t *handle) {
+ uint64_t reserved_region_size = handle->reserved_size;
if (private_handle_t::validate(handle) == 0 && handle->base_metadata) {
munmap(reinterpret_cast<void *>(handle->base_metadata), getMetaDataSize(reserved_region_size));
handle->base_metadata = 0;
}
}
-static int validateAndMap(private_handle_t *handle, uint64_t reserved_region_size = 0) {
+static int validateAndMap(private_handle_t *handle) {
if (private_handle_t::validate(handle)) {
ALOGE("%s: Private handle is invalid - handle:%p", __func__, handle);
return -1;
@@ -85,6 +86,7 @@
}
if (!handle->base_metadata) {
+ uint64_t reserved_region_size = handle->reserved_size;
uint64_t size = getMetaDataSize(reserved_region_size);
void *base = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, handle->fd_metadata, 0);
if (base == reinterpret_cast<void *>(MAP_FAILED)) {
@@ -93,24 +95,6 @@
return -1;
}
handle->base_metadata = (uintptr_t)base;
-#ifdef METADATA_V2
- // The allocator process gets the reserved region size from the BufferDescriptor.
- // When importing to another process, the reserved size is unknown until mapping the metadata,
- // hence the re-mapping below
- auto metadata = reinterpret_cast<MetaData_t*>(handle->base_metadata);
- if (reserved_region_size == 0 && metadata->reservedSize) {
- size = getMetaDataSize(metadata->reservedSize);
- unmapAndReset(handle);
- void *new_base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
- handle->fd_metadata, 0);
- if (new_base == reinterpret_cast<void*>(MAP_FAILED)) {
- ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s",
- __func__, handle, handle->fd_metadata, strerror(errno));
- return -1;
- }
- handle->base_metadata = (uintptr_t)new_base;
- }
-#endif
}
return 0;
}
@@ -741,7 +725,7 @@
return Error::BAD_BUFFER;
}
- auto meta_size = getMetaDataSize(buf->reserved_size);
+ auto meta_size = getMetaDataSize(hnd->reserved_size);
if (allocator_->FreeBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset, hnd->fd,
buf->ion_handle_main) != 0) {
@@ -1073,6 +1057,7 @@
data.fd, e_data.fd, INT(flags), INT(alignedw), INT(alignedh), descriptor.GetWidth(),
descriptor.GetHeight(), format, buffer_type, data.size, usage);
+ hnd->reserved_size = descriptor.GetReservedSize();
hnd->id = ++next_id_;
hnd->base = 0;
hnd->base_metadata = 0;
@@ -1083,11 +1068,7 @@
setMetaDataAndUnmap(hnd, SET_GRAPHICS_METADATA, reinterpret_cast<void *>(&graphics_metadata));
}
-#ifdef METADATA_V2
- auto error = validateAndMap(hnd, descriptor.GetReservedSize());
-#else
auto error = validateAndMap(hnd);
-#endif
if (error != 0) {
ALOGE("validateAndMap failed");
@@ -1109,7 +1090,7 @@
metadata->crop.right = hnd->width;
metadata->crop.bottom = hnd->height;
- unmapAndReset(hnd, descriptor.GetReservedSize());
+ unmapAndReset(hnd);
*handle = hnd;