[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 06/18] arm/altp2m: Add a(p2m) table flushing routines.
Hello Julien, On 07/04/2016 05:55 PM, Julien Grall wrote: > Hello Sergej, > > On 04/07/16 12:45, Sergej Proskurin wrote: >> The current implementation differentiates between flushing and >> destroying altp2m views. This commit adds the functions >> p2m_flush_altp2m, and p2m_flush_table, which allow to flush all or >> individual altp2m views without destroying the entire table. In this >> way, altp2m views can be reused at a later point in time. >> >> In addition, the implementation clears all altp2m entries during the >> process of flushing. The same applies to hostp2m entries, when it is >> destroyed. In this way, further domain and p2m allocations will not >> unintentionally reuse old p2m mappings. >> >> Signed-off-by: Sergej Proskurin <proskurin@xxxxxxxxxxxxx> >> --- >> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx> >> Cc: Julien Grall <julien.grall@xxxxxxx> >> --- >> xen/arch/arm/p2m.c | 67 >> +++++++++++++++++++++++++++++++++++++++++++++++ >> xen/include/asm-arm/p2m.h | 15 ++++++++--- >> 2 files changed, 78 insertions(+), 4 deletions(-) >> >> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c >> index 4a745fd..ae789e6 100644 >> --- a/xen/arch/arm/p2m.c >> +++ b/xen/arch/arm/p2m.c >> @@ -2110,6 +2110,73 @@ int p2m_init_altp2m_by_id(struct domain *d, >> unsigned int idx) >> return rc; >> } >> >> +/* Reset this p2m table to be empty */ >> +static void p2m_flush_table(struct p2m_domain *p2m) >> +{ >> + struct page_info *top, *pg; >> + mfn_t mfn; >> + unsigned int i; >> + >> + /* Check whether the p2m table has already been flushed before. */ >> + if ( p2m->root == NULL) > > This check looks invalid. p2m->root is never reset to NULL by > p2m_flush_table, so you will always flush. > All right. Here, I just wanted to be sure that we don't flush an invalidpage. I will remove this check. >> + return; >> + >> + spin_lock(&p2m->lock); >> + >> + /* >> + * "Host" p2m tables can have shared entries &c that need a bit >> more care >> + * when discarding them > > I don't understand this comment. Can you explain it? > This is a lost comment. However, there are slight differences in freeing a hostp2m as opposed to an altp2m (see the additional freeing of VMIDs in hostp2ms). Since, we agreed to using unique VMIDs for altp2m views as well, I will try to merge the different flush/free functions.Thank you. >> + */ >> + ASSERT(!p2m_is_hostp2m(p2m)); >> + >> + /* Zap the top level of the trie */ >> + top = p2m->root; >> + >> + /* Clear all concatenated first level pages */ >> + for ( i = 0; i < P2M_ROOT_PAGES; i++ ) >> + { >> + mfn = _mfn(page_to_mfn(top + i)); >> + clear_domain_page(mfn); >> + } >> + >> + /* Free the rest of the trie pages back to the paging pool */ >> + while ( (pg = page_list_remove_head(&p2m->pages)) ) >> + if ( pg != top ) >> + { >> + /* >> + * Before freeing the individual pages, we clear them to >> prevent >> + * reusing old table entries in future p2m allocations. >> + */ >> + mfn = _mfn(page_to_mfn(pg)); >> + clear_domain_page(mfn); >> + free_domheap_page(pg); >> + } >> + >> + page_list_add(top, &p2m->pages); > > This code is very similar to p2m_free_one. Can we share some code? > Yes, I will merge both functions and extract parts that differ in a separate function. The same applies to p2m_teardown_hostp2m. Thank you. >> + >> + /* Invalidate VTTBR */ >> + p2m->vttbr.vttbr = 0; >> + p2m->vttbr.vttbr_baddr = INVALID_MFN; >> + >> + spin_unlock(&p2m->lock); >> +} > > Regards, > Thank you. Cheers, Sergej _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |