|
@@ -404,13 +404,45 @@ struct address_space *page_mapping(struct page *page)
|
|
|
return mapping;
|
|
|
}
|
|
|
|
|
|
+int overcommit_ratio_handler(struct ctl_table *table, int write,
|
|
|
+ void __user *buffer, size_t *lenp,
|
|
|
+ loff_t *ppos)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = proc_dointvec(table, write, buffer, lenp, ppos);
|
|
|
+ if (ret == 0 && write)
|
|
|
+ sysctl_overcommit_kbytes = 0;
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+int overcommit_kbytes_handler(struct ctl_table *table, int write,
|
|
|
+ void __user *buffer, size_t *lenp,
|
|
|
+ loff_t *ppos)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = proc_doulongvec_minmax(table, write, buffer, lenp, ppos);
|
|
|
+ if (ret == 0 && write)
|
|
|
+ sysctl_overcommit_ratio = 0;
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Committed memory limit enforced when OVERCOMMIT_NEVER policy is used
|
|
|
*/
|
|
|
unsigned long vm_commit_limit(void)
|
|
|
{
|
|
|
- return ((totalram_pages - hugetlb_total_pages())
|
|
|
- * sysctl_overcommit_ratio / 100) + total_swap_pages;
|
|
|
+ unsigned long allowed;
|
|
|
+
|
|
|
+ if (sysctl_overcommit_kbytes)
|
|
|
+ allowed = sysctl_overcommit_kbytes >> (PAGE_SHIFT - 10);
|
|
|
+ else
|
|
|
+ allowed = ((totalram_pages - hugetlb_total_pages())
|
|
|
+ * sysctl_overcommit_ratio / 100);
|
|
|
+ allowed += total_swap_pages;
|
|
|
+
|
|
|
+ return allowed;
|
|
|
}
|
|
|
|
|
|
|