mm: numa: limit scope of lock for NUMA migrate rate limiting
[firefly-linux-kernel-4.4.55.git] / mm / util.c
index eaf63fc2c92f05078f0c93694ea03b55d425eecb..a24aa22f2473690c1e2fa95514f778c6c0c616a7 100644 (file)
--- a/mm/util.c
+++ b/mm/util.c
@@ -7,6 +7,9 @@
 #include <linux/security.h>
 #include <linux/swap.h>
 #include <linux/swapops.h>
+#include <linux/mman.h>
+#include <linux/hugetlb.h>
+
 #include <asm/uaccess.h>
 
 #include "internal.h"
@@ -387,7 +390,10 @@ struct address_space *page_mapping(struct page *page)
 {
        struct address_space *mapping = page->mapping;
 
-       VM_BUG_ON(PageSlab(page));
+       /* This happens if someone calls flush_dcache_page on slab page */
+       if (unlikely(PageSlab(page)))
+               return NULL;
+
        if (unlikely(PageSwapCache(page))) {
                swp_entry_t entry;
 
@@ -398,6 +404,48 @@ 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)
+{
+       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;
+}
+
+
 /* Tracepoints definitions. */
 EXPORT_TRACEPOINT_SYMBOL(kmalloc);
 EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc);