mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 03:53:37 +02:00
- Convert x86 code to use generic "pagetable" APIs and ptdescs
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEV76QKkVc4xCGURexaDWVMHDJkrAFAmndEMIACgkQaDWVMHDJ krBe5Q/9FPMxtrRDSx/wAjbheg7ADDM3iKPqxMG6bywFGyaSUPeOSK9ZahjB+fiS WYTxdWeYeDlCXFAi9xaMb6z75ertnDs2rSifDyiRZHLMPgL9LOMmQYz/evV3RzVq r6uRMCqqoC3NbVuxxOGr4pXyxiw5l5iCkYYk4mhA+n6JMtvQqRknLnC7D/gkZCYT /N/BRgQjczibdIc9zJoNtMZ1TgbupEl30Ou3elx0+ptFNaKyyirHHhgQCeUQnTWE p5n013+1mU+mEVevugfd52Ww1sAyjlvihOhP1yAFRf272A+WCkZrOARa05JhQipF KjGW0+EgEMTTLrOyoUQPjSFFmAWOuU+E/9VM2Z2yuIGzXMpKQSrNRev2RRw9TNF/ N5s97DoRvg9zBRdCI72GQTUzVf+V3yy31djSmfRItxVLLy4szPl6ME8Pke8MzNuQ qJBLf0leWxoSPEqdrQbCPQciq9/G/ErD9Sz5s9aeAAxbWPe9FGoN43e2Kho+vvRz Ik9XQMpollGcBolskJM/4gj6kKt4F5JAHH5hoa7myt4r3v1ORv3CTCBoR7bvQbvd YytEB/hV7LKfD9W0YEznkg8OVukIHFsEdUDOQDrVrr62ZZ0mNCELeqOpNcgBOWF+ Iount8UFIpg0Y4zz3MZF/B8aEaMLilAuZF7TlE7Dz2XaiLK5sbs= =c+4k -----END PGP SIGNATURE----- Merge tag 'x86_mm_for_7.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull x86 mm updates from Dave Hansen: - Convert x86 code to use generic "pagetable" APIs and ptdescs This aligns some the set_memory*() code better with the new page table APIs, especially using ptdescs as opposed to 'struct page' directly. * tag 'x86_mm_for_7.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/mm/pat: Convert split_large_page() to use ptdescs x86/mm/pat: Convert populate_pgd() to use page table apis x86/mm/pat: Convert pmd code to use page table apis x86/mm/pat: Convert pte code to use page table apis
This commit is contained in:
commit
51efd08647
|
|
@ -1119,9 +1119,10 @@ static void split_set_pte(struct cpa_data *cpa, pte_t *pte, unsigned long pfn,
|
|||
|
||||
static int
|
||||
__split_large_page(struct cpa_data *cpa, pte_t *kpte, unsigned long address,
|
||||
struct page *base)
|
||||
struct ptdesc *ptdesc)
|
||||
{
|
||||
unsigned long lpaddr, lpinc, ref_pfn, pfn, pfninc = 1;
|
||||
struct page *base = ptdesc_page(ptdesc);
|
||||
pte_t *pbase = (pte_t *)page_address(base);
|
||||
unsigned int i, level;
|
||||
pgprot_t ref_prot;
|
||||
|
|
@ -1226,18 +1227,18 @@ __split_large_page(struct cpa_data *cpa, pte_t *kpte, unsigned long address,
|
|||
static int split_large_page(struct cpa_data *cpa, pte_t *kpte,
|
||||
unsigned long address)
|
||||
{
|
||||
struct page *base;
|
||||
struct ptdesc *ptdesc;
|
||||
|
||||
if (!debug_pagealloc_enabled())
|
||||
spin_unlock(&cpa_lock);
|
||||
base = alloc_pages(GFP_KERNEL, 0);
|
||||
ptdesc = pagetable_alloc(GFP_KERNEL, 0);
|
||||
if (!debug_pagealloc_enabled())
|
||||
spin_lock(&cpa_lock);
|
||||
if (!base)
|
||||
if (!ptdesc)
|
||||
return -ENOMEM;
|
||||
|
||||
if (__split_large_page(cpa, kpte, address, base))
|
||||
__free_page(base);
|
||||
if (__split_large_page(cpa, kpte, address, ptdesc))
|
||||
pagetable_free(ptdesc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1408,7 +1409,7 @@ static bool try_to_free_pte_page(pte_t *pte)
|
|||
if (!pte_none(pte[i]))
|
||||
return false;
|
||||
|
||||
free_page((unsigned long)pte);
|
||||
pte_free_kernel(&init_mm, pte);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -1420,7 +1421,7 @@ static bool try_to_free_pmd_page(pmd_t *pmd)
|
|||
if (!pmd_none(pmd[i]))
|
||||
return false;
|
||||
|
||||
free_page((unsigned long)pmd);
|
||||
pmd_free(&init_mm, pmd);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -1539,7 +1540,7 @@ static void unmap_pud_range(p4d_t *p4d, unsigned long start, unsigned long end)
|
|||
|
||||
static int alloc_pte_page(pmd_t *pmd)
|
||||
{
|
||||
pte_t *pte = (pte_t *)get_zeroed_page(GFP_KERNEL);
|
||||
pte_t *pte = pte_alloc_one_kernel(&init_mm);
|
||||
if (!pte)
|
||||
return -1;
|
||||
|
||||
|
|
@ -1549,7 +1550,11 @@ static int alloc_pte_page(pmd_t *pmd)
|
|||
|
||||
static int alloc_pmd_page(pud_t *pud)
|
||||
{
|
||||
pmd_t *pmd = (pmd_t *)get_zeroed_page(GFP_KERNEL);
|
||||
/*
|
||||
* Pass 0 as a placeholder for the second argument, since the
|
||||
* generic implementation of pmd_alloc_one() does not use it.
|
||||
*/
|
||||
pmd_t *pmd = pmd_alloc_one(&init_mm, 0);
|
||||
if (!pmd)
|
||||
return -1;
|
||||
|
||||
|
|
@ -1743,7 +1748,11 @@ static int populate_pgd(struct cpa_data *cpa, unsigned long addr)
|
|||
pgd_entry = cpa->pgd + pgd_index(addr);
|
||||
|
||||
if (pgd_none(*pgd_entry)) {
|
||||
p4d = (p4d_t *)get_zeroed_page(GFP_KERNEL);
|
||||
/*
|
||||
* Pass 0 as a placeholder for the second argument, since the
|
||||
* generic implementation of p4d_alloc_one() does not use it.
|
||||
*/
|
||||
p4d = p4d_alloc_one(&init_mm, 0);
|
||||
if (!p4d)
|
||||
return -1;
|
||||
|
||||
|
|
@ -1755,7 +1764,11 @@ static int populate_pgd(struct cpa_data *cpa, unsigned long addr)
|
|||
*/
|
||||
p4d = p4d_offset(pgd_entry, addr);
|
||||
if (p4d_none(*p4d)) {
|
||||
pud = (pud_t *)get_zeroed_page(GFP_KERNEL);
|
||||
/*
|
||||
* Pass 0 as a placeholder for the second argument, since the
|
||||
* generic implementation of pud_alloc_one() does not use it.
|
||||
*/
|
||||
pud = pud_alloc_one(&init_mm, 0);
|
||||
if (!pud)
|
||||
return -1;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user