Message ID | 20171109021843.zj2y4erg6qqxebu6@xps13.dannf |
---|---|
State | New |
Headers | show |
Series | [SRU,Artful] KVM: arm/arm64: vgic-its: Fix return value for device table restore | expand |
Patch has been sent duplicated to the mailing list, considering only the second submission (https://lists.ubuntu.com/archives/kernel-team/2017-November/088120.html). Kleber On 11/09/17 03:18, dann frazier wrote: > From: wanghaibin <wanghaibin.wang@huawei.com> > > BugLink: https://bugs.launchpad.net/bugs/1710019 > > If ITT only contains invalid entries, vgic_its_restore_itt > returns 1 and this is considered as an an error in > vgic_its_restore_dte. > > Also in case the device table only contains invalid entries, > the table restore fails and this is not correct. > > This patch fixes those 2 issues: > - vgic_its_restore_itt now returns <= 0 values. If all > ITEs are invalid, this is considered as successful. > - vgic_its_restore_device_tables also returns <= 0 values. > > We also simplify the returned value computation in > handle_l1_dte. > > Signed-off-by: wanghaibin <wanghaibin.wang@huawei.com> > Signed-off-by: Eric Auger <eric.auger@redhat.com> > Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org> > Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org> > (cherry picked from commit b92382620e33c9f1bcbcd7c169262b9bf0525871) > Signed-off-by: dann frazier <dann.frazier@canonical.com> > --- > virt/kvm/arm/vgic/vgic-its.c | 20 +++++++++++++++----- > 1 file changed, 15 insertions(+), 5 deletions(-) > > diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c > index aa6b68db80b4..dedf84b858fb 100644 > --- a/virt/kvm/arm/vgic/vgic-its.c > +++ b/virt/kvm/arm/vgic/vgic-its.c > @@ -1942,6 +1942,14 @@ static int vgic_its_save_itt(struct vgic_its *its, struct its_device *device) > return 0; > } > > +/** > + * vgic_its_restore_itt - restore the ITT of a device > + * > + * @its: its handle > + * @dev: device handle > + * > + * Return 0 on success, < 0 on error > + */ > static int vgic_its_restore_itt(struct vgic_its *its, struct its_device *dev) > { > const struct vgic_its_abi *abi = vgic_its_get_abi(its); > @@ -1953,6 +1961,10 @@ static int vgic_its_restore_itt(struct vgic_its *its, struct its_device *dev) > ret = scan_its_table(its, base, max_size, ite_esz, 0, > vgic_its_restore_ite, dev); > > + /* scan_its_table returns +1 if all ITEs are invalid */ > + if (ret > 0) > + ret = 0; > + > return ret; > } > > @@ -2109,10 +2121,7 @@ static int handle_l1_dte(struct vgic_its *its, u32 id, void *addr, > ret = scan_its_table(its, gpa, SZ_64K, dte_esz, > l2_start_id, vgic_its_restore_dte, NULL); > > - if (ret <= 0) > - return ret; > - > - return 1; > + return ret; > } > > /** > @@ -2142,8 +2151,9 @@ static int vgic_its_restore_device_tables(struct vgic_its *its) > vgic_its_restore_dte, NULL); > } > > + /* scan_its_table returns +1 if all entries are invalid */ > if (ret > 0) > - ret = -EINVAL; > + ret = 0; > > return ret; > } >
diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c index aa6b68db80b4..dedf84b858fb 100644 --- a/virt/kvm/arm/vgic/vgic-its.c +++ b/virt/kvm/arm/vgic/vgic-its.c @@ -1942,6 +1942,14 @@ static int vgic_its_save_itt(struct vgic_its *its, struct its_device *device) return 0; } +/** + * vgic_its_restore_itt - restore the ITT of a device + * + * @its: its handle + * @dev: device handle + * + * Return 0 on success, < 0 on error + */ static int vgic_its_restore_itt(struct vgic_its *its, struct its_device *dev) { const struct vgic_its_abi *abi = vgic_its_get_abi(its); @@ -1953,6 +1961,10 @@ static int vgic_its_restore_itt(struct vgic_its *its, struct its_device *dev) ret = scan_its_table(its, base, max_size, ite_esz, 0, vgic_its_restore_ite, dev); + /* scan_its_table returns +1 if all ITEs are invalid */ + if (ret > 0) + ret = 0; + return ret; } @@ -2109,10 +2121,7 @@ static int handle_l1_dte(struct vgic_its *its, u32 id, void *addr, ret = scan_its_table(its, gpa, SZ_64K, dte_esz, l2_start_id, vgic_its_restore_dte, NULL); - if (ret <= 0) - return ret; - - return 1; + return ret; } /** @@ -2142,8 +2151,9 @@ static int vgic_its_restore_device_tables(struct vgic_its *its) vgic_its_restore_dte, NULL); } + /* scan_its_table returns +1 if all entries are invalid */ if (ret > 0) - ret = -EINVAL; + ret = 0; return ret; }