mm/secretmem: use refcount_t instead of atomic_t
[linux-2.6-microblaze.git] / mm / khugepaged.c
index 6c0185f..b0412be 100644 (file)
@@ -442,9 +442,7 @@ static inline int khugepaged_test_exit(struct mm_struct *mm)
 static bool hugepage_vma_check(struct vm_area_struct *vma,
                               unsigned long vm_flags)
 {
-       /* Explicitly disabled through madvise. */
-       if ((vm_flags & VM_NOHUGEPAGE) ||
-           test_bit(MMF_DISABLE_THP, &vma->vm_mm->flags))
+       if (!transhuge_vma_enabled(vma, vm_flags))
                return false;
 
        /* Enabled via shmem mount options or sysfs settings. */
@@ -459,7 +457,8 @@ static bool hugepage_vma_check(struct vm_area_struct *vma,
 
        /* Read-only file mappings need to be aligned for THP to work. */
        if (IS_ENABLED(CONFIG_READ_ONLY_THP_FOR_FS) && vma->vm_file &&
-           (vm_flags & VM_DENYWRITE)) {
+           !inode_is_open_for_write(vma->vm_file->f_inode) &&
+           (vm_flags & VM_EXEC)) {
                return IS_ALIGNED((vma->vm_start >> PAGE_SHIFT) - vma->vm_pgoff,
                                HPAGE_PMD_NR);
        }
@@ -1864,6 +1863,19 @@ out_unlock:
        else {
                __mod_lruvec_page_state(new_page, NR_FILE_THPS, nr);
                filemap_nr_thps_inc(mapping);
+               /*
+                * Paired with smp_mb() in do_dentry_open() to ensure
+                * i_writecount is up to date and the update to nr_thps is
+                * visible. Ensures the page cache will be truncated if the
+                * file is opened writable.
+                */
+               smp_mb();
+               if (inode_is_open_for_write(mapping->host)) {
+                       result = SCAN_FAIL;
+                       __mod_lruvec_page_state(new_page, NR_FILE_THPS, -nr);
+                       filemap_nr_thps_dec(mapping);
+                       goto xa_locked;
+               }
        }
 
        if (nr_none) {