[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 04/17] xen/riscv: construct the P2M pages pool for guests
On 10.06.2025 15:05, Oleksii Kurochko wrote: > @@ -113,3 +117,58 @@ int p2m_init(struct domain *d) > > return 0; > } > + > +/* > + * Set the pool of pages to the required number of pages. > + * Returns 0 for success, non-zero for failure. > + * Call with d->arch.paging.lock held. > + */ > +int p2m_set_allocation(struct domain *d, unsigned long pages, bool > *preempted) > +{ > + struct page_info *pg; > + > + ASSERT(spin_is_locked(&d->arch.paging.lock)); > + > + for ( ; ; ) > + { > + if ( d->arch.paging.p2m_total_pages < pages ) > + { > + /* Need to allocate more memory from domheap */ > + pg = alloc_domheap_page(d, MEMF_no_owner); > + if ( pg == NULL ) > + { > + printk(XENLOG_ERR "Failed to allocate P2M pages.\n"); > + return -ENOMEM; > + } > + ACCESS_ONCE(d->arch.paging.p2m_total_pages)++; > + page_list_add_tail(pg, &d->arch.paging.p2m_freelist); > + } > + else if ( d->arch.paging.p2m_total_pages > pages ) > + { > + /* Need to return memory to domheap */ > + pg = page_list_remove_head(&d->arch.paging.p2m_freelist); > + if( pg ) > + { > + ACCESS_ONCE(d->arch.paging.p2m_total_pages)--; > + free_domheap_page(pg); > + } > + else > + { > + printk(XENLOG_ERR > + "Failed to free P2M pages, P2M freelist is empty.\n"); > + return -ENOMEM; > + } > + } > + else > + break; > + > + /* Check to see if we need to yield and try again */ > + if ( preempted && general_preempt_check() ) > + { > + *preempted = true; > + return -ERESTART; > + } > + } > + > + return 0; > +} Btw, with the order-2 requirement for the root page table, you may want to consider an alternative approach: Here you could allocate some order-2 pages (possibly up to as many as a domain might need, which right now would be exactly one), put them on a separate list, and consume the root table(s) from there. If you run out of pages on the order-0 list, you could shatter a page from the order-2 one (as long as that's still non- empty). The difficulty would be with freeing, where a previously shattered order-2 page would be nice to re-combine once all of its constituents are free again. The main benefit would be avoiding the back and forth in patch 6. Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |