Updated from Linux LTS 3.10.25 to 3.10.26
This commit is contained in:
@@ -134,6 +134,10 @@ static void update_pageblock_skip(struct compact_control *cc,
|
||||
bool migrate_scanner)
|
||||
{
|
||||
struct zone *zone = cc->zone;
|
||||
|
||||
if (cc->ignore_skip_hint)
|
||||
return;
|
||||
|
||||
if (!page)
|
||||
return;
|
||||
|
||||
|
||||
@@ -203,9 +203,10 @@ get_write_lock:
|
||||
if (mapping_cap_account_dirty(mapping)) {
|
||||
unsigned long addr;
|
||||
struct file *file = get_file(vma->vm_file);
|
||||
/* mmap_region may free vma; grab the info now */
|
||||
vm_flags = vma->vm_flags;
|
||||
|
||||
addr = mmap_region(file, start, size,
|
||||
vma->vm_flags, pgoff);
|
||||
addr = mmap_region(file, start, size, vm_flags, pgoff);
|
||||
fput(file);
|
||||
if (IS_ERR_VALUE(addr)) {
|
||||
err = addr;
|
||||
@@ -213,7 +214,7 @@ get_write_lock:
|
||||
BUG_ON(addr != start);
|
||||
err = 0;
|
||||
}
|
||||
goto out;
|
||||
goto out_freed;
|
||||
}
|
||||
mutex_lock(&mapping->i_mmap_mutex);
|
||||
flush_dcache_mmap_lock(mapping);
|
||||
@@ -248,6 +249,7 @@ get_write_lock:
|
||||
out:
|
||||
if (vma)
|
||||
vm_flags = vma->vm_flags;
|
||||
out_freed:
|
||||
if (likely(!has_write_lock))
|
||||
up_read(&mm->mmap_sem);
|
||||
else
|
||||
|
||||
@@ -1344,6 +1344,20 @@ int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/* Bail if we fail to protect against THP splits for any reason */
|
||||
if (unlikely(!anon_vma)) {
|
||||
put_page(page);
|
||||
page_nid = -1;
|
||||
goto clear_pmdnuma;
|
||||
}
|
||||
|
||||
/*
|
||||
* The page_table_lock above provides a memory barrier
|
||||
* with change_protection_range.
|
||||
*/
|
||||
if (mm_tlb_flush_pending(mm))
|
||||
flush_tlb_range(vma, haddr, haddr + HPAGE_PMD_SIZE);
|
||||
|
||||
/*
|
||||
* Migrate the THP to the requested node, returns with page unlocked
|
||||
* and pmd_numa cleared.
|
||||
|
||||
@@ -385,7 +385,7 @@ struct mem_cgroup {
|
||||
static size_t memcg_size(void)
|
||||
{
|
||||
return sizeof(struct mem_cgroup) +
|
||||
nr_node_ids * sizeof(struct mem_cgroup_per_node);
|
||||
nr_node_ids * sizeof(struct mem_cgroup_per_node *);
|
||||
}
|
||||
|
||||
/* internal only representation about the status of kmem accounting. */
|
||||
|
||||
@@ -936,6 +936,16 @@ static int hwpoison_user_mappings(struct page *p, unsigned long pfn,
|
||||
BUG_ON(!PageHWPoison(p));
|
||||
return SWAP_FAIL;
|
||||
}
|
||||
/*
|
||||
* We pinned the head page for hwpoison handling,
|
||||
* now we split the thp and we are interested in
|
||||
* the hwpoisoned raw page, so move the refcount
|
||||
* to it.
|
||||
*/
|
||||
if (hpage != p) {
|
||||
put_page(hpage);
|
||||
get_page(p);
|
||||
}
|
||||
/* THP is split, so ppage should be the real poisoned page. */
|
||||
ppage = p;
|
||||
}
|
||||
|
||||
@@ -1715,7 +1715,8 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm,
|
||||
putback_lru_page(page);
|
||||
mod_zone_page_state(page_zone(page),
|
||||
NR_ISOLATED_ANON + page_lru, -HPAGE_PMD_NR);
|
||||
goto out_fail;
|
||||
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1765,6 +1766,7 @@ out_dropref:
|
||||
set_pmd_at(mm, haddr, pmd, entry);
|
||||
update_mmu_cache_pmd(vma, address, &entry);
|
||||
|
||||
out_unlock:
|
||||
unlock_page(page);
|
||||
put_page(page);
|
||||
return 0;
|
||||
|
||||
@@ -206,6 +206,7 @@ static unsigned long change_protection_range(struct vm_area_struct *vma,
|
||||
BUG_ON(addr >= end);
|
||||
pgd = pgd_offset(mm, addr);
|
||||
flush_cache_range(vma, addr, end);
|
||||
set_tlb_flush_pending(mm);
|
||||
do {
|
||||
next = pgd_addr_end(addr, end);
|
||||
if (pgd_none_or_clear_bad(pgd))
|
||||
@@ -217,6 +218,7 @@ static unsigned long change_protection_range(struct vm_area_struct *vma,
|
||||
/* Only flush the TLB if we actually modified any entries: */
|
||||
if (pages)
|
||||
flush_tlb_range(vma, start, end);
|
||||
clear_tlb_flush_pending(mm);
|
||||
|
||||
return pages;
|
||||
}
|
||||
|
||||
@@ -86,9 +86,10 @@ int pmdp_clear_flush_young(struct vm_area_struct *vma,
|
||||
pte_t ptep_clear_flush(struct vm_area_struct *vma, unsigned long address,
|
||||
pte_t *ptep)
|
||||
{
|
||||
struct mm_struct *mm = (vma)->vm_mm;
|
||||
pte_t pte;
|
||||
pte = ptep_get_and_clear((vma)->vm_mm, address, ptep);
|
||||
if (pte_accessible(pte))
|
||||
pte = ptep_get_and_clear(mm, address, ptep);
|
||||
if (pte_accessible(mm, pte))
|
||||
flush_tlb_page(vma, address);
|
||||
return pte;
|
||||
}
|
||||
@@ -166,6 +167,9 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm)
|
||||
void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,
|
||||
pmd_t *pmdp)
|
||||
{
|
||||
pmd_t entry = *pmdp;
|
||||
if (pmd_numa(entry))
|
||||
entry = pmd_mknonnuma(entry);
|
||||
set_pmd_at(vma->vm_mm, address, pmdp, pmd_mknotpresent(*pmdp));
|
||||
flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE);
|
||||
}
|
||||
|
||||
@@ -600,7 +600,11 @@ pte_t *__page_check_address(struct page *page, struct mm_struct *mm,
|
||||
spinlock_t *ptl;
|
||||
|
||||
if (unlikely(PageHuge(page))) {
|
||||
/* when pud is not present, pte will be NULL */
|
||||
pte = huge_pte_offset(mm, address);
|
||||
if (!pte)
|
||||
return NULL;
|
||||
|
||||
ptl = &mm->page_table_lock;
|
||||
goto check;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user