@@ -468,7 +468,7 @@ static int
468
468
try_preserve_large_page (pte_t * kpte , unsigned long address ,
469
469
struct cpa_data * cpa )
470
470
{
471
- unsigned long nextpage_addr , numpages , pmask , psize , addr , pfn ;
471
+ unsigned long nextpage_addr , numpages , pmask , psize , addr , pfn , old_pfn ;
472
472
pte_t new_pte , old_pte , * tmp ;
473
473
pgprot_t old_prot , new_prot , req_prot ;
474
474
int i , do_split = 1 ;
@@ -488,17 +488,21 @@ try_preserve_large_page(pte_t *kpte, unsigned long address,
488
488
489
489
switch (level ) {
490
490
case PG_LEVEL_2M :
491
- #ifdef CONFIG_X86_64
491
+ old_prot = pmd_pgprot (* (pmd_t * )kpte );
492
+ old_pfn = pmd_pfn (* (pmd_t * )kpte );
493
+ break ;
492
494
case PG_LEVEL_1G :
493
- #endif
494
- psize = page_level_size (level );
495
- pmask = page_level_mask (level );
495
+ old_prot = pud_pgprot (* (pud_t * )kpte );
496
+ old_pfn = pud_pfn (* (pud_t * )kpte );
496
497
break ;
497
498
default :
498
499
do_split = - EINVAL ;
499
500
goto out_unlock ;
500
501
}
501
502
503
+ psize = page_level_size (level );
504
+ pmask = page_level_mask (level );
505
+
502
506
/*
503
507
* Calculate the number of pages, which fit into this large
504
508
* page starting at address:
@@ -514,7 +518,7 @@ try_preserve_large_page(pte_t *kpte, unsigned long address,
514
518
* up accordingly.
515
519
*/
516
520
old_pte = * kpte ;
517
- old_prot = req_prot = pgprot_large_2_4k (pte_pgprot ( old_pte ) );
521
+ old_prot = req_prot = pgprot_large_2_4k (old_prot );
518
522
519
523
pgprot_val (req_prot ) &= ~pgprot_val (cpa -> mask_clr );
520
524
pgprot_val (req_prot ) |= pgprot_val (cpa -> mask_set );
@@ -540,10 +544,10 @@ try_preserve_large_page(pte_t *kpte, unsigned long address,
540
544
req_prot = canon_pgprot (req_prot );
541
545
542
546
/*
543
- * old_pte points to the large page base address . So we need
547
+ * old_pfn points to the large page base pfn . So we need
544
548
* to add the offset of the virtual address:
545
549
*/
546
- pfn = pte_pfn ( old_pte ) + ((address & (psize - 1 )) >> PAGE_SHIFT );
550
+ pfn = old_pfn + ((address & (psize - 1 )) >> PAGE_SHIFT );
547
551
cpa -> pfn = pfn ;
548
552
549
553
new_prot = static_protections (req_prot , address , pfn );
@@ -554,7 +558,7 @@ try_preserve_large_page(pte_t *kpte, unsigned long address,
554
558
* the pages in the range we try to preserve:
555
559
*/
556
560
addr = address & pmask ;
557
- pfn = pte_pfn ( old_pte ) ;
561
+ pfn = old_pfn ;
558
562
for (i = 0 ; i < (psize >> PAGE_SHIFT ); i ++ , addr += PAGE_SIZE , pfn ++ ) {
559
563
pgprot_t chk_prot = static_protections (req_prot , addr , pfn );
560
564
@@ -584,7 +588,7 @@ try_preserve_large_page(pte_t *kpte, unsigned long address,
584
588
* The address is aligned and the number of pages
585
589
* covers the full page.
586
590
*/
587
- new_pte = pfn_pte (pte_pfn ( old_pte ) , new_prot );
591
+ new_pte = pfn_pte (old_pfn , new_prot );
588
592
__set_pmd_pte (kpte , address , new_pte );
589
593
cpa -> flags |= CPA_FLUSHTLB ;
590
594
do_split = 0 ;
0 commit comments