Browse Source

fix bug to choose disk in reclaim

Corentin Salingue 12 years ago
parent
commit
6bb0969207
2 changed files with 17 additions and 6 deletions
  1. 16 5
      src/datawizard/memalloc.c
  2. 1 1
      src/drivers/disk/driver_disk.c

+ 16 - 5
src/datawizard/memalloc.c

@@ -283,7 +283,10 @@ static size_t do_free_mem_chunk(struct _starpu_mem_chunk *mc, unsigned node)
 	starpu_data_handle_t handle = mc->data;
 
 	if (handle)
+	{
 		_starpu_spin_checklocked(&handle->header_lock);
+		mc->size = _starpu_data_get_size(handle);
+	}
 
 	mc->replicate->mc=NULL;
 
@@ -347,7 +350,7 @@ static size_t try_to_free_mem_chunk(struct _starpu_mem_chunk *mc, unsigned node)
 	{
 		/* try to lock all the subtree */
 		lock_all_subtree(handle);
-
+	      
 		/* check if they are all "free" */
 		if (may_free_subtree(handle, node))
 		{
@@ -359,6 +362,7 @@ static size_t try_to_free_mem_chunk(struct _starpu_mem_chunk *mc, unsigned node)
 
 			/* in case there was nobody using that buffer, throw it
 			 * away after writing it back to main memory */
+
 			if (handle->home_node != -1)
 				target = handle->home_node;
 			else
@@ -367,17 +371,23 @@ static size_t try_to_free_mem_chunk(struct _starpu_mem_chunk *mc, unsigned node)
 					target = 0;
 
 			size_t size_handle = _starpu_data_get_size(handle);
+			/* no place for datas, we push on disk */
+			if (node == 0 && target == -1)
+			{
+				target = get_better_disk_can_accept_size(size_handle);
+			}
 			/* try to push data to RAM if we can before to push on disk*/
-			if (starpu_node_get_kind(target) == STARPU_DISK_RAM && _starpu_memory_manager_test_allocate_size_(size_handle, STARPU_MAIN_RAM) == 1)
+			else if (starpu_node_get_kind(target) == STARPU_DISK_RAM  &&
+				 _starpu_memory_manager_test_allocate_size_(size_handle, STARPU_MAIN_RAM) == 1)
 			{
 				target = STARPU_MAIN_RAM;
 			}
 			/* no place in RAM */
-			else if ((starpu_node_get_kind(target) == STARPU_DISK_RAM || target == -1) && _starpu_memory_manager_test_allocate_size_(size_handle, STARPU_MAIN_RAM) != 1)
+			else if ((starpu_node_get_kind(target) == STARPU_DISK_RAM || target == STARPU_MAIN_RAM) &&
+				 _starpu_memory_manager_test_allocate_size_(size_handle, STARPU_MAIN_RAM) != 1)
 			{
 				target = get_better_disk_can_accept_size(size_handle);
-			}   
-
+			}
 
 			if (target != -1) {
 #ifdef STARPU_MEMORY_STATS
@@ -611,6 +621,7 @@ static size_t free_potentially_in_use_mc(unsigned node, unsigned force, size_t r
 		STARPU_PTHREAD_RWLOCK_WRLOCK(&mc_rwlock[node]);
 		/* A priori, start from the beginning */
 		mc = _starpu_mem_chunk_list_begin(mc_list[node]);
+
 		if (next_mc)
 			/* Unless we might restart from where we were */
 			for (mc = _starpu_mem_chunk_list_begin(mc_list[node]);

+ 1 - 1
src/drivers/disk/driver_disk.c

@@ -21,7 +21,7 @@
 int _starpu_disk_copy_src_to_disk(void * src, unsigned src_node, void * dst, size_t dst_offset, unsigned dst_node, size_t size)
 {
 	STARPU_ASSERT(starpu_node_get_kind(src_node) == STARPU_CPU_RAM);
-
+	
 	_starpu_disk_write(dst_node, dst, src, dst_offset, size);
 	return 0;
 }