|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/mm: Implement common put_data_pages for put_page_from_l[23]e
commit c9115affa6f83aebe29ae9cbf503aa163911a5bb
Author: George Dunlap <george.dunlap@xxxxxxxxxx>
AuthorDate: Fri Dec 13 12:53:04 2019 +0000
Commit: George Dunlap <george.dunlap@xxxxxxxxxx>
CommitDate: Fri Dec 13 17:15:52 2019 +0000
x86/mm: Implement common put_data_pages for put_page_from_l[23]e
Both put_page_from_l2e and put_page_from_l3e handle having superpage
entries by looping over each page and "put"-ing each one individually.
As with putting page table entries, this code is functionally
identical, but for some reason different. Moreover, there is already
a common function, put_data_page(), to handle automatically swapping
between put_page() (for read-only pages) or put_page_and_type() (for
read-write pages).
Replace this with put_data_pages() (plural), which does the entire
loop, as well as the put_page / put_page_and_type switch.
Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
xen/arch/x86/mm.c | 52 ++++++++++++++++++++--------------------------------
1 file changed, 20 insertions(+), 32 deletions(-)
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 59fc820a67..9556e8f780 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -1289,14 +1289,6 @@ void put_page_from_l1e(l1_pgentry_t l1e, struct domain
*l1e_owner)
}
#ifdef CONFIG_PV
-static void put_data_page(struct page_info *page, bool writeable)
-{
- if ( writeable )
- put_page_and_type(page);
- else
- put_page(page);
-}
-
static int put_pt_page(struct page_info *pg, struct page_info *ptpg,
unsigned int flags)
{
@@ -1319,6 +1311,20 @@ static int put_pt_page(struct page_info *pg, struct
page_info *ptpg,
return rc;
}
+static int put_data_pages(struct page_info *page, bool writeable, int pt_shift)
+{
+ unsigned int i, count = 1 << (pt_shift - PAGE_SHIFT);
+
+ ASSERT(!(mfn_x(page_to_mfn(page)) & (count - 1)));
+ for ( i = 0; i < count ; i++, page++ )
+ if ( writeable )
+ put_page_and_type(page);
+ else
+ put_page(page);
+
+ return 0;
+}
+
/*
* NB. Virtual address 'l2e' maps to a machine address within frame 'pfn'.
* Note also that this automatically deals correctly with linear p.t.'s.
@@ -1330,18 +1336,9 @@ static int put_page_from_l2e(l2_pgentry_t l2e, unsigned
long pfn,
return 1;
if ( l2e_get_flags(l2e) & _PAGE_PSE )
- {
- struct page_info *page = l2e_get_page(l2e);
- bool writeable = l2e_get_flags(l2e) & _PAGE_RW;
- unsigned int i;
-
- ASSERT(!(mfn_x(page_to_mfn(page)) &
- ((1UL << (L2_PAGETABLE_SHIFT - PAGE_SHIFT)) - 1)));
- for ( i = 0; i < (1u << PAGETABLE_ORDER); i++, page++ )
- put_data_page(page, writeable);
-
- return 0;
- }
+ return put_data_pages(l2e_get_page(l2e),
+ l2e_get_flags(l2e) & _PAGE_RW,
+ L2_PAGETABLE_SHIFT);
return put_pt_page(l2e_get_page(l2e), mfn_to_page(_mfn(pfn)), flags);
}
@@ -1353,18 +1350,9 @@ static int put_page_from_l3e(l3_pgentry_t l3e, unsigned
long pfn,
return 1;
if ( unlikely(l3e_get_flags(l3e) & _PAGE_PSE) )
- {
- unsigned long mfn = l3e_get_pfn(l3e);
- bool writeable = l3e_get_flags(l3e) & _PAGE_RW;
-
- ASSERT(!(flags & PTF_partial_set));
- ASSERT(!(mfn & ((1UL << (L3_PAGETABLE_SHIFT - PAGE_SHIFT)) - 1)));
- do {
- put_data_page(mfn_to_page(_mfn(mfn)), writeable);
- } while ( ++mfn & ((1UL << (L3_PAGETABLE_SHIFT - PAGE_SHIFT)) - 1) );
-
- return 0;
- }
+ return put_data_pages(l3e_get_page(l3e),
+ l3e_get_flags(l3e) & _PAGE_RW,
+ L3_PAGETABLE_SHIFT);
return put_pt_page(l3e_get_page(l3e), mfn_to_page(_mfn(pfn)), flags);
}
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |