|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/paging: Rename paging_mark_pfn_dirty() and use pfn_t
commit eaddbb122e918d0ee61b9572398833661ea93670
Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Wed Dec 14 14:20:12 2016 +0000
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Thu Dec 15 15:55:48 2016 +0000
x86/paging: Rename paging_mark_pfn_dirty() and use pfn_t
paging_mark_gfn_dirty() actually takes a pfn, even by paramter name. Rename
the function and alter the type to pfn_t to match.
Push pfn_t into the LOGDIRTY_IDX() macros, and clean up a couple of local
variable types in paging_mark_pfn_dirty().
Leave an explicit comment in vmx_vcpu_flush_pml_buffer() when we intentally
perform a straight conversion from gfn to pfn.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
Acked-by: Tim Deegan <tim@xxxxxxx>
---
xen/arch/x86/hvm/vmx/vmcs.c | 4 +++-
xen/arch/x86/mm/paging.c | 26 +++++++++++++-------------
xen/include/asm-x86/paging.h | 10 +++++-----
3 files changed, 21 insertions(+), 19 deletions(-)
diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c
index 0995496..5db5fea 100644
--- a/xen/arch/x86/hvm/vmx/vmcs.c
+++ b/xen/arch/x86/hvm/vmx/vmcs.c
@@ -1484,7 +1484,9 @@ void vmx_vcpu_flush_pml_buffer(struct vcpu *v)
* is extremely difficult to debug.
*/
p2m_change_type_one(v->domain, gfn, p2m_ram_logdirty, p2m_ram_rw);
- paging_mark_gfn_dirty(v->domain, gfn);
+
+ /* HVM guest: pfn == gfn */
+ paging_mark_pfn_dirty(v->domain, _pfn(gfn));
}
unmap_domain_page(pml_buf);
diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c
index 3a66098..d964ed5 100644
--- a/xen/arch/x86/mm/paging.c
+++ b/xen/arch/x86/mm/paging.c
@@ -265,25 +265,25 @@ static int paging_log_dirty_disable(struct domain *d,
bool_t resuming)
}
/* Mark a page as dirty, with taking guest pfn as parameter */
-void paging_mark_gfn_dirty(struct domain *d, unsigned long pfn)
+void paging_mark_pfn_dirty(struct domain *d, pfn_t pfn)
{
- int changed;
+ bool changed;
mfn_t mfn, *l4, *l3, *l2;
unsigned long *l1;
- int i1, i2, i3, i4;
+ unsigned int i1, i2, i3, i4;
if ( !paging_mode_log_dirty(d) )
return;
/* Shared MFNs should NEVER be marked dirty */
- BUG_ON(SHARED_M2P(pfn));
+ BUG_ON(SHARED_M2P(pfn_x(pfn)));
/*
* Values with the MSB set denote MFNs that aren't really part of the
* domain's pseudo-physical memory map (e.g., the shared info frame).
* Nothing to do here...
*/
- if ( unlikely(!VALID_M2P(pfn)) )
+ if ( unlikely(!VALID_M2P(pfn_x(pfn))) )
return;
i1 = L1_LOGDIRTY_IDX(pfn);
@@ -331,8 +331,8 @@ void paging_mark_gfn_dirty(struct domain *d, unsigned long
pfn)
if ( changed )
{
PAGING_DEBUG(LOGDIRTY,
- "marked mfn %" PRI_mfn " (pfn=%lx), dom %d\n",
- mfn_x(mfn), pfn, d->domain_id);
+ "d%d: marked mfn %" PRI_mfn " (pfn %" PRI_pfn ")\n",
+ d->domain_id, mfn_x(mfn), pfn_x(pfn));
d->arch.paging.log_dirty.dirty_count++;
}
@@ -345,23 +345,23 @@ out:
/* Mark a page as dirty */
void paging_mark_dirty(struct domain *d, mfn_t gmfn)
{
- unsigned long pfn;
+ pfn_t pfn;
if ( !paging_mode_log_dirty(d) || !mfn_valid(gmfn) ||
page_get_owner(mfn_to_page(gmfn)) != d )
return;
/* We /really/ mean PFN here, even for non-translated guests. */
- pfn = get_gpfn_from_mfn(mfn_x(gmfn));
+ pfn = _pfn(get_gpfn_from_mfn(mfn_x(gmfn)));
- paging_mark_gfn_dirty(d, pfn);
+ paging_mark_pfn_dirty(d, pfn);
}
/* Is this guest page dirty? */
int paging_mfn_is_dirty(struct domain *d, mfn_t gmfn)
{
- unsigned long pfn;
+ pfn_t pfn;
mfn_t mfn, *l4, *l3, *l2;
unsigned long *l1;
int rv;
@@ -370,9 +370,9 @@ int paging_mfn_is_dirty(struct domain *d, mfn_t gmfn)
ASSERT(paging_mode_log_dirty(d));
/* We /really/ mean PFN here, even for non-translated guests. */
- pfn = get_gpfn_from_mfn(mfn_x(gmfn));
+ pfn = _pfn(get_gpfn_from_mfn(mfn_x(gmfn)));
/* Shared pages are always read-only; invalid pages can't be dirty. */
- if ( unlikely(SHARED_M2P(pfn) || !VALID_M2P(pfn)) )
+ if ( unlikely(SHARED_M2P(pfn_x(pfn)) || !VALID_M2P(pfn_x(pfn))) )
return 0;
mfn = d->arch.paging.log_dirty.top;
diff --git a/xen/include/asm-x86/paging.h b/xen/include/asm-x86/paging.h
index 63e3867..cec6bfd 100644
--- a/xen/include/asm-x86/paging.h
+++ b/xen/include/asm-x86/paging.h
@@ -159,7 +159,7 @@ void paging_log_dirty_init(struct domain *d,
/* mark a page as dirty */
void paging_mark_dirty(struct domain *d, mfn_t gmfn);
/* mark a page as dirty with taking guest pfn as parameter */
-void paging_mark_gfn_dirty(struct domain *d, unsigned long pfn);
+void paging_mark_pfn_dirty(struct domain *d, pfn_t pfn);
/* is this guest page dirty?
* This is called from inside paging code, with the paging lock held. */
@@ -175,12 +175,12 @@ int paging_mfn_is_dirty(struct domain *d, mfn_t gmfn);
* TODO2: Abstract out the radix-tree mechanics?
*/
#define LOGDIRTY_NODE_ENTRIES (1 << PAGETABLE_ORDER)
-#define L1_LOGDIRTY_IDX(pfn) ((pfn) & ((1 << (PAGE_SHIFT+3)) - 1))
-#define L2_LOGDIRTY_IDX(pfn) (((pfn) >> (PAGE_SHIFT+3)) & \
+#define L1_LOGDIRTY_IDX(pfn) (pfn_x(pfn) & ((1 << (PAGE_SHIFT + 3)) - 1))
+#define L2_LOGDIRTY_IDX(pfn) ((pfn_x(pfn) >> (PAGE_SHIFT + 3)) & \
(LOGDIRTY_NODE_ENTRIES-1))
-#define L3_LOGDIRTY_IDX(pfn) (((pfn) >> (PAGE_SHIFT+3+PAGETABLE_ORDER)) & \
+#define L3_LOGDIRTY_IDX(pfn) ((pfn_x(pfn) >> (PAGE_SHIFT + 3 +
PAGETABLE_ORDER)) & \
(LOGDIRTY_NODE_ENTRIES-1))
-#define L4_LOGDIRTY_IDX(pfn) (((pfn) >> (PAGE_SHIFT+3+PAGETABLE_ORDER*2)) & \
+#define L4_LOGDIRTY_IDX(pfn) ((pfn_x(pfn) >> (PAGE_SHIFT + 3 + PAGETABLE_ORDER
* 2)) & \
(LOGDIRTY_NODE_ENTRIES-1))
/* VRAM dirty tracking support */
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |