|
@@ -1147,14 +1147,26 @@ int __vm_enough_memory(long pages, int cap_sys_admin)
|
|
|
* only call if we're about to fail.
|
|
|
*/
|
|
|
n = nr_free_pages();
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Leave reserved pages. The pages are not for anonymous pages.
|
|
|
+ */
|
|
|
+ if (n <= totalreserve_pages)
|
|
|
+ goto error;
|
|
|
+ else
|
|
|
+ n -= totalreserve_pages;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Leave the last 3% for root
|
|
|
+ */
|
|
|
if (!cap_sys_admin)
|
|
|
n -= n / 32;
|
|
|
free += n;
|
|
|
|
|
|
if (free > pages)
|
|
|
return 0;
|
|
|
- vm_unacct_memory(pages);
|
|
|
- return -ENOMEM;
|
|
|
+
|
|
|
+ goto error;
|
|
|
}
|
|
|
|
|
|
allowed = totalram_pages * sysctl_overcommit_ratio / 100;
|
|
@@ -1175,7 +1187,7 @@ int __vm_enough_memory(long pages, int cap_sys_admin)
|
|
|
*/
|
|
|
if (atomic_read(&vm_committed_space) < (long)allowed)
|
|
|
return 0;
|
|
|
-
|
|
|
+error:
|
|
|
vm_unacct_memory(pages);
|
|
|
|
|
|
return -ENOMEM;
|