Commit 70ba8fae authored by Matthew Rosato's avatar Matthew Rosato Committed by Janosch Frank
Browse files

KVM: s390: pci: fix GAIT physical vs virtual pointers usage



The GAIT and all of its entries must be represented by physical
addresses as this structure is shared with underlying firmware.
We can keep a virtual address of the GAIT origin in order to
handle processing in the kernel, but when traversing the entries
we must again convert the physical AISB stored in that GAIT entry
into a virtual address in order to process it.

Note: this currently doesn't fix a real bug, since virtual addresses
are indentical to physical ones.

Reviewed-by: default avatarPierre Morel <pmorel@linux.ibm.com>
Acked-by: default avatarNico Boehr <nrb@linux.ibm.com>
Signed-off-by: default avatarMatthew Rosato <mjrosato@linux.ibm.com>
Reviewed-by: default avatarClaudio Imbrenda <imbrenda@linux.ibm.com>
Link: https://lore.kernel.org/r/20220907155952.87356-1-mjrosato@linux.ibm.com


Message-Id: <20220907155952.87356-1-mjrosato@linux.ibm.com>
Signed-off-by: default avatarJanosch Frank <frankja@linux.ibm.com>
parent b3cefd6b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -3324,7 +3324,7 @@ static void aen_host_forward(unsigned long si)
	if (gaite->count == 0)
		return;
	if (gaite->aisb != 0)
		set_bit_inv(gaite->aisbo, (unsigned long *)gaite->aisb);
		set_bit_inv(gaite->aisbo, phys_to_virt(gaite->aisb));

	kvm = kvm_s390_pci_si_to_kvm(aift, si);
	if (!kvm)
+1 −1
Original line number Diff line number Diff line
@@ -71,7 +71,7 @@ static int zpci_setup_aipb(u8 nisc)
		rc = -ENOMEM;
		goto free_sbv;
	}
	aift->gait = (struct zpci_gaite *)page_to_phys(page);
	aift->gait = (struct zpci_gaite *)page_to_virt(page);

	zpci_aipb->aipb.faisb = virt_to_phys(aift->sbv->vector);
	zpci_aipb->aipb.gait = virt_to_phys(aift->gait);