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