瀏覽代碼

Release the mc spinlock while freeing data, otherwise cudaFree might cause the whole StarPU to get stuck

Samuel Thibault 8 年之前
父節點
當前提交
2905b3eb1c
共有 1 個文件被更改,包括 7 次插入2 次删除
  1. 7 2
      src/datawizard/memalloc.c

+ 7 - 2
src/datawizard/memalloc.c

@@ -819,10 +819,11 @@ static size_t flush_memchunk_cache(unsigned node, size_t reclaim)
 
 	size_t freed = 0;
 
+restart:
 	_starpu_spin_lock(&mc_lock[node]);
 	HASH_ITER(hh, mc_cache[node], entry, tmp)
 	{
-		while (!_starpu_mem_chunk_list_empty(&entry->list))
+		if (!_starpu_mem_chunk_list_empty(&entry->list))
 		{
 			mc = _starpu_mem_chunk_list_pop_front(&entry->list);
 			STARPU_ASSERT(!mc->data);
@@ -832,19 +833,23 @@ static size_t flush_memchunk_cache(unsigned node, size_t reclaim)
 			STARPU_ASSERT(mc_cache_nb[node] >= 0);
 			mc_cache_size[node] -= mc->size;
 			STARPU_ASSERT(mc_cache_size[node] >= 0);
+			_starpu_spin_unlock(&mc_lock[node]);
+
 			freed += free_memory_on_node(mc, node);
 
 			free(mc->chunk_interface);
 			_starpu_mem_chunk_delete(mc);
 
 			if (reclaim && freed >= reclaim)
-				break;
+				goto out;
+			goto restart;
 		}
 
 		if (reclaim && freed >= reclaim)
 			break;
 	}
 	_starpu_spin_unlock(&mc_lock[node]);
+out:
 	return freed;
 }