Skip to content

Commit

Permalink
KVM: arm64: vgic-its: Clear DTE when MAPD unmaps a device
Browse files Browse the repository at this point in the history
commit e964912 upstream.

vgic_its_save_device_tables will traverse its->device_list to
save DTE for each device. vgic_its_restore_device_tables will
traverse each entry of device table and check if it is valid.
Restore if valid.

But when MAPD unmaps a device, it does not invalidate the
corresponding DTE. In the scenario of continuous saves
and restores, there may be a situation where a device's DTE
is not saved but is restored. This is unreasonable and may
cause restore to fail. This patch clears the corresponding
DTE when MAPD unmaps a device.

Cc: [email protected]
Fixes: 57a9a11 ("KVM: arm64: vgic-its: Device table save/restore")
Co-developed-by: Shusen Li <[email protected]>
Signed-off-by: Shusen Li <[email protected]>
Signed-off-by: Kunkun Jiang <[email protected]>
[Jing: Update with entry write helper]
Signed-off-by: Jing Zhang <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Oliver Upton <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
Kunkun Jiang authored and gregkh committed Dec 9, 2024
1 parent 2a4ec24 commit 7484289
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions arch/arm64/kvm/vgic/vgic-its.c
Original file line number Diff line number Diff line change
Expand Up @@ -1215,9 +1215,11 @@ static int vgic_its_cmd_handle_mapd(struct kvm *kvm, struct vgic_its *its,
bool valid = its_cmd_get_validbit(its_cmd);
u8 num_eventid_bits = its_cmd_get_size(its_cmd);
gpa_t itt_addr = its_cmd_get_ittaddr(its_cmd);
int dte_esz = vgic_its_get_abi(its)->dte_esz;
struct its_device *device;
gpa_t gpa;

if (!vgic_its_check_id(its, its->baser_device_table, device_id, NULL))
if (!vgic_its_check_id(its, its->baser_device_table, device_id, &gpa))
return E_ITS_MAPD_DEVICE_OOR;

if (valid && num_eventid_bits > VITS_TYPER_IDBITS)
Expand All @@ -1238,7 +1240,7 @@ static int vgic_its_cmd_handle_mapd(struct kvm *kvm, struct vgic_its *its,
* is an error, so we are done in any case.
*/
if (!valid)
return 0;
return vgic_its_write_entry_lock(its, gpa, 0, dte_esz);

device = vgic_its_alloc_device(its, device_id, itt_addr,
num_eventid_bits);
Expand Down

0 comments on commit 7484289

Please sign in to comment.