Loading mm/oom_kill.c +37 −0 Original line number Original line Diff line number Diff line Loading @@ -1171,8 +1171,35 @@ void pagefault_out_of_memory(void) mutex_unlock(&oom_lock); mutex_unlock(&oom_lock); } } /* Call this function with task_lock being held as we're accessing ->mm */ void dump_killed_info(struct task_struct *selected) { int selected_tasksize = get_mm_rss(selected->mm); pr_info_ratelimited("Killing '%s' (%d), adj %hd,\n" " to free %ldkB on behalf of '%s' (%d)\n" " Free CMA is %ldkB\n" " Total reserve is %ldkB\n" " Total free pages is %ldkB\n" " Total file cache is %ldkB\n", selected->comm, selected->pid, selected->signal->oom_score_adj, selected_tasksize * (long)(PAGE_SIZE / 1024), current->comm, current->pid, global_zone_page_state(NR_FREE_CMA_PAGES) * (long)(PAGE_SIZE / 1024), totalreserve_pages * (long)(PAGE_SIZE / 1024), global_zone_page_state(NR_FREE_PAGES) * (long)(PAGE_SIZE / 1024), global_node_page_state(NR_FILE_PAGES) * (long)(PAGE_SIZE / 1024)); } void add_to_oom_reaper(struct task_struct *p) void add_to_oom_reaper(struct task_struct *p) { { static DEFINE_RATELIMIT_STATE(reaper_rs, DEFAULT_RATELIMIT_INTERVAL, DEFAULT_RATELIMIT_BURST); if (!sysctl_reap_mem_on_sigkill) if (!sysctl_reap_mem_on_sigkill) return; return; Loading @@ -1185,6 +1212,16 @@ void add_to_oom_reaper(struct task_struct *p) __mark_oom_victim(p); __mark_oom_victim(p); wake_oom_reaper(p); wake_oom_reaper(p); } } dump_killed_info(p); task_unlock(p); task_unlock(p); if (__ratelimit(&reaper_rs) && p->signal->oom_score_adj == 0) { show_mem(SHOW_MEM_FILTER_NODES, NULL); show_mem_call_notifiers(); if (sysctl_oom_dump_tasks) dump_tasks(NULL, NULL); } put_task_struct(p); put_task_struct(p); } } mm/page_alloc.c +5 −5 Original line number Original line Diff line number Diff line Loading @@ -2451,14 +2451,14 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype) static __always_inline struct page * static __always_inline struct page * __rmqueue(struct zone *zone, unsigned int order, int migratetype) __rmqueue(struct zone *zone, unsigned int order, int migratetype) { { struct page *page = NULL; struct page *page; retry: retry: page = __rmqueue_smallest(zone, order, migratetype); if (unlikely(!page)) { if (migratetype == MIGRATE_MOVABLE) if (migratetype == MIGRATE_MOVABLE) page = __rmqueue_cma_fallback(zone, order); page = __rmqueue_cma_fallback(zone, order); if (!page) { page = __rmqueue_smallest(zone, order, migratetype); if (!page && __rmqueue_fallback(zone, order, migratetype)) if (!page && __rmqueue_fallback(zone, order, migratetype)) goto retry; goto retry; } } Loading Loading
mm/oom_kill.c +37 −0 Original line number Original line Diff line number Diff line Loading @@ -1171,8 +1171,35 @@ void pagefault_out_of_memory(void) mutex_unlock(&oom_lock); mutex_unlock(&oom_lock); } } /* Call this function with task_lock being held as we're accessing ->mm */ void dump_killed_info(struct task_struct *selected) { int selected_tasksize = get_mm_rss(selected->mm); pr_info_ratelimited("Killing '%s' (%d), adj %hd,\n" " to free %ldkB on behalf of '%s' (%d)\n" " Free CMA is %ldkB\n" " Total reserve is %ldkB\n" " Total free pages is %ldkB\n" " Total file cache is %ldkB\n", selected->comm, selected->pid, selected->signal->oom_score_adj, selected_tasksize * (long)(PAGE_SIZE / 1024), current->comm, current->pid, global_zone_page_state(NR_FREE_CMA_PAGES) * (long)(PAGE_SIZE / 1024), totalreserve_pages * (long)(PAGE_SIZE / 1024), global_zone_page_state(NR_FREE_PAGES) * (long)(PAGE_SIZE / 1024), global_node_page_state(NR_FILE_PAGES) * (long)(PAGE_SIZE / 1024)); } void add_to_oom_reaper(struct task_struct *p) void add_to_oom_reaper(struct task_struct *p) { { static DEFINE_RATELIMIT_STATE(reaper_rs, DEFAULT_RATELIMIT_INTERVAL, DEFAULT_RATELIMIT_BURST); if (!sysctl_reap_mem_on_sigkill) if (!sysctl_reap_mem_on_sigkill) return; return; Loading @@ -1185,6 +1212,16 @@ void add_to_oom_reaper(struct task_struct *p) __mark_oom_victim(p); __mark_oom_victim(p); wake_oom_reaper(p); wake_oom_reaper(p); } } dump_killed_info(p); task_unlock(p); task_unlock(p); if (__ratelimit(&reaper_rs) && p->signal->oom_score_adj == 0) { show_mem(SHOW_MEM_FILTER_NODES, NULL); show_mem_call_notifiers(); if (sysctl_oom_dump_tasks) dump_tasks(NULL, NULL); } put_task_struct(p); put_task_struct(p); } }
mm/page_alloc.c +5 −5 Original line number Original line Diff line number Diff line Loading @@ -2451,14 +2451,14 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype) static __always_inline struct page * static __always_inline struct page * __rmqueue(struct zone *zone, unsigned int order, int migratetype) __rmqueue(struct zone *zone, unsigned int order, int migratetype) { { struct page *page = NULL; struct page *page; retry: retry: page = __rmqueue_smallest(zone, order, migratetype); if (unlikely(!page)) { if (migratetype == MIGRATE_MOVABLE) if (migratetype == MIGRATE_MOVABLE) page = __rmqueue_cma_fallback(zone, order); page = __rmqueue_cma_fallback(zone, order); if (!page) { page = __rmqueue_smallest(zone, order, migratetype); if (!page && __rmqueue_fallback(zone, order, migratetype)) if (!page && __rmqueue_fallback(zone, order, migratetype)) goto retry; goto retry; } } Loading