@@ -42,7 +42,7 @@ static unsigned long hyp_idmap_start;
42
42
static unsigned long hyp_idmap_end ;
43
43
static phys_addr_t hyp_idmap_vector ;
44
44
45
- #define pgd_order get_order(PTRS_PER_PGD * sizeof(pgd_t))
45
+ #define hyp_pgd_order get_order(PTRS_PER_PGD * sizeof(pgd_t))
46
46
47
47
#define kvm_pmd_huge (_x ) (pmd_huge(_x) || pmd_trans_huge(_x))
48
48
@@ -134,7 +134,7 @@ static void unmap_ptes(struct kvm *kvm, pmd_t *pmd,
134
134
}
135
135
} while (pte ++ , addr += PAGE_SIZE , addr != end );
136
136
137
- if (kvm_pte_table_empty (start_pte ))
137
+ if (kvm_pte_table_empty (kvm , start_pte ))
138
138
clear_pmd_entry (kvm , pmd , start_addr );
139
139
}
140
140
@@ -158,7 +158,7 @@ static void unmap_pmds(struct kvm *kvm, pud_t *pud,
158
158
}
159
159
} while (pmd ++ , addr = next , addr != end );
160
160
161
- if (kvm_pmd_table_empty (start_pmd ))
161
+ if (kvm_pmd_table_empty (kvm , start_pmd ))
162
162
clear_pud_entry (kvm , pud , start_addr );
163
163
}
164
164
@@ -182,7 +182,7 @@ static void unmap_puds(struct kvm *kvm, pgd_t *pgd,
182
182
}
183
183
} while (pud ++ , addr = next , addr != end );
184
184
185
- if (kvm_pud_table_empty (start_pud ))
185
+ if (kvm_pud_table_empty (kvm , start_pud ))
186
186
clear_pgd_entry (kvm , pgd , start_addr );
187
187
}
188
188
@@ -306,7 +306,7 @@ void free_boot_hyp_pgd(void)
306
306
if (boot_hyp_pgd ) {
307
307
unmap_range (NULL , boot_hyp_pgd , hyp_idmap_start , PAGE_SIZE );
308
308
unmap_range (NULL , boot_hyp_pgd , TRAMPOLINE_VA , PAGE_SIZE );
309
- free_pages ((unsigned long )boot_hyp_pgd , pgd_order );
309
+ free_pages ((unsigned long )boot_hyp_pgd , hyp_pgd_order );
310
310
boot_hyp_pgd = NULL ;
311
311
}
312
312
@@ -343,7 +343,7 @@ void free_hyp_pgds(void)
343
343
for (addr = VMALLOC_START ; is_vmalloc_addr ((void * )addr ); addr += PGDIR_SIZE )
344
344
unmap_range (NULL , hyp_pgd , KERN_TO_HYP (addr ), PGDIR_SIZE );
345
345
346
- free_pages ((unsigned long )hyp_pgd , pgd_order );
346
+ free_pages ((unsigned long )hyp_pgd , hyp_pgd_order );
347
347
hyp_pgd = NULL ;
348
348
}
349
349
@@ -401,13 +401,46 @@ static int create_hyp_pmd_mappings(pud_t *pud, unsigned long start,
401
401
return 0 ;
402
402
}
403
403
404
+ static int create_hyp_pud_mappings (pgd_t * pgd , unsigned long start ,
405
+ unsigned long end , unsigned long pfn ,
406
+ pgprot_t prot )
407
+ {
408
+ pud_t * pud ;
409
+ pmd_t * pmd ;
410
+ unsigned long addr , next ;
411
+ int ret ;
412
+
413
+ addr = start ;
414
+ do {
415
+ pud = pud_offset (pgd , addr );
416
+
417
+ if (pud_none_or_clear_bad (pud )) {
418
+ pmd = pmd_alloc_one (NULL , addr );
419
+ if (!pmd ) {
420
+ kvm_err ("Cannot allocate Hyp pmd\n" );
421
+ return - ENOMEM ;
422
+ }
423
+ pud_populate (NULL , pud , pmd );
424
+ get_page (virt_to_page (pud ));
425
+ kvm_flush_dcache_to_poc (pud , sizeof (* pud ));
426
+ }
427
+
428
+ next = pud_addr_end (addr , end );
429
+ ret = create_hyp_pmd_mappings (pud , addr , next , pfn , prot );
430
+ if (ret )
431
+ return ret ;
432
+ pfn += (next - addr ) >> PAGE_SHIFT ;
433
+ } while (addr = next , addr != end );
434
+
435
+ return 0 ;
436
+ }
437
+
404
438
static int __create_hyp_mappings (pgd_t * pgdp ,
405
439
unsigned long start , unsigned long end ,
406
440
unsigned long pfn , pgprot_t prot )
407
441
{
408
442
pgd_t * pgd ;
409
443
pud_t * pud ;
410
- pmd_t * pmd ;
411
444
unsigned long addr , next ;
412
445
int err = 0 ;
413
446
@@ -416,22 +449,21 @@ static int __create_hyp_mappings(pgd_t *pgdp,
416
449
end = PAGE_ALIGN (end );
417
450
do {
418
451
pgd = pgdp + pgd_index (addr );
419
- pud = pud_offset (pgd , addr );
420
452
421
- if (pud_none_or_clear_bad ( pud )) {
422
- pmd = pmd_alloc_one (NULL , addr );
423
- if (!pmd ) {
424
- kvm_err ("Cannot allocate Hyp pmd \n" );
453
+ if (pgd_none ( * pgd )) {
454
+ pud = pud_alloc_one (NULL , addr );
455
+ if (!pud ) {
456
+ kvm_err ("Cannot allocate Hyp pud \n" );
425
457
err = - ENOMEM ;
426
458
goto out ;
427
459
}
428
- pud_populate (NULL , pud , pmd );
429
- get_page (virt_to_page (pud ));
430
- kvm_flush_dcache_to_poc (pud , sizeof (* pud ));
460
+ pgd_populate (NULL , pgd , pud );
461
+ get_page (virt_to_page (pgd ));
462
+ kvm_flush_dcache_to_poc (pgd , sizeof (* pgd ));
431
463
}
432
464
433
465
next = pgd_addr_end (addr , end );
434
- err = create_hyp_pmd_mappings ( pud , addr , next , pfn , prot );
466
+ err = create_hyp_pud_mappings ( pgd , addr , next , pfn , prot );
435
467
if (err )
436
468
goto out ;
437
469
pfn += (next - addr ) >> PAGE_SHIFT ;
@@ -521,21 +553,46 @@ int create_hyp_io_mappings(void *from, void *to, phys_addr_t phys_addr)
521
553
*/
522
554
int kvm_alloc_stage2_pgd (struct kvm * kvm )
523
555
{
556
+ int ret ;
524
557
pgd_t * pgd ;
525
558
526
559
if (kvm -> arch .pgd != NULL ) {
527
560
kvm_err ("kvm_arch already initialized?\n" );
528
561
return - EINVAL ;
529
562
}
530
563
531
- pgd = (pgd_t * )__get_free_pages (GFP_KERNEL | __GFP_ZERO , S2_PGD_ORDER );
564
+ if (KVM_PREALLOC_LEVEL > 0 ) {
565
+ /*
566
+ * Allocate fake pgd for the page table manipulation macros to
567
+ * work. This is not used by the hardware and we have no
568
+ * alignment requirement for this allocation.
569
+ */
570
+ pgd = (pgd_t * )kmalloc (PTRS_PER_S2_PGD * sizeof (pgd_t ),
571
+ GFP_KERNEL | __GFP_ZERO );
572
+ } else {
573
+ /*
574
+ * Allocate actual first-level Stage-2 page table used by the
575
+ * hardware for Stage-2 page table walks.
576
+ */
577
+ pgd = (pgd_t * )__get_free_pages (GFP_KERNEL | __GFP_ZERO , S2_PGD_ORDER );
578
+ }
579
+
532
580
if (!pgd )
533
581
return - ENOMEM ;
534
582
583
+ ret = kvm_prealloc_hwpgd (kvm , pgd );
584
+ if (ret )
585
+ goto out_err ;
586
+
535
587
kvm_clean_pgd (pgd );
536
588
kvm -> arch .pgd = pgd ;
537
-
538
589
return 0 ;
590
+ out_err :
591
+ if (KVM_PREALLOC_LEVEL > 0 )
592
+ kfree (pgd );
593
+ else
594
+ free_pages ((unsigned long )pgd , S2_PGD_ORDER );
595
+ return ret ;
539
596
}
540
597
541
598
/**
@@ -571,19 +628,39 @@ void kvm_free_stage2_pgd(struct kvm *kvm)
571
628
return ;
572
629
573
630
unmap_stage2_range (kvm , 0 , KVM_PHYS_SIZE );
574
- free_pages ((unsigned long )kvm -> arch .pgd , S2_PGD_ORDER );
631
+ kvm_free_hwpgd (kvm );
632
+ if (KVM_PREALLOC_LEVEL > 0 )
633
+ kfree (kvm -> arch .pgd );
634
+ else
635
+ free_pages ((unsigned long )kvm -> arch .pgd , S2_PGD_ORDER );
575
636
kvm -> arch .pgd = NULL ;
576
637
}
577
638
578
- static pmd_t * stage2_get_pmd (struct kvm * kvm , struct kvm_mmu_memory_cache * cache ,
639
+ static pud_t * stage2_get_pud (struct kvm * kvm , struct kvm_mmu_memory_cache * cache ,
579
640
phys_addr_t addr )
580
641
{
581
642
pgd_t * pgd ;
582
643
pud_t * pud ;
583
- pmd_t * pmd ;
584
644
585
645
pgd = kvm -> arch .pgd + pgd_index (addr );
586
- pud = pud_offset (pgd , addr );
646
+ if (WARN_ON (pgd_none (* pgd ))) {
647
+ if (!cache )
648
+ return NULL ;
649
+ pud = mmu_memory_cache_alloc (cache );
650
+ pgd_populate (NULL , pgd , pud );
651
+ get_page (virt_to_page (pgd ));
652
+ }
653
+
654
+ return pud_offset (pgd , addr );
655
+ }
656
+
657
+ static pmd_t * stage2_get_pmd (struct kvm * kvm , struct kvm_mmu_memory_cache * cache ,
658
+ phys_addr_t addr )
659
+ {
660
+ pud_t * pud ;
661
+ pmd_t * pmd ;
662
+
663
+ pud = stage2_get_pud (kvm , cache , addr );
587
664
if (pud_none (* pud )) {
588
665
if (!cache )
589
666
return NULL ;
@@ -629,7 +706,7 @@ static int stage2_set_pte(struct kvm *kvm, struct kvm_mmu_memory_cache *cache,
629
706
pmd_t * pmd ;
630
707
pte_t * pte , old_pte ;
631
708
632
- /* Create stage-2 page table mapping - Level 1 */
709
+ /* Create stage-2 page table mapping - Levels 0 and 1 */
633
710
pmd = stage2_get_pmd (kvm , cache , addr );
634
711
if (!pmd ) {
635
712
/*
@@ -690,7 +767,8 @@ int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa,
690
767
if (writable )
691
768
kvm_set_s2pte_writable (& pte );
692
769
693
- ret = mmu_topup_memory_cache (& cache , 2 , 2 );
770
+ ret = mmu_topup_memory_cache (& cache , KVM_MMU_CACHE_MIN_PAGES ,
771
+ KVM_NR_MEM_OBJS );
694
772
if (ret )
695
773
goto out ;
696
774
spin_lock (& kvm -> mmu_lock );
@@ -805,7 +883,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
805
883
up_read (& current -> mm -> mmap_sem );
806
884
807
885
/* We need minimum second+third level pages */
808
- ret = mmu_topup_memory_cache (memcache , 2 , KVM_NR_MEM_OBJS );
886
+ ret = mmu_topup_memory_cache (memcache , KVM_MMU_CACHE_MIN_PAGES ,
887
+ KVM_NR_MEM_OBJS );
809
888
if (ret )
810
889
return ret ;
811
890
@@ -1080,8 +1159,8 @@ int kvm_mmu_init(void)
1080
1159
(unsigned long )phys_base );
1081
1160
}
1082
1161
1083
- hyp_pgd = (pgd_t * )__get_free_pages (GFP_KERNEL | __GFP_ZERO , pgd_order );
1084
- boot_hyp_pgd = (pgd_t * )__get_free_pages (GFP_KERNEL | __GFP_ZERO , pgd_order );
1162
+ hyp_pgd = (pgd_t * )__get_free_pages (GFP_KERNEL | __GFP_ZERO , hyp_pgd_order );
1163
+ boot_hyp_pgd = (pgd_t * )__get_free_pages (GFP_KERNEL | __GFP_ZERO , hyp_pgd_order );
1085
1164
1086
1165
if (!hyp_pgd || !boot_hyp_pgd ) {
1087
1166
kvm_err ("Hyp mode PGD not allocated\n" );
0 commit comments