If destination GEM buffer is not page-aligned (4KB), SIGBUS could occur.
Change-Id: I750498862f6b2a533c48e3daa9d86f2d9ad7b2c7
/* copy from src to dst */
#if HAVE_LIBGOMP
# define LIBGOMP_COPY_THREAD_NUM 4
- if (src_info.planes[0].size > LIBGOMP_COPY_THREAD_NUM)
+# define LIBGOMP_COPY_PAGE_SIZE getpagesize()
+# define PAGE_ALIGN(addr) ((addr)&(~((LIBGOMP_COPY_PAGE_SIZE)-1)))
+ if (src_info.planes[0].size > (LIBGOMP_COPY_THREAD_NUM * LIBGOMP_COPY_PAGE_SIZE))
{
size_t step[2];
- step[0] = src_info.planes[0].size / LIBGOMP_COPY_THREAD_NUM;
+ step[0] = PAGE_ALIGN(src_info.planes[0].size / LIBGOMP_COPY_THREAD_NUM);
step[1] = src_info.planes[0].size - (step[0] * (LIBGOMP_COPY_THREAD_NUM - 1));
omp_set_num_threads(LIBGOMP_COPY_THREAD_NUM);