oom_kill.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:6k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/mm/oom_kill.c
  3.  * 
  4.  *  Copyright (C)  1998,2000  Rik van Riel
  5.  * Thanks go out to Claus Fischer for some serious inspiration and
  6.  * for goading me into coding this file...
  7.  *
  8.  *  The routines in this file are used to kill a process when
  9.  *  we're seriously out of memory. This gets called from kswapd()
  10.  *  in linux/mm/vmscan.c when we really run out of memory.
  11.  *
  12.  *  Since we won't call these routines often (on a well-configured
  13.  *  machine) this file will double as a 'coding guide' and a signpost
  14.  *  for newbie kernel hackers. It features several pointers to major
  15.  *  kernel subsystems and hints as to where to find out what things do.
  16.  */
  17. #include <linux/mm.h>
  18. #include <linux/sched.h>
  19. #include <linux/swap.h>
  20. #include <linux/swapctl.h>
  21. #include <linux/timex.h>
  22. /* #define DEBUG */
  23. /**
  24.  * int_sqrt - oom_kill.c internal function, rough approximation to sqrt
  25.  * @x: integer of which to calculate the sqrt
  26.  * 
  27.  * A very rough approximation to the sqrt() function.
  28.  */
  29. static unsigned int int_sqrt(unsigned int x)
  30. {
  31. unsigned int out = x;
  32. while (x & ~(unsigned int)1) x >>=2, out >>=1;
  33. if (x) out -= out >> 2;
  34. return (out ? out : 1);
  35. }
  36. /**
  37.  * oom_badness - calculate a numeric value for how bad this task has been
  38.  * @p: task struct of which task we should calculate
  39.  *
  40.  * The formula used is relatively simple and documented inline in the
  41.  * function. The main rationale is that we want to select a good task
  42.  * to kill when we run out of memory.
  43.  *
  44.  * Good in this context means that:
  45.  * 1) we lose the minimum amount of work done
  46.  * 2) we recover a large amount of memory
  47.  * 3) we don't kill anything innocent of eating tons of memory
  48.  * 4) we want to kill the minimum amount of processes (one)
  49.  * 5) we try to kill the process the user expects us to kill, this
  50.  *    algorithm has been meticulously tuned to meet the priniciple
  51.  *    of least surprise ... (be careful when you change it)
  52.  */
  53. static int badness(struct task_struct *p)
  54. {
  55. int points, cpu_time, run_time;
  56. if (!p->mm)
  57. return 0;
  58. /*
  59.  * The memory size of the process is the basis for the badness.
  60.  */
  61. points = p->mm->total_vm;
  62. /*
  63.  * CPU time is in seconds and run time is in minutes. There is no
  64.  * particular reason for this other than that it turned out to work
  65.  * very well in practice. This is not safe against jiffie wraps
  66.  * but we don't care _that_ much...
  67.  */
  68. cpu_time = (p->times.tms_utime + p->times.tms_stime) >> (SHIFT_HZ + 3);
  69. run_time = (jiffies - p->start_time) >> (SHIFT_HZ + 10);
  70. points /= int_sqrt(cpu_time);
  71. points /= int_sqrt(int_sqrt(run_time));
  72. /*
  73.  * Niced processes are most likely less important, so double
  74.  * their badness points.
  75.  */
  76. if (p->nice > 0)
  77. points *= 2;
  78. /*
  79.  * Superuser processes are usually more important, so we make it
  80.  * less likely that we kill those.
  81.  */
  82. if (cap_t(p->cap_effective) & CAP_TO_MASK(CAP_SYS_ADMIN) ||
  83. p->uid == 0 || p->euid == 0)
  84. points /= 4;
  85. /*
  86.  * We don't want to kill a process with direct hardware access.
  87.  * Not only could that mess up the hardware, but usually users
  88.  * tend to only have this flag set on applications they think
  89.  * of as important.
  90.  */
  91. if (cap_t(p->cap_effective) & CAP_TO_MASK(CAP_SYS_RAWIO))
  92. points /= 4;
  93. #ifdef DEBUG
  94. printk(KERN_DEBUG "OOMkill: task %d (%s) got %d pointsn",
  95. p->pid, p->comm, points);
  96. #endif
  97. return points;
  98. }
  99. /*
  100.  * Simple selection loop. We chose the process with the highest
  101.  * number of 'points'. We expect the caller will lock the tasklist.
  102.  *
  103.  * (not docbooked, we don't want this one cluttering up the manual)
  104.  */
  105. static struct task_struct * select_bad_process(void)
  106. {
  107. int maxpoints = 0;
  108. struct task_struct *p = NULL;
  109. struct task_struct *chosen = NULL;
  110. for_each_task(p) {
  111. if (p->pid) {
  112. int points = badness(p);
  113. if (points > maxpoints) {
  114. chosen = p;
  115. maxpoints = points;
  116. }
  117. }
  118. }
  119. return chosen;
  120. }
  121. /**
  122.  * We must be careful though to never send SIGKILL a process with
  123.  * CAP_SYS_RAW_IO set, send SIGTERM instead (but it's unlikely that
  124.  * we select a process with CAP_SYS_RAW_IO set).
  125.  */
  126. void oom_kill_task(struct task_struct *p)
  127. {
  128. printk(KERN_ERR "Out of Memory: Killed process %d (%s).n", p->pid, p->comm);
  129. /*
  130.  * We give our sacrificial lamb high priority and access to
  131.  * all the memory it needs. That way it should be able to
  132.  * exit() and clear out its resources quickly...
  133.  */
  134. p->counter = 5 * HZ;
  135. p->flags |= PF_MEMALLOC | PF_MEMDIE;
  136. /* This process has hardware access, be more careful. */
  137. if (cap_t(p->cap_effective) & CAP_TO_MASK(CAP_SYS_RAWIO)) {
  138. force_sig(SIGTERM, p);
  139. } else {
  140. force_sig(SIGKILL, p);
  141. }
  142. }
  143. /**
  144.  * oom_kill - kill the "best" process when we run out of memory
  145.  *
  146.  * If we run out of memory, we have the choice between either
  147.  * killing a random task (bad), letting the system crash (worse)
  148.  * OR try to be smart about which process to kill. Note that we
  149.  * don't have to be perfect here, we just have to be good.
  150.  */
  151. static void oom_kill(void)
  152. {
  153. struct task_struct *p, *q;
  154. read_lock(&tasklist_lock);
  155. p = select_bad_process();
  156. /* Found nothing?!?! Either we hang forever, or we panic. */
  157. if (p == NULL)
  158. panic("Out of memory and no killable processes...n");
  159. /* kill all processes that share the ->mm (i.e. all threads) */
  160. for_each_task(q) {
  161. if (q->mm == p->mm)
  162. oom_kill_task(q);
  163. }
  164. read_unlock(&tasklist_lock);
  165. /*
  166.  * Make kswapd go out of the way, so "p" has a good chance of
  167.  * killing itself before someone else gets the chance to ask
  168.  * for more memory.
  169.  */
  170. yield();
  171. return;
  172. }
  173. /**
  174.  * out_of_memory - is the system out of memory?
  175.  */
  176. void out_of_memory(void)
  177. {
  178. static unsigned long first, last, count, lastkill;
  179. unsigned long now, since;
  180. /*
  181.  * Enough swap space left?  Not OOM.
  182.  */
  183. if (nr_swap_pages > 0)
  184. return;
  185. now = jiffies;
  186. since = now - last;
  187. last = now;
  188. /*
  189.  * If it's been a long time since last failure,
  190.  * we're not oom.
  191.  */
  192. last = now;
  193. if (since > 5*HZ)
  194. goto reset;
  195. /*
  196.  * If we haven't tried for at least one second,
  197.  * we're not really oom.
  198.  */
  199. since = now - first;
  200. if (since < HZ)
  201. return;
  202. /*
  203.  * If we have gotten only a few failures,
  204.  * we're not really oom. 
  205.  */
  206. if (++count < 10)
  207. return;
  208. /*
  209.  * If we just killed a process, wait a while
  210.  * to give that task a chance to exit. This
  211.  * avoids killing multiple processes needlessly.
  212.  */
  213. since = now - lastkill;
  214. if (since < HZ*5)
  215. return;
  216. /*
  217.  * Ok, really out of memory. Kill something.
  218.  */
  219. lastkill = now;
  220. oom_kill();
  221. reset:
  222. first = now;
  223. count = 0;
  224. }