diff options
author | Daiane Angolini <daiane.angolini@foundries.io> | 2022-07-14 08:02:44 -0300 |
---|---|---|
committer | Daiane Angolini <daiane.angolini@foundries.io> | 2022-07-14 08:02:57 -0300 |
commit | 8fe4fe4ac6ffc1510f98e3776895bbc1c07329a8 (patch) | |
tree | e634ab80708f830355d020536f12acc028f26bc8 /mm | |
parent | fa1854344bc6be25a7dae33f057781980ae6b88d (diff) | |
parent | ae766496dbd448eea2af4b3be8e2b2172ce38a79 (diff) |
Merge tag 'v5.15.40' into 5.15.32-2.0.0
This is the 5.15.40 stable release
Signed-off-by: Daiane Angolini <daiane.angolini@foundries.io>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/gup.c | 2 | ||||
-rw-r--r-- | mm/memory-failure.c | 4 | ||||
-rw-r--r-- | mm/memory.c | 2 | ||||
-rw-r--r-- | mm/migrate.c | 7 | ||||
-rw-r--r-- | mm/mlock.c | 1 | ||||
-rw-r--r-- | mm/shmem.c | 4 | ||||
-rw-r--r-- | mm/userfaultfd.c | 3 |
7 files changed, 18 insertions, 5 deletions
@@ -465,7 +465,7 @@ static int follow_pfn_pte(struct vm_area_struct *vma, unsigned long address, pte_t *pte, unsigned int flags) { /* No page to get reference */ - if (flags & FOLL_GET) + if (flags & (FOLL_GET | FOLL_PIN)) return -EFAULT; if (flags & FOLL_TOUCH) { diff --git a/mm/memory-failure.c b/mm/memory-failure.c index e659a7ef5acf..6b1556b4972e 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -705,8 +705,10 @@ static int kill_accessing_process(struct task_struct *p, unsigned long pfn, (void *)&priv); if (ret == 1 && priv.tk.addr) kill_proc(&priv.tk, pfn, flags); + else + ret = 0; mmap_read_unlock(p->mm); - return ret ? -EFAULT : -EHWPOISON; + return ret > 0 ? -EHWPOISON : -EFAULT; } static const char *action_name[] = { diff --git a/mm/memory.c b/mm/memory.c index bdf7185f1bf2..26d115ded4ab 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -5467,6 +5467,8 @@ long copy_huge_page_from_user(struct page *dst_page, if (rc) break; + flush_dcache_page(subpage); + cond_resched(); } return ret_val; diff --git a/mm/migrate.c b/mm/migrate.c index 1852d787e6ab..afb944b600fe 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -948,9 +948,12 @@ static int move_to_new_page(struct page *newpage, struct page *page, if (!PageMappingFlags(page)) page->mapping = NULL; - if (likely(!is_zone_device_page(newpage))) - flush_dcache_page(newpage); + if (likely(!is_zone_device_page(newpage))) { + int i, nr = compound_nr(newpage); + for (i = 0; i < nr; i++) + flush_dcache_page(newpage + i); + } } out: return rc; diff --git a/mm/mlock.c b/mm/mlock.c index c6946c91193d..0cee3f97d3df 100644 --- a/mm/mlock.c +++ b/mm/mlock.c @@ -837,6 +837,7 @@ int user_shm_lock(size_t size, struct ucounts *ucounts) } if (!get_ucounts(ucounts)) { dec_rlimit_ucounts(ucounts, UCOUNT_RLIMIT_MEMLOCK, locked); + allowed = 0; goto out; } allowed = 1; diff --git a/mm/shmem.c b/mm/shmem.c index 1609a8daba26..342d1bc72867 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -2394,8 +2394,10 @@ int shmem_mfill_atomic_pte(struct mm_struct *dst_mm, /* don't free the page */ goto out_unacct_blocks; } + + flush_dcache_page(page); } else { /* ZEROPAGE */ - clear_highpage(page); + clear_user_highpage(page, dst_addr); } } else { page = *pagep; diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c index 7a9008415534..c9bab48856c6 100644 --- a/mm/userfaultfd.c +++ b/mm/userfaultfd.c @@ -151,6 +151,8 @@ static int mcopy_atomic_pte(struct mm_struct *dst_mm, /* don't free the page */ goto out; } + + flush_dcache_page(page); } else { page = *pagep; *pagep = NULL; @@ -621,6 +623,7 @@ retry: err = -EFAULT; goto out; } + flush_dcache_page(page); goto retry; } else BUG_ON(page); |