projects
/
cascardo
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
cleancache: zap uuid arg of cleancache_init_shared_fs
[cascardo/linux.git]
/
mm
/
huge_memory.c
diff --git
a/mm/huge_memory.c
b/mm/huge_memory.c
index
6817b03
..
6352c1d
100644
(file)
--- a/
mm/huge_memory.c
+++ b/
mm/huge_memory.c
@@
-1231,7
+1231,7
@@
struct page *follow_trans_huge_pmd(struct vm_area_struct *vma,
pmd, _pmd, 1))
update_mmu_cache_pmd(vma, addr, pmd);
}
pmd, _pmd, 1))
update_mmu_cache_pmd(vma, addr, pmd);
}
- if ((flags & FOLL_
MLOCK
) && (vma->vm_flags & VM_LOCKED)) {
+ if ((flags & FOLL_
POPULATE
) && (vma->vm_flags & VM_LOCKED)) {
if (page->mapping && trylock_page(page)) {
lru_add_drain();
if (page->mapping)
if (page->mapping && trylock_page(page)) {
lru_add_drain();
if (page->mapping)
@@
-2109,7
+2109,7
@@
static void release_pte_pages(pte_t *pte, pte_t *_pte)
{
while (--_pte >= pte) {
pte_t pteval = *_pte;
{
while (--_pte >= pte) {
pte_t pteval = *_pte;
- if (!pte_none(pteval))
+ if (!pte_none(pteval)
&& !is_zero_pfn(pte_pfn(pteval))
)
release_pte_page(pte_page(pteval));
}
}
release_pte_page(pte_page(pteval));
}
}
@@
-2120,13
+2120,13
@@
static int __collapse_huge_page_isolate(struct vm_area_struct *vma,
{
struct page *page;
pte_t *_pte;
{
struct page *page;
pte_t *_pte;
- int none = 0;
+ int none
_or_zero
= 0;
bool referenced = false, writable = false;
for (_pte = pte; _pte < pte+HPAGE_PMD_NR;
_pte++, address += PAGE_SIZE) {
pte_t pteval = *_pte;
bool referenced = false, writable = false;
for (_pte = pte; _pte < pte+HPAGE_PMD_NR;
_pte++, address += PAGE_SIZE) {
pte_t pteval = *_pte;
- if (pte_none(pteval)) {
- if (++none <= khugepaged_max_ptes_none)
+ if (pte_none(pteval)
|| is_zero_pfn(pte_pfn(pteval))
) {
+ if (++none
_or_zero
<= khugepaged_max_ptes_none)
continue;
else
goto out;
continue;
else
goto out;
@@
-2207,9
+2207,21
@@
static void __collapse_huge_page_copy(pte_t *pte, struct page *page,
pte_t pteval = *_pte;
struct page *src_page;
pte_t pteval = *_pte;
struct page *src_page;
- if (pte_none(pteval)) {
+ if (pte_none(pteval)
|| is_zero_pfn(pte_pfn(pteval))
) {
clear_user_highpage(page, address);
add_mm_counter(vma->vm_mm, MM_ANONPAGES, 1);
clear_user_highpage(page, address);
add_mm_counter(vma->vm_mm, MM_ANONPAGES, 1);
+ if (is_zero_pfn(pte_pfn(pteval))) {
+ /*
+ * ptl mostly unnecessary.
+ */
+ spin_lock(ptl);
+ /*
+ * paravirt calls inside pte_clear here are
+ * superfluous.
+ */
+ pte_clear(vma->vm_mm, address, _pte);
+ spin_unlock(ptl);
+ }
} else {
src_page = pte_page(pteval);
copy_user_highpage(page, src_page, address, vma);
} else {
src_page = pte_page(pteval);
copy_user_highpage(page, src_page, address, vma);
@@
-2543,7
+2555,7
@@
static int khugepaged_scan_pmd(struct mm_struct *mm,
{
pmd_t *pmd;
pte_t *pte, *_pte;
{
pmd_t *pmd;
pte_t *pte, *_pte;
- int ret = 0, none = 0;
+ int ret = 0, none
_or_zero
= 0;
struct page *page;
unsigned long _address;
spinlock_t *ptl;
struct page *page;
unsigned long _address;
spinlock_t *ptl;
@@
-2561,8
+2573,8
@@
static int khugepaged_scan_pmd(struct mm_struct *mm,
for (_address = address, _pte = pte; _pte < pte+HPAGE_PMD_NR;
_pte++, _address += PAGE_SIZE) {
pte_t pteval = *_pte;
for (_address = address, _pte = pte; _pte < pte+HPAGE_PMD_NR;
_pte++, _address += PAGE_SIZE) {
pte_t pteval = *_pte;
- if (pte_none(pteval)) {
- if (++none <= khugepaged_max_ptes_none)
+ if (pte_none(pteval)
|| is_zero_pfn(pte_pfn(pteval))
) {
+ if (++none
_or_zero
<= khugepaged_max_ptes_none)
continue;
else
goto out_unmap;
continue;
else
goto out_unmap;