Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf6f7e56 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "Hibernate: Add check for pte_valid in saveable page"

parents 90ca81d0 7b3b9aa4
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -1257,6 +1257,33 @@ static inline void *saveable_highmem_page(struct zone *z, unsigned long p)
}
#endif /* CONFIG_HIGHMEM */

static bool kernel_pte_present(struct page *page)
{
	pgd_t *pgd;
	pud_t *pud;
	pmd_t *pmd;
	pte_t *pte;
	unsigned long addr = (unsigned long)page_address(page);

	pgd = pgd_offset_k(addr);
	if (pgd_none(*pgd))
		return false;

	pud = pud_offset(pgd, addr);
	if (pud_none(*pud))
		return false;
	if (pud_sect(*pud))
		return true;

	pmd = pmd_offset(pud, addr);
	if (pmd_none(*pmd))
		return false;
	if (pmd_sect(*pmd))
		return true;

	pte = pte_offset_kernel(pmd, addr);
	return pte_valid(*pte);
}
/**
 * saveable_page - Check if the given page is saveable.
 *
@@ -1287,6 +1314,14 @@ static struct page *saveable_page(struct zone *zone, unsigned long pfn)
	    && (!kernel_page_present(page) || pfn_is_nosave(pfn)))
		return NULL;

	/*
	 * Even if page is not reserved and if it's not present in kernel PTE;
	 * don't snapshot it ! This happens to the pages allocated using
	 * __dma_alloc_coherent with DMA_ATTR_NO_KERNEL_MAPPING flag set.
	 */
	if (!kernel_pte_present(page))
		return NULL;

	if (page_is_guard(page))
		return NULL;