[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 05/18] xen/riscv: add root page table allocation
On 17.09.2025 23:55, Oleksii Kurochko wrote: > --- a/xen/arch/riscv/p2m.c > +++ b/xen/arch/riscv/p2m.c > @@ -3,6 +3,7 @@ > #include <xen/init.h> > #include <xen/lib.h> > #include <xen/macros.h> > +#include <xen/domain_page.h> > #include <xen/mm.h> > #include <xen/paging.h> > #include <xen/rwlock.h> > @@ -95,6 +96,70 @@ void __init gstage_mode_detect(void) > local_hfence_gvma_all(); > } > > +static void clear_and_clean_page(struct page_info *page, bool clean_dcache) > +{ > + clear_domain_page(page_to_mfn(page)); > + > + /* > + * If the IOMMU doesn't support coherent walks and the p2m tables are > + * shared between the CPU and IOMMU, it is necessary to clean the > + * d-cache. > + */ > + if ( clean_dcache ) > + clean_dcache_va_range(page, PAGE_SIZE); > +} > + > +unsigned long construct_hgatp(struct p2m_domain *p2m, uint16_t vmid) pointer-to-const? > +{ > + return MASK_INSR(mfn_x(page_to_mfn(p2m->root)), HGATP_PPN) | > + MASK_INSR(gstage_mode, HGATP_MODE_MASK) | > + MASK_INSR(vmid, HGATP_VMID_MASK); > +} > + > +static int p2m_alloc_root_table(struct p2m_domain *p2m) > +{ > + struct domain *d = p2m->domain; > + struct page_info *page; > + int rc; > + > + /* > + * Return back P2M_ROOT_PAGES to assure the root table memory is also > + * accounted against the P2M pool of the domain. > + */ > + if ( (rc = paging_ret_pages_to_domheap(d, P2M_ROOT_PAGES)) ) > + return rc; I read the "ret" in the name as "return" here. However, ... > + /* > + * As mentioned in the Priviliged Architecture Spec (version 20240411) > + * in Section 18.5.1, for the paged virtual-memory schemes (Sv32x4, > + * Sv39x4, Sv48x4, and Sv57x4), the root page table is 16 KiB and must > + * be aligned to a 16-KiB boundary. > + */ > + page = alloc_domheap_pages(d, P2M_ROOT_ORDER, MEMF_no_owner); > + if ( !page ) > + { > + /* > + * If allocation of root table pages fails, the pages acquired above > + * must be returned to the freelist to maintain proper freelist > + * balance. > + */ > + paging_ret_pages_to_freelist(d, P2M_ROOT_PAGES); ... "return" doesn't make sense here, so I wonder what the "ret" here means. > @@ -55,6 +76,37 @@ int paging_freelist_adjust(struct domain *d, unsigned long > pages, > return 0; > } > > +int paging_ret_pages_to_freelist(struct domain *d, unsigned int nr_pages) > +{ > + ASSERT(spin_is_locked(&d->arch.paging.lock)); > + > + for ( unsigned int i = 0; i < nr_pages; i++ ) > + { > + int rc = paging_ret_page_to_freelist(d); > + if ( rc ) Nit (style): Blank line between declaration(s) and statement(s) please. > + return rc; > + } > + > + return 0; > +} > + > +int paging_ret_pages_to_domheap(struct domain *d, unsigned int nr_pages) > +{ > + ASSERT(spin_is_locked(&d->arch.paging.lock)); > + > + if ( ACCESS_ONCE(d->arch.paging.total_pages) < nr_pages ) > + return false; > + > + for ( unsigned int i = 0; i < nr_pages; i++ ) > + { > + int rc = paging_ret_page_to_domheap(d); > + if ( rc ) Same here. Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |