|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 7/8] pdx: introduce translation helpers for offset compression
Implement the helpers to translate from pfns or physical addresses into the
offset compressed index space. Add a further check in the PDX testing to
ensure conversion resulting from the added functions is bi-directional.
Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
---
tools/tests/pdx/test-pdx-offset.c | 10 +++++++++
xen/common/pdx.c | 10 +++++++++
xen/include/xen/pdx.h | 35 +++++++++++++++++++++++++------
3 files changed, 49 insertions(+), 6 deletions(-)
diff --git a/tools/tests/pdx/test-pdx-offset.c
b/tools/tests/pdx/test-pdx-offset.c
index 0a561f02d197..a3507c36deb7 100644
--- a/tools/tests/pdx/test-pdx-offset.c
+++ b/tools/tests/pdx/test-pdx-offset.c
@@ -293,6 +293,16 @@ int main(int argc, char **argv)
print_ranges(tests[i].ranges);
ret_code = EXIT_FAILURE;
}
+
+ if ( start != pdx_to_pfn(pfn_to_pdx(start)) ||
+ end - 1 != pdx_to_pfn(pfn_to_pdx(end - 1)) )
+ {
+ printf(
+ "PDX %s compression invalid, conversion of %#lx or %#lx is not
bidirectional\n",
+ use_slow ? "slow" : "fast", start, end - 1);
+ print_ranges(tests[i].ranges);
+ ret_code = EXIT_FAILURE;
+ }
}
}
}
diff --git a/xen/common/pdx.c b/xen/common/pdx.c
index f2cf60bbc3f8..feabdcded804 100644
--- a/xen/common/pdx.c
+++ b/xen/common/pdx.c
@@ -46,6 +46,8 @@ bool __mfn_valid(unsigned long mfn)
#ifdef CONFIG_PDX_MASK_COMPRESSION
invalid |= mfn & pfn_hole_mask;
+#elif defined(CONFIG_PDX_OFFSET_COMPRESSION)
+ invalid |= (mfn % pdx_offset) >= pdx_size;
#endif
if ( unlikely(evaluate_nospec(invalid)) )
@@ -314,6 +316,9 @@ void __init pfn_pdx_compression_reset(void)
unsigned long __ro_after_init pdx_offset = ~0UL;
unsigned long __ro_after_init pdx_size = ~0UL;
+paddr_t __ro_after_init pdx_paddr_offset = ~0UL;
+paddr_t __ro_after_init pdx_paddr_size = ~0UL;
+
static unsigned long __initdata top_pfn;
bool pdx_is_region_compressible(paddr_t base, unsigned long npages)
@@ -513,6 +518,9 @@ bool __init pfn_pdx_compression_setup(paddr_t base)
printk(XENLOG_INFO "PFN compression using offset %#lx size %#lx (%lu%%)\n",
pdx_offset, pdx_size, ((pdx_offset - pdx_size) * 100) / pdx_offset);
+ pdx_paddr_offset = (paddr_t)pdx_offset << PAGE_SHIFT;
+ pdx_paddr_size = (paddr_t)pdx_size << PAGE_SHIFT;
+
return true;
}
#endif /* __XEN__ */
@@ -520,7 +528,9 @@ bool __init pfn_pdx_compression_setup(paddr_t base)
void __init pfn_pdx_compression_reset(void)
{
pdx_size = ~0UL;
+ pdx_paddr_size = ~(paddr_t)0;
pdx_offset = ~0UL;
+ pdx_paddr_offset = ~(paddr_t)0;
nr = 0;
top_pfn = 0;
}
diff --git a/xen/include/xen/pdx.h b/xen/include/xen/pdx.h
index 88f446f4ddd9..5f9e5bc7ab62 100644
--- a/xen/include/xen/pdx.h
+++ b/xen/include/xen/pdx.h
@@ -217,14 +217,37 @@ static inline paddr_t directmapoff_to_maddr(unsigned long
offset)
extern unsigned long pdx_offset;
extern unsigned long pdx_size;
+extern paddr_t pdx_paddr_offset;
+extern paddr_t pdx_paddr_size;
-/* pdx<->pfn == identity */
-#define pdx_to_pfn(x) (x)
-#define pfn_to_pdx(x) (x)
+void pdx_region_offset(unsigned long base, unsigned long size);
+bool pfn_pdx_offset_setup(void);
-/* directmap is indexed by maddr */
-#define maddr_to_directmapoff(x) (x)
-#define directmapoff_to_maddr(x) (x)
+static inline unsigned long pdx_to_pfn(unsigned long pdx)
+{
+ OPTIMIZE_PDX((pdx % pdx_size) + ((pdx / pdx_size) * pdx_offset),
+ pdx);
+}
+
+static inline unsigned long pfn_to_pdx(unsigned long pfn)
+{
+ OPTIMIZE_PDX((pfn % pdx_offset) + ((pfn / pdx_offset) * pdx_size),
+ pfn);
+}
+
+static inline unsigned long maddr_to_directmapoff(paddr_t ma)
+{
+ OPTIMIZE_PDX((ma % pdx_paddr_offset) +
+ ((ma / pdx_paddr_offset) * pdx_paddr_size),
+ ma);
+}
+
+static inline paddr_t directmapoff_to_maddr(unsigned long off)
+{
+ OPTIMIZE_PDX((off % pdx_paddr_size) +
+ ((off / pdx_paddr_size) * pdx_paddr_offset),
+ off);
+}
#endif /* CONFIG_PDX_OFFSET_COMPRESSION */
--
2.49.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |