FROMLIST: mm: fs: Invalidate BH LRU during page migration
Pages containing buffer_heads that are in one of the per-CPU buffer_head LRU caches will be pinned and thus cannot be migrated. This can prevent CMA allocations from succeeding, which are often used on platforms with co-processors (such as a DSP) that can only use physically contiguous memory. It can also prevent memory hot-unplugging from succeeding, which involves migrating at least MIN_MEMORY_BLOCK_SIZE bytes of memory, which ranges from 8 MiB to 1 GiB based on the architecture in use. Correspondingly, invalidate the BH LRU caches before a migration starts and stop any buffer_head from being cached in the LRU caches, until migration has finished. Bug: 180018981 Link: https://lore.kernel.org/linux-mm/20210310161429.399432-3-minchan@kernel.org/ Signed-off-by: Chris Goldsworthy <cgoldswo@codeaurora.org> Signed-off-by: Minchan Kim <minchan@kernel.org> Signed-off-by: Minchan Kim <minchan@google.com> Change-Id: I7ac085c2ec14a81c3c4d7b65a7eeedb0cfba4ea6
This commit is contained in:
@@ -36,6 +36,7 @@
|
||||
#include <linux/hugetlb.h>
|
||||
#include <linux/page_idle.h>
|
||||
#include <linux/local_lock.h>
|
||||
#include <linux/buffer_head.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
@@ -665,6 +666,7 @@ void lru_add_drain_cpu(int cpu)
|
||||
pagevec_lru_move_fn(pvec, lru_lazyfree_fn, NULL);
|
||||
|
||||
activate_page_drain(cpu);
|
||||
invalidate_bh_lru(NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -852,7 +854,8 @@ static void __lru_add_drain_all(bool force_all_cpus)
|
||||
pagevec_count(&per_cpu(lru_pvecs.lru_deactivate_file, cpu)) ||
|
||||
pagevec_count(&per_cpu(lru_pvecs.lru_deactivate, cpu)) ||
|
||||
pagevec_count(&per_cpu(lru_pvecs.lru_lazyfree, cpu)) ||
|
||||
need_activate_page_drain(cpu)) {
|
||||
need_activate_page_drain(cpu) ||
|
||||
has_bh_in_lru(cpu, NULL)) {
|
||||
INIT_WORK(work, lru_add_drain_per_cpu);
|
||||
queue_work_on(cpu, mm_percpu_wq, work);
|
||||
__cpumask_set_cpu(cpu, &has_work);
|
||||
|
Reference in New Issue
Block a user