oom_kill.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:7k
源码类别:

嵌入式Linux

开发平台:

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