[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH RFC 07/10] domain: map/unmap GADDR based shared guest areas
On 29.11.2022 09:40, Julien Grall wrote: > On 28/11/2022 10:01, Jan Beulich wrote: >> On 24.11.2022 22:29, Julien Grall wrote: >>> On 19/10/2022 09:43, Jan Beulich wrote: >>>> --- a/xen/common/domain.c >>>> +++ b/xen/common/domain.c >>>> @@ -1563,7 +1563,82 @@ int map_guest_area(struct vcpu *v, paddr >>>> struct guest_area *area, >>>> void (*populate)(void *dst, struct vcpu *v)) >>>> { >>>> - return -EOPNOTSUPP; >>>> + struct domain *currd = v->domain; >>>> + void *map = NULL; >>>> + struct page_info *pg = NULL; >>>> + int rc = 0; >>>> + >>>> + if ( gaddr ) >>> >>> 0 is technically a valid (guest) physical address on Arm. >> >> I guess it is everywhere; it certainly also is on x86. While perhaps a >> little unfortunate in ordering, the public header changes coming only >> in the following patches was the best way I could think of to split >> this work into reasonable size pieces. There the special meaning of 0 >> is clearly documented. And I don't really see it as a meaningful >> limitation to not allow guests to register such areas at address zero. > I would expect an OS to allocate the region using the generic physical > allocator. This allocator may decide that '0' is a valid address and > return it. > > So I think your approach could potentially complicate the OS > implementation. I think it would be better to use an all Fs value as > this cannot be valid for this hypercall (we require at least 4-byte > alignment). Valid point, yet my avoiding of an all-Fs value was specifically with compat callers in mind - the values would be different for these and native ones, which would make the check more clumsy (otherwise it could simply be "if ( ~gaddr )"). >>>> @@ -1573,6 +1648,22 @@ int map_guest_area(struct vcpu *v, paddr >>>> */ >>>> void unmap_guest_area(struct vcpu *v, struct guest_area *area) >>>> { >>>> + struct domain *d = v->domain; >>>> + void *map; >>>> + struct page_info *pg; >>> >>> AFAIU, the assumption is the vCPU should be paused here. >> >> Yes, as the comment ahead of the function (introduced by an earlier >> patch) says. > > Ah, I missed that. Thanks! > >> >>> Should we add an ASSERT()? >> >> I was going from unmap_vcpu_info(), which had the same requirement, >> while also only recording it by way of a comment. I certainly could >> add an ASSERT(), but besides this being questionable as to the rules >> set forth in ./CODING_STYLE I also view assertions of "paused" state >> as being of limited use - the entity in question may become unpaused >> on the clock cycle after the check was done. > > That's correct. However, that race you mention is unlikely to happen > *every* time. So there are a very high chance the ASSERT() will hit if > miscalled. > >> (But yes, such are no >> different from e.g. the fair number of spin_is_locked() checks we >> have scattered around, which don't really provide guarantees either.) > And that's fine to not provide the full guarantee. You are still > probably going to catch 95% (if not more) of the callers that forgot to > call it with the spin lock held. > > At least for me, those ASSERTs() were super helpful during development > in more than a few cases. Okay, I'll add one then, but in the earlier patch, matching the comment that's introduced there. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |