summaryrefslogtreecommitdiff
path: root/mm
diff options
context:
space:
mode:
authorDaiane Angolini <daiane.angolini@foundries.io>2022-07-14 08:02:44 -0300
committerDaiane Angolini <daiane.angolini@foundries.io>2022-07-14 08:02:57 -0300
commit8fe4fe4ac6ffc1510f98e3776895bbc1c07329a8 (patch)
treee634ab80708f830355d020536f12acc028f26bc8 /mm
parentfa1854344bc6be25a7dae33f057781980ae6b88d (diff)
parentae766496dbd448eea2af4b3be8e2b2172ce38a79 (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.c2
-rw-r--r--mm/memory-failure.c4
-rw-r--r--mm/memory.c2
-rw-r--r--mm/migrate.c7
-rw-r--r--mm/mlock.c1
-rw-r--r--mm/shmem.c4
-rw-r--r--mm/userfaultfd.c3
7 files changed, 18 insertions, 5 deletions
diff --git a/mm/gup.c b/mm/gup.c
index ba2ab7a223f8..05068d3d2557 100644
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -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);