On Wed, Mar 27, 2019 at 03:21:02PM +0000, Julien Thierry wrote:
> 
> 
> On 27/03/2019 10:33, Dave Martin wrote:
> > On Wed, Mar 27, 2019 at 09:47:42AM +0000, Julien Thierry wrote:
> >> Hi Dave,
> >>
> >> On 19/03/2019 17:52, Dave Martin wrote:

[...]

> >>> +static unsigned long num_sve_regs(const struct kvm_vcpu *vcpu)
> >>> +{
> >>> + /* Only the first slice ever exists, for now */
> >>> + const unsigned int slices = 1;
> >>
> >> Nit: Might be worth introducing a macro/inline function for the number
> >> of slices supported. This way, the day we need to change that, we only
> >> need to look for that identifier.
> > 
> > ... Reasonable point, but I wanted to avoid inventing anything
> > prematurely, partly because sve_reg_to_region() will need work in order
> > to support multiple slices (though it's not rocket science).
> > 
> > I could introduce something like the following:
> > 
> > static unsigned int sve_num_slices(const struct kvm_vcpu *vcpu)
> > {
> >     unsigned int slice_size = KVM_REG_SIZE(KVM_REG_ARM64_SVE_ZREG(0, 0));
> >     unsigned int slices = DIV_ROUND_UP(vcpu->arch.sve_max_vl, slice_size);
> > 
> >     /*
> >      * For now, the SVE register ioctl access code won't work
> >      * properly with multiple register slices.  KVM should prevent
> >      * configuration of a vcpu with a maximum vector length large
> >      * enough to trigger this:
> >      */
> >     if (WARN_ON_ONCE(slices > 1))
> >             return 1;
> > 
> >     return slices;
> > }
> > 
> > This may be clearer, but felt a bit like overkill...
> > 
> > Thoughts?
> 
> Seems a bit overkill yes... I was more thinking of a define and the
> person in charge of adding the slice support would just need to look for
> references to that define to know (some of) the places that would need
> rework/review.
> 
> So, unless someone else thinks it's good to introduce it right now you
> can ignore that.

OK, how about the following?  This keeps things minimal, but should help
future maintainers know that something may need updating here in the
future. 

Cheers
---Dave


diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
index ea5219d..086ab05 100644
--- a/arch/arm64/kvm/guest.c
+++ b/arch/arm64/kvm/guest.c
@@ -289,6 +289,13 @@ static int set_sve_vls(struct kvm_vcpu *vcpu, const struct 
kvm_one_reg *reg)
 #define KVM_SVE_ZREG_SIZE KVM_REG_SIZE(KVM_REG_ARM64_SVE_ZREG(0, 0))
 #define KVM_SVE_PREG_SIZE KVM_REG_SIZE(KVM_REG_ARM64_SVE_PREG(0, 0))
 
+/*
+ * number of register slices required to cover each whole SVE register on vcpu
+ * NOTE: If you are tempted to modify this, you must also rework
+ * sve_reg_to_region() to match:
+ */
+#define vcpu_sve_slices(vcpu) 1
+
 /* Bounds of a single SVE register slice within vcpu->arch.sve_state */
 struct sve_state_reg_region {
        unsigned int koffset;   /* offset into sve_state in kernel memory */
@@ -505,7 +512,7 @@ static int get_timer_reg(struct kvm_vcpu *vcpu, const 
struct kvm_one_reg *reg)
 static unsigned long num_sve_regs(const struct kvm_vcpu *vcpu)
 {
        /* Only the first slice ever exists, for now */
-       const unsigned int slices = 1;
+       const unsigned int slices = vcpu_sve_slices(vcpu);
 
        if (!vcpu_has_sve(vcpu))
                return 0;
@@ -521,7 +528,7 @@ static int copy_sve_reg_indices(const struct kvm_vcpu *vcpu,
                                u64 __user *uindices)
 {
        /* Only the first slice ever exists, for now */
-       const unsigned int slices = 1;
+       const unsigned int slices = vcpu_sve_slices(vcpu);
        u64 reg;
        unsigned int i, n;
        int num_regs = 0;
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to