libgralloc: fix libgralloc error codes
Several ioctl calls were returning -1 instead of -errno, which may confuse upper layers, especially when the error is -ENOMEM. Also move some existing "err = -errno" calls to the top of if statements so that errno cannot change by libc calls in the error handling code. (cherry picked from commit a8eda532452651eb1fbae419319455de2a078ef0) Change-Id: I181f98d5a261e8e3e1b3f6ecd3ba288e7b4b5607
This commit is contained in:
		
				
					committed by
					
						 Andrew Sutherland
						Andrew Sutherland
					
				
			
			
				
	
			
			
			
						parent
						
							719d854bfd
						
					
				
				
					commit
					115d446fcb
				
			| @@ -56,7 +56,7 @@ int IonAlloc::open_device() | ||||
|  | ||||
| void IonAlloc::close_device() | ||||
| { | ||||
|     if(mIonFd > 0) | ||||
|     if(mIonFd >= 0) | ||||
|         close(mIonFd); | ||||
|     mIonFd = FD_INIT; | ||||
| } | ||||
| @@ -95,8 +95,8 @@ int IonAlloc::alloc_buffer(alloc_data& data) | ||||
|         iFd = mIonFd; | ||||
|     } | ||||
|  | ||||
|     err = ioctl(iFd, ION_IOC_ALLOC, &ionAllocData); | ||||
|     if(err) { | ||||
|     if(ioctl(iFd, ION_IOC_ALLOC, &ionAllocData)) { | ||||
|         err = -errno; | ||||
|         LOGE("ION_IOC_ALLOC failed with error - %s", strerror(errno)); | ||||
|         close_device(); | ||||
|         if(ionSyncFd >= 0) | ||||
| @@ -107,8 +107,8 @@ int IonAlloc::alloc_buffer(alloc_data& data) | ||||
|  | ||||
|     fd_data.handle = ionAllocData.handle; | ||||
|     handle_data.handle = ionAllocData.handle; | ||||
|     err = ioctl(iFd, ION_IOC_MAP, &fd_data); | ||||
|     if(err) { | ||||
|     if(ioctl(iFd, ION_IOC_MAP, &fd_data)) { | ||||
|         err = -errno; | ||||
|         LOGE("%s: ION_IOC_MAP failed with error - %s", | ||||
|                 __FUNCTION__, strerror(errno)); | ||||
|         ioctl(mIonFd, ION_IOC_FREE, &handle_data); | ||||
| @@ -124,9 +124,9 @@ int IonAlloc::alloc_buffer(alloc_data& data) | ||||
|         base = mmap(0, ionAllocData.len, PROT_READ|PROT_WRITE, | ||||
|                                 MAP_SHARED, fd_data.fd, 0); | ||||
|         if(base == MAP_FAILED) { | ||||
|             err = -errno; | ||||
|             LOGE("%s: Failed to map the allocated memory: %s", | ||||
|                                     __FUNCTION__, strerror(errno)); | ||||
|             err = -errno; | ||||
|             ioctl(mIonFd, ION_IOC_FREE, &handle_data); | ||||
|             close_device(); | ||||
|             ionSyncFd = FD_INIT; | ||||
| @@ -147,7 +147,7 @@ int IonAlloc::alloc_buffer(alloc_data& data) | ||||
|     ioctl(mIonFd, ION_IOC_FREE, &handle_data); | ||||
|     LOGD("ion: Allocated buffer base:%p size:%d fd:%d", | ||||
|                             data.base, ionAllocData.len, data.fd); | ||||
|     return err; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -180,9 +180,9 @@ int IonAlloc::map_buffer(void **pBase, size_t size, int offset, int fd) | ||||
|             MAP_SHARED, fd, 0); | ||||
|     *pBase = base; | ||||
|     if(base == MAP_FAILED) { | ||||
|         err = -errno; | ||||
|         LOGD("ion: Failed to map memory in the client: %s", | ||||
|                                 strerror(errno)); | ||||
|         err = -errno; | ||||
|     } else { | ||||
|         LOGD("ion: Mapped buffer base:%p size:%d offset:%d fd:%d", | ||||
|                                 base, size, offset, fd); | ||||
| @@ -193,8 +193,9 @@ int IonAlloc::map_buffer(void **pBase, size_t size, int offset, int fd) | ||||
| int IonAlloc::unmap_buffer(void *base, size_t size, int offset) | ||||
| { | ||||
|     LOGD("ion: Unmapping buffer  base:%p size:%d", base, size); | ||||
|     int err = munmap(base, size); | ||||
|     if(err) { | ||||
|     int err = 0; | ||||
|     if(munmap(base, size)) { | ||||
|         err = -errno; | ||||
|         LOGE("ion: Failed to unmap memory at %p : %s", | ||||
|                  base, strerror(errno)); | ||||
|     } | ||||
| @@ -214,8 +215,8 @@ int IonAlloc::clean_buffer(void *base, size_t size, int offset, int fd) | ||||
|         return err; | ||||
|  | ||||
|     fd_data.fd = fd; | ||||
|     err = ioctl(mIonFd, ION_IOC_IMPORT, &fd_data); | ||||
|     if(err) { | ||||
|     if (ioctl(mIonFd, ION_IOC_IMPORT, &fd_data)) { | ||||
|         err = -errno; | ||||
|         LOGE("%s: ION_IOC_IMPORT failed with error - %s", | ||||
|                 __FUNCTION__, strerror(errno)); | ||||
|         close_device(); | ||||
| @@ -227,8 +228,8 @@ int IonAlloc::clean_buffer(void *base, size_t size, int offset, int fd) | ||||
|     flush_data.vaddr   = base; | ||||
|     flush_data.offset  = offset; | ||||
|     flush_data.length  = size; | ||||
|     err = ioctl(mIonFd, ION_IOC_CLEAN_INV_CACHES, &flush_data); | ||||
|     if(err) { | ||||
|     if(ioctl(mIonFd, ION_IOC_CLEAN_INV_CACHES, &flush_data)) { | ||||
|         err = -errno; | ||||
|         LOGE("%s: ION_IOC_CLEAN_INV_CACHES failed with error - %s", | ||||
|                 __FUNCTION__, strerror(errno)); | ||||
|         ioctl(mIonFd, ION_IOC_FREE, &handle_data); | ||||
| @@ -236,6 +237,6 @@ int IonAlloc::clean_buffer(void *base, size_t size, int offset, int fd) | ||||
|         return err; | ||||
|     } | ||||
|     ioctl(mIonFd, ION_IOC_FREE, &handle_data); | ||||
|     return err; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -47,8 +47,8 @@ static int getPmemTotalSize(int fd, size_t* size) | ||||
|     //XXX: 7x27 | ||||
|     int err = 0; | ||||
|     pmem_region region; | ||||
|     err = ioctl(fd, PMEM_GET_TOTAL_SIZE, ®ion); | ||||
|     if (err == 0) { | ||||
|     if (ioctl(fd, PMEM_GET_TOTAL_SIZE, ®ion)) { | ||||
|         err = -errno; | ||||
|         *size = region.len; | ||||
|     } | ||||
|     return err; | ||||
| @@ -63,24 +63,32 @@ static int getOpenFlags(bool uncached) | ||||
| } | ||||
|  | ||||
| static int connectPmem(int fd, int master_fd) { | ||||
|     return ioctl(fd, PMEM_CONNECT, master_fd); | ||||
|     if (ioctl(fd, PMEM_CONNECT, master_fd)) | ||||
|         return -errno; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int mapSubRegion(int fd, int offset, size_t size) { | ||||
|     struct pmem_region sub = { offset, size }; | ||||
|     return ioctl(fd, PMEM_MAP, &sub); | ||||
|     if (ioctl(fd, PMEM_MAP, &sub)) | ||||
|         return -errno; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int unmapSubRegion(int fd, int offset, size_t size) { | ||||
|     struct pmem_region sub = { offset, size }; | ||||
|     return ioctl(fd, PMEM_UNMAP, &sub); | ||||
|     if (ioctl(fd, PMEM_UNMAP, &sub)) | ||||
|         return -errno; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int alignPmem(int fd, size_t size, int align) { | ||||
|     struct pmem_allocation allocation; | ||||
|     allocation.size = size; | ||||
|     allocation.align = align; | ||||
|     return ioctl(fd, PMEM_ALLOCATE_ALIGNED, &allocation); | ||||
|     if (ioctl(fd, PMEM_ALLOCATE_ALIGNED, &allocation)) | ||||
|         return -errno; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int cleanPmem(void *base, size_t size, int offset, int fd) { | ||||
| @@ -88,7 +96,9 @@ static int cleanPmem(void *base, size_t size, int offset, int fd) { | ||||
|     pmem_addr.vaddr = (unsigned long) base; | ||||
|     pmem_addr.offset = offset; | ||||
|     pmem_addr.length = size; | ||||
|     return ioctl(fd, PMEM_CLEAN_INV_CACHES, &pmem_addr); | ||||
|     if (ioctl(fd, PMEM_CLEAN_INV_CACHES, &pmem_addr)) | ||||
|         return -errno; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| //-------------- PmemUserspaceAlloc-----------------------// | ||||
| @@ -123,9 +133,9 @@ int PmemUserspaceAlloc::init_pmem_area_locked() | ||||
|         void* base = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, | ||||
|                 0); | ||||
|         if (base == MAP_FAILED) { | ||||
|             err = -errno; | ||||
|             LOGE("%s: Failed to map pmem master fd: %s", mPmemDev, | ||||
|                     strerror(errno)); | ||||
|             err = -errno; | ||||
|             base = 0; | ||||
|             close(fd); | ||||
|             fd = -1; | ||||
| @@ -134,9 +144,9 @@ int PmemUserspaceAlloc::init_pmem_area_locked() | ||||
|             mMasterBase = base; | ||||
|         } | ||||
|     } else { | ||||
|         err = -errno; | ||||
|         LOGE("%s: Failed to open pmem device: %s", mPmemDev, | ||||
|                 strerror(errno)); | ||||
|         err = -errno; | ||||
|     } | ||||
|     return err; | ||||
| } | ||||
| @@ -193,7 +203,6 @@ int PmemUserspaceAlloc::alloc_buffer(alloc_data& data) | ||||
|             if (err < 0) { | ||||
|                 LOGE("%s: Failed to initialize pmem sub-heap: %d", mPmemDev, | ||||
|                         err); | ||||
|                 err = -errno; | ||||
|                 close(fd); | ||||
|                 mAllocator->deallocate(offset); | ||||
|                 fd = -1; | ||||
| @@ -245,9 +254,9 @@ int PmemUserspaceAlloc::map_buffer(void **pBase, size_t size, int offset, int fd | ||||
|             MAP_SHARED, fd, 0); | ||||
|     *pBase = base; | ||||
|     if(base == MAP_FAILED) { | ||||
|         err = -errno; | ||||
|         LOGE("%s: Failed to map buffer size:%d offset:%d fd:%d Error: %s", | ||||
|                 mPmemDev, size, offset, fd, strerror(errno)); | ||||
|         err = -errno; | ||||
|     } else { | ||||
|         LOGD("%s: Mapped buffer base:%p size:%d offset:%d fd:%d", | ||||
|                 mPmemDev, base, size, offset, fd); | ||||
| @@ -265,10 +274,10 @@ int PmemUserspaceAlloc::unmap_buffer(void *base, size_t size, int offset) | ||||
|     LOGD("%s: Unmapping buffer base:%p size:%d offset:%d", | ||||
|             mPmemDev , base, size, offset); | ||||
|     if (munmap(base, size) < 0) { | ||||
|         err = -errno; | ||||
|         LOGE("%s: Failed to unmap memory at %p :%s", | ||||
|                    mPmemDev, base, strerror(errno)); | ||||
|  | ||||
|         err = -errno; | ||||
|     } | ||||
|  | ||||
|    return err; | ||||
| @@ -314,9 +323,9 @@ int PmemKernelAlloc::alloc_buffer(alloc_data& data) | ||||
|     } | ||||
|     void* base = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); | ||||
|     if (base == MAP_FAILED) { | ||||
|         err = -errno; | ||||
|         LOGE("%s: failed to map pmem fd: %s", mPmemDev, | ||||
|                 strerror(errno)); | ||||
|         err = -errno; | ||||
|         close(fd); | ||||
|         return err; | ||||
|     } | ||||
| @@ -348,9 +357,9 @@ int PmemKernelAlloc::map_buffer(void **pBase, size_t size, int offset, int fd) | ||||
|             MAP_SHARED, fd, 0); | ||||
|     *pBase = base; | ||||
|     if(base == MAP_FAILED) { | ||||
|         err = -errno; | ||||
|         LOGE("%s: Failed to map memory in the client: %s", | ||||
|                 mPmemDev, strerror(errno)); | ||||
|         err = -errno; | ||||
|     } else { | ||||
|         LOGD("%s: Mapped buffer base:%p size:%d, fd:%d", | ||||
|                                 mPmemDev, base, size, fd); | ||||
| @@ -362,8 +371,7 @@ int PmemKernelAlloc::map_buffer(void **pBase, size_t size, int offset, int fd) | ||||
| int PmemKernelAlloc::unmap_buffer(void *base, size_t size, int offset) | ||||
| { | ||||
|     int err = 0; | ||||
|     munmap(base, size); | ||||
|     if (err < 0) { | ||||
|     if (munmap(base, size)) { | ||||
|         err = -errno; | ||||
|         LOGW("%s: Error unmapping memory at %p: %s", | ||||
|                                 mPmemDev, base, strerror(err)); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user