@@ -187,6 +187,7 @@ static inline void __pte_clear(pte_t *ptep)
187
187
* Undefined behaviour if not..
188
188
*/
189
189
#define pte_present hv_pte_get_present
190
+ #define pte_mknotpresent hv_pte_clear_present
190
191
#define pte_user hv_pte_get_user
191
192
#define pte_read hv_pte_get_readable
192
193
#define pte_dirty hv_pte_get_dirty
@@ -312,7 +313,7 @@ extern void check_mm_caching(struct mm_struct *prev, struct mm_struct *next);
312
313
*/
313
314
static inline pte_t pte_modify (pte_t pte , pgprot_t newprot )
314
315
{
315
- return pfn_pte (hv_pte_get_pfn (pte ), newprot );
316
+ return pfn_pte (pte_pfn (pte ), newprot );
316
317
}
317
318
318
319
/*
@@ -410,6 +411,46 @@ static inline unsigned long pmd_index(unsigned long address)
410
411
return (address >> PMD_SHIFT ) & (PTRS_PER_PMD - 1 );
411
412
}
412
413
414
+ #define __HAVE_ARCH_PMDP_TEST_AND_CLEAR_YOUNG
415
+ static inline int pmdp_test_and_clear_young (struct vm_area_struct * vma ,
416
+ unsigned long address ,
417
+ pmd_t * pmdp )
418
+ {
419
+ return ptep_test_and_clear_young (vma , address , pmdp_ptep (pmdp ));
420
+ }
421
+
422
+ #define __HAVE_ARCH_PMDP_SET_WRPROTECT
423
+ static inline void pmdp_set_wrprotect (struct mm_struct * mm ,
424
+ unsigned long address , pmd_t * pmdp )
425
+ {
426
+ ptep_set_wrprotect (mm , address , pmdp_ptep (pmdp ));
427
+ }
428
+
429
+
430
+ #define __HAVE_ARCH_PMDP_GET_AND_CLEAR
431
+ static inline pmd_t pmdp_get_and_clear (struct mm_struct * mm ,
432
+ unsigned long address ,
433
+ pmd_t * pmdp )
434
+ {
435
+ return pte_pmd (ptep_get_and_clear (mm , address , pmdp_ptep (pmdp )));
436
+ }
437
+
438
+ static inline void __set_pmd (pmd_t * pmdp , pmd_t pmdval )
439
+ {
440
+ set_pte (pmdp_ptep (pmdp ), pmd_pte (pmdval ));
441
+ }
442
+
443
+ #define set_pmd_at (mm , addr , pmdp , pmdval ) __set_pmd(pmdp, pmdval)
444
+
445
+ /* Create a pmd from a PTFN. */
446
+ static inline pmd_t ptfn_pmd (unsigned long ptfn , pgprot_t prot )
447
+ {
448
+ return pte_pmd (hv_pte_set_ptfn (prot , ptfn ));
449
+ }
450
+
451
+ /* Return the page-table frame number (ptfn) that a pmd_t points at. */
452
+ #define pmd_ptfn (pmd ) hv_pte_get_ptfn(pmd_pte(pmd))
453
+
413
454
/*
414
455
* A given kernel pmd_t maps to a specific virtual address (either a
415
456
* kernel huge page or a kernel pte_t table). Since kernel pte_t
@@ -432,6 +473,47 @@ static inline unsigned long pmd_page_vaddr(pmd_t pmd)
432
473
*/
433
474
#define pmd_page (pmd ) pfn_to_page(HV_PTFN_TO_PFN(pmd_ptfn(pmd)))
434
475
476
+ static inline void pmd_clear (pmd_t * pmdp )
477
+ {
478
+ __pte_clear (pmdp_ptep (pmdp ));
479
+ }
480
+
481
+ #define pmd_mknotpresent (pmd ) pte_pmd(pte_mknotpresent(pmd_pte(pmd)))
482
+ #define pmd_young (pmd ) pte_young(pmd_pte(pmd))
483
+ #define pmd_mkyoung (pmd ) pte_pmd(pte_mkyoung(pmd_pte(pmd)))
484
+ #define pmd_mkold (pmd ) pte_pmd(pte_mkold(pmd_pte(pmd)))
485
+ #define pmd_mkwrite (pmd ) pte_pmd(pte_mkwrite(pmd_pte(pmd)))
486
+ #define pmd_write (pmd ) pte_write(pmd_pte(pmd))
487
+ #define pmd_wrprotect (pmd ) pte_pmd(pte_wrprotect(pmd_pte(pmd)))
488
+ #define pmd_mkdirty (pmd ) pte_pmd(pte_mkdirty(pmd_pte(pmd)))
489
+ #define pmd_huge_page (pmd ) pte_huge(pmd_pte(pmd))
490
+ #define pmd_mkhuge (pmd ) pte_pmd(pte_mkhuge(pmd_pte(pmd)))
491
+ #define __HAVE_ARCH_PMD_WRITE
492
+
493
+ #define pfn_pmd (pfn , pgprot ) pte_pmd(pfn_pte((pfn), (pgprot)))
494
+ #define pmd_pfn (pmd ) pte_pfn(pmd_pte(pmd))
495
+ #define mk_pmd (page , pgprot ) pfn_pmd(page_to_pfn(page), (pgprot))
496
+
497
+ static inline pmd_t pmd_modify (pmd_t pmd , pgprot_t newprot )
498
+ {
499
+ return pfn_pmd (pmd_pfn (pmd ), newprot );
500
+ }
501
+
502
+ #ifdef CONFIG_TRANSPARENT_HUGEPAGE
503
+ #define has_transparent_hugepage () 1
504
+ #define pmd_trans_huge pmd_huge_page
505
+
506
+ static inline pmd_t pmd_mksplitting (pmd_t pmd )
507
+ {
508
+ return pte_pmd (hv_pte_set_client2 (pmd_pte (pmd )));
509
+ }
510
+
511
+ static inline int pmd_trans_splitting (pmd_t pmd )
512
+ {
513
+ return hv_pte_get_client2 (pmd_pte (pmd ));
514
+ }
515
+ #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
516
+
435
517
/*
436
518
* The pte page can be thought of an array like this: pte_t[PTRS_PER_PTE]
437
519
*
@@ -448,11 +530,6 @@ static inline pte_t *pte_offset_kernel(pmd_t *pmd, unsigned long address)
448
530
return (pte_t * )pmd_page_vaddr (* pmd ) + pte_index (address );
449
531
}
450
532
451
- static inline int pmd_huge_page (pmd_t pmd )
452
- {
453
- return pmd_val (pmd ) & _PAGE_HUGE_PAGE ;
454
- }
455
-
456
533
#include <asm-generic/pgtable.h>
457
534
458
535
/* Support /proc/NN/pgtable API. */
0 commit comments