[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 |