KVM: s390: pci: fix GAIT physical vs virtual pointers usage
authorMatthew Rosato <mjrosato@linux.ibm.com>
Wed, 7 Sep 2022 15:59:52 +0000 (11:59 -0400)
committerJanosch Frank <frankja@linux.ibm.com>
Wed, 21 Sep 2022 14:18:38 +0000 (16:18 +0200)
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: Pierre Morel <pmorel@linux.ibm.com>
Acked-by: Nico Boehr <nrb@linux.ibm.com>
Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
Reviewed-by: Claudio 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: Janosch Frank <frankja@linux.ibm.com>
arch/s390/kvm/interrupt.c
arch/s390/kvm/pci.c

index b9c944b262c7955c3a7ce0d51fbf352867d065e0..ab569faf0df241a8bbc03a05e9aa28870c22b61c 100644 (file)
@@ -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)
index 3c12637ce08c0873c7aca7966f1e5b99c31f0b85..90aaba80696a47ef267daf2117833202b9a3788d 100644 (file)
@@ -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);