mirror of https://gitee.com/openkylin/linux.git
staging: android: lowmemorykiller: Don't try to kill the same pid over and over
Under certain circumstances, a process can take awhile to handle a sig-kill (especially if it's in a scheduler group with a very low share ratio). When this occurs, lowmemkiller returns to vmscan indicating the process memory has been freed - even though the process is still waiting to die. Since the memory hasn't actually freed, lowmemkiller is called again shortly after, and picks the same process to die; regardless of the fact that it has already been 'scheduled' to die and the memory has already been reported to vmscan as having been freed. Solution is to check fatal_signal_pending() on the selected task, and if it's already pending destruction return; indicating to vmscan that no resources were freed on this pass. Signed-off-by: San Mehat <san@google.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
3c762a49b1
commit
4964cd41cd
|
@ -133,6 +133,12 @@ static int lowmem_shrink(int nr_to_scan, gfp_t gfp_mask)
|
|||
p->pid, p->comm, oom_adj, tasksize);
|
||||
}
|
||||
if (selected) {
|
||||
if (fatal_signal_pending(selected)) {
|
||||
pr_warning("process %d is suffering a slow death\n",
|
||||
selected->pid);
|
||||
read_unlock(&tasklist_lock);
|
||||
return rem;
|
||||
}
|
||||
lowmem_print(1, "send sigkill to %d (%s), adj %d, size %d\n",
|
||||
selected->pid, selected->comm,
|
||||
selected_oom_adj, selected_tasksize);
|
||||
|
|
Loading…
Reference in New Issue