[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 6/7] xen/riscv: page table handling
On Tue, 2024-08-13 at 12:31 +0200, Jan Beulich wrote: > > + * Sanity check of the entry > > + * mfn is not valid and we are not populating page table. This > > means > > How does this fit with ... > > > + * we either modify entry or remove an entry. > > + */ > > +static bool pt_check_entry(pte_t entry, mfn_t mfn, unsigned int > > flags) > > +{ > > + /* Sanity check when modifying an entry. */ > > + if ( (flags & PTE_VALID) && mfn_eq(mfn, INVALID_MFN) ) > > ... the MFN check here? And why is (valid,INVALID_MFN) an indication > of a modification? Because as mentioned here: ``` /* * If `mfn` equals `INVALID_MFN`, it indicates that the following page table * update operation might be related to either populating the table, * destroying a mapping, or modifying an existing mapping. */ static int pt_update(unsigned long virt, ``` And so if requested flags are PTE_VALID ( present ) and mfn=INVALID it will mean that we are going to modify an entry. > But then ... > > > + { > > + /* We don't allow modifying an invalid entry. */ > > + if ( !pte_is_valid(entry) ) > > + { > > + printk("Modifying invalid entry is not allowed.\n"); > > + return false; > > + } > > ... I also don't understand what this is about. IOW I'm afraid I'm > still confused about the purpose of this function as well as the > transitions you want to permit / reject. In the case if the caller call modify_xen_mappings() on a region that doesn't exist. > I wonder whether the > flags & PTE_VALID and pte_is_valid(entry) aren't in need of swapping. I am not sure that I understand what you mean. > > > +/* Update an entry at the level @target. */ > > +static int pt_update_entry(mfn_t root, unsigned long virt, > > + mfn_t mfn, unsigned int target, > > + unsigned int flags) > > +{ > > + int rc; > > + unsigned int level = HYP_PT_ROOT_LEVEL; > > + pte_t *table; > > + /* > > + * The intermediate page tables are read-only when the MFN is > > not valid > > + * and we are not populating page table. > > The way flags are handled in PTEs, how can page tables be read-only? This is not needed for everyone case. In case of entry removing an intermediate page table should be created in case when the user is trying to remove a mapping that doesn't exist. > > > + * This means we either modify permissions or remove an entry. > > From all I can determine we also get here when making brand new > entries. > What am I overlooking? Yes, but in this case an intermediate page tables should be read_only, so alloc_only will be true and it will be allowed to create new intermediate page table. > > + return rc; > > +} > > + > > +int map_pages_to_xen(unsigned long virt, > > + mfn_t mfn, > > + unsigned long nr_mfns, > > + unsigned int flags) > > +{ > > + /* > > + * Ensure that we have a valid MFN before proceeding. > > + * > > + * If the MFN is invalid, pt_update() might misinterpret the > > operation, > > + * treating it as either a population, a mapping destruction, > > + * or a mapping modification. > > + */ > > + ASSERT(!mfn_eq(mfn, INVALID_MFN)); > > But flags with PTE_VALID not set are fine to come into here? Probably not, I will double check again and if it is not okay, I will update the ASSERT.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |