[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 08/12] viridian: add ExProcessorMasks variants of the flush hypercalls
On 20.11.2020 10:48, Paul Durrant wrote: > From: Paul Durrant <pdurrant@xxxxxxxxxx> > > The Microsoft Hypervisor TLFS specifies variants of the already implemented > HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE/LIST hypercalls that take a 'Virtual > Processor Set' as an argument rather than a simple 64-bit mask. > > This patch adds a new hvcall_flush_ex() function to implement these > (HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE/LIST_EX) hypercalls. This makes use of > new helper functions, hv_vpset_nr_banks() and hv_vpset_to_vpmask(), to > determine the size of the Virtual Processor Set (so it can be copied from > guest memory) and parse it into hypercall_vpmask (respectively). > > NOTE: A guest should not yet issue these hypercalls as 'ExProcessorMasks' > support needs to be advertised via CPUID. This will be done in a > subsequent patch. > > Signed-off-by: Paul Durrant <pdurrant@xxxxxxxxxx> Just a couple of cosmetic remarks, apart from them this looks good to me, albeit some of the size calculations are quite, well, involved. I guess like with most parts if this series, in the end Wei will need to give his ack. > --- a/xen/arch/x86/hvm/viridian/viridian.c > +++ b/xen/arch/x86/hvm/viridian/viridian.c > @@ -576,6 +576,70 @@ static unsigned int vpmask_nr(const struct > hypercall_vpmask *vpmask) > return bitmap_weight(vpmask->mask, HVM_MAX_VCPUS); > } > > +#define HV_VPSET_BANK_SIZE \ > + sizeof_field(struct hv_vpset, bank_contents[0]) > + > +#define HV_VPSET_SIZE(banks) \ > + (sizeof(struct hv_vpset) + (banks * HV_VPSET_BANK_SIZE)) Personally I think this would be better done using offsetof(struct hv_vpset, bank_contents), but you're the maintainer. However, "banks" wants parenthesizing, just in case. > +#define HV_VPSET_MAX_BANKS \ > + (sizeof_field(struct hv_vpset, valid_bank_mask) * 8) > + > +struct hypercall_vpset { > + union { > + struct hv_vpset set; > + uint8_t pad[HV_VPSET_SIZE(HV_VPSET_MAX_BANKS)]; > + }; > +}; A struct with just a union as member could be expressed as a simple union - any reason you prefer the slightly more involved variant? > +static DEFINE_PER_CPU(struct hypercall_vpset, hypercall_vpset); > + > +static unsigned int hv_vpset_nr_banks(struct hv_vpset *vpset) > +{ > + return hweight64(vpset->valid_bank_mask); > +} > + > +static uint16_t hv_vpset_to_vpmask(struct hv_vpset *set, const? > @@ -656,6 +720,78 @@ static int hvcall_flush(union hypercall_input *input, > return 0; > } > > +static int hvcall_flush_ex(union hypercall_input *input, const again? > + union hypercall_output *output, > + unsigned long input_params_gpa, > + unsigned long output_params_gpa) Mainly for cosmetic reasons and to be in sync with hvm_copy_from_guest_phys()'s respective parameter, perhaps both would better be paddr_t? Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |