int i;
s_time_t start = NOW();
+ /* free_heap_pages() does not parallelise well. Serialise this function. */
+ if ( !spin_trylock(&page_scrub_lock) )
+ {
+ set_timer(&this_cpu(page_scrub_timer), NOW() + MILLISECS(1));
+ return;
+ }
+
/* Aim to do 1ms of work every 10ms. */
do {
- spin_lock(&page_scrub_lock);
-
if ( unlikely((ent = page_scrub_list.next) == &page_scrub_list) )
{
spin_unlock(&page_scrub_lock);
page_scrub_list.next = ent->next;
scrub_pages -= (i+1);
- spin_unlock(&page_scrub_lock);
-
/* Working backwards, scrub each page in turn. */
while ( ent != &page_scrub_list )
{
}
} while ( (NOW() - start) < MILLISECS(1) );
+ spin_unlock(&page_scrub_lock);
+
set_timer(&this_cpu(page_scrub_timer), NOW() + MILLISECS(10));
}