|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v8 4/6] mm: introduce a helper to get the memory type of a page
Returns all the memory types applicable to a page.
This function is unimplemented for ARM.
Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
Changes since v7:
- Switch the parameter type to mfn_t.
Changes since v5:
- Return all types that apply to a page, since the types themselves
are flags that can be or'ed together.
---
Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>
Cc: Julien Grall <julien.grall@xxxxxxx>
Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Cc: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Cc: Jan Beulich <jbeulich@xxxxxxxx>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
Cc: Tim Deegan <tim@xxxxxxx>
Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
---
xen/arch/x86/mm.c | 42 ++++++++++++++++++++++++++++++++++++++++++
xen/include/xen/mm.h | 3 +++
2 files changed, 45 insertions(+)
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index baea2f5e63..d37eea53d1 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -430,6 +430,48 @@ int page_is_ram_type(unsigned long mfn, unsigned long
mem_type)
return 0;
}
+unsigned int page_get_ram_type(mfn_t mfn)
+{
+ uint64_t last = 0, maddr = mfn_to_maddr(mfn);
+ unsigned int i, type = 0;
+
+ for ( i = 0; i < e820.nr_map;
+ last = e820.map[i].addr + e820.map[i].size, i++ )
+ {
+ if ( (maddr + PAGE_SIZE) > last && maddr < e820.map[i].addr )
+ type |= RAM_TYPE_UNKNOWN;
+
+ if ( (maddr + PAGE_SIZE) <= e820.map[i].addr ||
+ maddr >= (e820.map[i].addr + e820.map[i].size) )
+ continue;
+
+ switch ( e820.map[i].type )
+ {
+ case E820_RAM:
+ type |= RAM_TYPE_CONVENTIONAL;
+ break;
+
+ case E820_RESERVED:
+ type |= RAM_TYPE_RESERVED;
+ break;
+
+ case E820_UNUSABLE:
+ type |= RAM_TYPE_UNUSABLE;
+ break;
+
+ case E820_ACPI:
+ case E820_NVS:
+ type |= RAM_TYPE_ACPI;
+ break;
+
+ default:
+ ASSERT_UNREACHABLE();
+ }
+ }
+
+ return type ?: RAM_TYPE_UNKNOWN;
+}
+
unsigned long domain_get_maximum_gpfn(struct domain *d)
{
if ( is_hvm_domain(d) )
diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h
index 24654e8e22..b3d46ab56b 100644
--- a/xen/include/xen/mm.h
+++ b/xen/include/xen/mm.h
@@ -595,8 +595,11 @@ int __must_check donate_page(struct domain *d, struct
page_info *page,
#define RAM_TYPE_RESERVED 0x00000002
#define RAM_TYPE_UNUSABLE 0x00000004
#define RAM_TYPE_ACPI 0x00000008
+#define RAM_TYPE_UNKNOWN 0x00000010
/* TRUE if the whole page at @mfn is of the requested RAM type(s) above. */
int page_is_ram_type(unsigned long mfn, unsigned long mem_type);
+/* Returns the page type(s). */
+unsigned int page_get_ram_type(mfn_t mfn);
/* Prepare/destroy a ring for a dom0 helper. Helper with talk
* with Xen on behalf of this domain. */
--
2.18.0
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |