pages = _mali_memory_cow_get_node_list(target_bk, target_offset, target_size);\r
\r
if (NULL == pages) {\r
- MALI_DEBUG_ASSERT(0);\r
+ MALI_DEBUG_PRINT_ERROR(("No memory page need to cow ! \n"));\r
return _MALI_OSK_ERR_FAULT;\r
}\r
\r
\r
pages = _mali_memory_cow_get_node_list(target_bk, target_offset, target_size);\r
if (NULL == pages) {\r
- MALI_DEBUG_ASSERT(0);\r
+ MALI_DEBUG_PRINT_ERROR(("No swap memory page need to cow ! \n"));\r
return _MALI_OSK_ERR_FAULT;\r
}\r
\r
u32 range_size)\r
{\r
mali_mem_allocation *alloc = NULL;\r
+ struct mali_session_data *session;\r
mali_mem_cow *cow = &backend->cow_mem;\r
struct mali_page_node *m_page, *m_tmp;\r
LIST_HEAD(pages);\r
alloc = backend->mali_allocation;\r
MALI_DEBUG_ASSERT_POINTER(alloc);\r
\r
+ session = alloc->session;\r
+ MALI_DEBUG_ASSERT_POINTER(session);\r
+\r
MALI_DEBUG_ASSERT(MALI_MEM_COW == backend->type);\r
MALI_DEBUG_ASSERT(((range_start + range_size) / _MALI_OSK_MALI_PAGE_SIZE) <= cow->count);\r
\r
if (1 != _mali_page_node_get_ref_count(m_page))\r
change_pages_nr++;\r
/* unref old page*/\r
+ _mali_osk_mutex_wait(session->cow_lock);\r
if (_mali_mem_put_page_node(m_page)) {\r
__free_page(new_page);\r
+ _mali_osk_mutex_signal(session->cow_lock);\r
goto error;\r
}\r
+ _mali_osk_mutex_signal(session->cow_lock);\r
/* add new page*/\r
/* always use OS for COW*/\r
m_page->type = MALI_PAGE_NODE_OS;\r
break;\r
case MALI_MEM_EXTERNAL:\r
/*NOT support yet*/\r
- MALI_DEBUG_ASSERT(0);\r
+ MALI_DEBUG_PRINT_ERROR(("External physical memory not supported ! \n"));\r
+ return _MALI_OSK_ERR_UNSUPPORTED;\r
break;\r
case MALI_MEM_DMA_BUF:\r
/*NOT support yet*/\r
- MALI_DEBUG_ASSERT(0);\r
+ MALI_DEBUG_PRINT_ERROR(("DMA buffer not supported ! \n"));\r
+ return _MALI_OSK_ERR_UNSUPPORTED;\r
break;\r
case MALI_MEM_UMP:\r
/*NOT support yet*/\r
- MALI_DEBUG_ASSERT(0);\r
+ MALI_DEBUG_PRINT_ERROR(("UMP buffer not supported ! \n"));\r
+ return _MALI_OSK_ERR_UNSUPPORTED;\r
break;\r
default:\r
/*Not support yet*/\r
- MALI_DEBUG_ASSERT(0);\r
+ MALI_DEBUG_PRINT_ERROR(("Invalid memory type not supported ! \n"));\r
+ return _MALI_OSK_ERR_UNSUPPORTED;\r
break;\r
}\r
return _MALI_OSK_ERR_OK;\r
u32 mali_mem_cow_release(mali_mem_backend *mem_bkend, mali_bool is_mali_mapped)\r
{\r
mali_mem_allocation *alloc;\r
+ struct mali_session_data *session;\r
u32 free_pages_nr = 0;\r
MALI_DEBUG_ASSERT_POINTER(mem_bkend);\r
MALI_DEBUG_ASSERT(MALI_MEM_COW == mem_bkend->type);\r
alloc = mem_bkend->mali_allocation;\r
MALI_DEBUG_ASSERT_POINTER(alloc);\r
\r
+ session = alloc->session;\r
+ MALI_DEBUG_ASSERT_POINTER(session);\r
+\r
if (MALI_MEM_BACKEND_FLAG_SWAP_COWED != (MALI_MEM_BACKEND_FLAG_SWAP_COWED & mem_bkend->flags)) {\r
/* Unmap the memory from the mali virtual address space. */\r
if (MALI_TRUE == is_mali_mapped)\r
mali_mem_os_mali_unmap(alloc);\r
/* free cow backend list*/\r
+ _mali_osk_mutex_wait(session->cow_lock);\r
free_pages_nr = mali_mem_os_free(&mem_bkend->cow_mem.pages, mem_bkend->cow_mem.count, MALI_TRUE);\r
+ _mali_osk_mutex_signal(session->cow_lock);\r
+\r
free_pages_nr += mali_mem_block_free_list(&mem_bkend->cow_mem.pages);\r
\r
MALI_DEBUG_ASSERT(list_empty(&mem_bkend->cow_mem.pages));\r
}\r
mem_bkend->cow_mem.change_pages_nr++;\r
}\r
+\r
+ _mali_osk_mutex_wait(session->cow_lock);\r
if (_mali_mem_put_page_node(found_node)) {\r
__free_page(new_page);\r
kfree(new_node);\r
+ _mali_osk_mutex_signal(session->cow_lock);\r
return _MALI_OSK_ERR_NOMEM;\r
}\r
+ _mali_osk_mutex_signal(session->cow_lock);\r
\r
list_replace(&found_node->list, &new_node->list);\r
\r