s390/mm,ptdump: add proper ifdefs
[linux-2.6-microblaze.git] / mm / util.c
index c63c8e4..5ef378a 100644 (file)
--- a/mm/util.c
+++ b/mm/util.c
@@ -503,8 +503,8 @@ unsigned long vm_mmap_pgoff(struct file *file, unsigned long addr,
        if (!ret) {
                if (mmap_write_lock_killable(mm))
                        return -EINTR;
-               ret = do_mmap_pgoff(file, addr, len, prot, flag, pgoff,
-                                   &populate, &uf);
+               ret = do_mmap(file, addr, len, prot, flag, pgoff, &populate,
+                             &uf);
                mmap_write_unlock(mm);
                userfaultfd_unmap_complete(mm, &uf);
                if (populate)
@@ -746,6 +746,47 @@ int overcommit_ratio_handler(struct ctl_table *table, int write, void *buffer,
        return ret;
 }
 
+static void sync_overcommit_as(struct work_struct *dummy)
+{
+       percpu_counter_sync(&vm_committed_as);
+}
+
+int overcommit_policy_handler(struct ctl_table *table, int write, void *buffer,
+               size_t *lenp, loff_t *ppos)
+{
+       struct ctl_table t;
+       int new_policy;
+       int ret;
+
+       /*
+        * The deviation of sync_overcommit_as could be big with loose policy
+        * like OVERCOMMIT_ALWAYS/OVERCOMMIT_GUESS. When changing policy to
+        * strict OVERCOMMIT_NEVER, we need to reduce the deviation to comply
+        * with the strict "NEVER", and to avoid possible race condtion (even
+        * though user usually won't too frequently do the switching to policy
+        * OVERCOMMIT_NEVER), the switch is done in the following order:
+        *      1. changing the batch
+        *      2. sync percpu count on each CPU
+        *      3. switch the policy
+        */
+       if (write) {
+               t = *table;
+               t.data = &new_policy;
+               ret = proc_dointvec_minmax(&t, write, buffer, lenp, ppos);
+               if (ret)
+                       return ret;
+
+               mm_compute_batch(new_policy);
+               if (new_policy == OVERCOMMIT_NEVER)
+                       schedule_on_each_cpu(sync_overcommit_as);
+               sysctl_overcommit_memory = new_policy;
+       } else {
+               ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
+       }
+
+       return ret;
+}
+
 int overcommit_kbytes_handler(struct ctl_table *table, int write, void *buffer,
                size_t *lenp, loff_t *ppos)
 {
@@ -787,10 +828,15 @@ struct percpu_counter vm_committed_as ____cacheline_aligned_in_smp;
  * balancing memory across competing virtual machines that are hosted.
  * Several metrics drive this policy engine including the guest reported
  * memory commitment.
+ *
+ * The time cost of this is very low for small platforms, and for big
+ * platform like a 2S/36C/72T Skylake server, in worst case where
+ * vm_committed_as's spinlock is under severe contention, the time cost
+ * could be about 30~40 microseconds.
  */
 unsigned long vm_memory_committed(void)
 {
-       return percpu_counter_read_positive(&vm_committed_as);
+       return percpu_counter_sum_positive(&vm_committed_as);
 }
 EXPORT_SYMBOL_GPL(vm_memory_committed);