[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH for-4.19? v6 6/9] xen: Make the maximum number of altp2m views configurable for x86
On 19.06.2024 17:46, Petr Beneš wrote: > On Thu, Jun 13, 2024 at 2:03 PM Jan Beulich <jbeulich@xxxxxxxx> wrote: >>> @@ -510,13 +526,13 @@ int p2m_change_altp2m_gfn(struct domain *d, unsigned >>> int idx, >>> mfn_t mfn; >>> int rc = -EINVAL; >>> >>> - if ( idx >= min(ARRAY_SIZE(d->arch.altp2m_p2m), MAX_EPTP) || >>> + if ( idx >= d->nr_altp2m || >>> d->arch.altp2m_eptp[array_index_nospec(idx, MAX_EPTP)] == >> >> This ends up being suspicious: The range check is against a value different >> from what is passed to array_index_nospec(). The two weren't the same >> before either, but there the range check was more strict (which now isn't >> visible anymore, even though I think it would still be true). Imo this >> wants a comment, or an assertion effectively taking the place of a comment. > >> Since they're all "is this slot populated" checks, maybe we want >> an is_altp2m_eptp_valid() helper? > > Let me see if I understand correctly. You're suggesting the condition > should be replaced with something like this? (Also, I would suggest > altp2m_is_eptp_valid() name, since it's consistent e.g. with > p2m_is_altp2m().) > > static inline bool altp2m_is_eptp_valid(const struct domain *d, > unsigned int idx) > { > /* > * EPTP index is correlated with altp2m index and should not exceed > * d->nr_altp2m. > */ > assert(idx < d->nr_altp2m); > > return idx < MAX_EPTP && > d->arch.altp2m_eptp[array_index_nospec(idx, MAX_EPTP)] != > mfn_x(INVALID_MFN); > } Not exactly. You may not assert on idx. The assertion, if any, wants to check d->nr_altp2m against MAX_EPTP. > Note that in the codebase there are also very similar checks, but > again without array_index_nospec. For instance, in the > p2m_altp2m_propagate_change() function (which is called fairly > frequently): > > int p2m_altp2m_propagate_change(struct domain *d, gfn_t gfn, > mfn_t mfn, unsigned int page_order, > p2m_type_t p2mt, p2m_access_t p2ma) > { > struct p2m_domain *p2m; > unsigned int i; > unsigned int reset_count = 0; > unsigned int last_reset_idx = ~0; > int ret = 0; > > if ( !altp2m_active(d) ) > return 0; > > altp2m_list_lock(d); > > for ( i = 0; i < d->nr_altp2m; i++ ) > { > p2m_type_t t; > p2m_access_t a; > > // XXX this could be replaced with altp2m_is_eptp_valid(), but > based on previous review remarks, > // it would introduce unnecessary perf. hit. So, should these > occurrences left unchanged? > if ( d->arch.altp2m_eptp[i] == mfn_x(INVALID_MFN) ) > continue; > > ... > > There are more instances of this. Which re-opens again the issue from > previous conversation: should I introduce a function which will be > used in some cases (where _nospec is used) and not used elsewhere? You're again comparing cases where we control the index (in the loop) with cases where we don't (hypercall inputs). Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |