diff options
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index d29b2bdb9e03..10f9c59aed55 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -865,6 +865,15 @@ static unsigned long shrink_page_list(struct list_head *page_list, | |||
865 | if (PageDirty(page)) { | 865 | if (PageDirty(page)) { |
866 | nr_dirty++; | 866 | nr_dirty++; |
867 | 867 | ||
868 | /* | ||
869 | * Only kswapd can writeback filesystem pages to | ||
870 | * avoid risk of stack overflow | ||
871 | */ | ||
872 | if (page_is_file_cache(page) && !current_is_kswapd()) { | ||
873 | inc_zone_page_state(page, NR_VMSCAN_WRITE_SKIP); | ||
874 | goto keep_locked; | ||
875 | } | ||
876 | |||
868 | if (references == PAGEREF_RECLAIM_CLEAN) | 877 | if (references == PAGEREF_RECLAIM_CLEAN) |
869 | goto keep_locked; | 878 | goto keep_locked; |
870 | if (!may_enter_fs) | 879 | if (!may_enter_fs) |