mm/page-writeback.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 439cc63ad903..26ecbdecb815 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -352,6 +352,10 @@ static unsigned long highmem_dirtyable_memory(unsigned long total) #endif } +/* Limit dirtyable memory to 1GB */ +#define PAGES_IN_GB(x) ((x) << (30 - PAGE_SHIFT)) +#define MAX_DIRTYABLE_LOWMEM_PAGES PAGES_IN_GB(1) + /** * global_dirtyable_memory - number of globally dirtyable pages * @@ -373,8 +377,11 @@ static unsigned long global_dirtyable_memory(void) x += global_node_page_state(NR_INACTIVE_FILE); x += global_node_page_state(NR_ACTIVE_FILE); - if (!vm_highmem_is_dirtyable) + if (!vm_highmem_is_dirtyable) { x -= highmem_dirtyable_memory(x); + if (x > MAX_DIRTYABLE_LOWMEM_PAGES) + x = MAX_DIRTYABLE_LOWMEM_PAGES; + } return x + 1; /* Ensure that we never return 0 */ }