On Mon, Oct 23, 2017 at 04:08:20PM +0200, Eric Auger wrote: > From: wanghaibin <wanghaibin.wang@xxxxxxxxxx> > > 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@xxxxxxxxxx> > Signed-off-by: Eric Auger <eric.auger@xxxxxxxxxx> Reviewed-by: Christoffer Dall <christoffer.dall@xxxxxxxxxx> > > --- > > need to CC'ed stable > > v2 -> v3: > - add comments > - vgic_its_restore_itt don't return +1 anymore > - reword the commit message > > v1 -> v2: > - if (ret > 0) ret = 0 > --- > 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 f51c1e1..d27a301 100644 > --- a/virt/kvm/arm/vgic/vgic-its.c > +++ b/virt/kvm/arm/vgic/vgic-its.c > @@ -1940,6 +1940,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); > @@ -1951,6 +1959,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; > } > > @@ -2107,10 +2119,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; > } > > /** > @@ -2140,8 +2149,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; > } > -- > 2.5.5 >