vfio/ap: Pass in physical address of ind to ap_aqic()
authorNicolin Chen <nicolinc@nvidia.com>
Sat, 23 Jul 2022 02:02:49 +0000 (19:02 -0700)
committerAlex Williamson <alex.williamson@redhat.com>
Sat, 23 Jul 2022 13:29:10 +0000 (07:29 -0600)
The ap_aqic() is called by vfio_ap_irq_enable() where it passes in a
virt value that's casted from a physical address "h_nib". Inside the
ap_aqic(), it does virt_to_phys() again.

Since ap_aqic() needs a physical address, let's just pass in a pa of
ind directly. So change the "ind" to "pa_ind".

Reviewed-by: Harald Freudenberger <freude@linux.ibm.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Tested-by: Eric Farman <farman@linux.ibm.com>
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Link: https://lore.kernel.org/r/20220723020256.30081-4-nicolinc@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
arch/s390/include/asm/ap.h
drivers/s390/crypto/ap_queue.c
drivers/s390/crypto/vfio_ap_ops.c

index b515cfa62bd9b045807fb2b7c087f1c79c718801..f508f5025e3880f72a1440aa98bc7b6796e7d4de 100644 (file)
@@ -227,13 +227,13 @@ struct ap_qirq_ctrl {
  * ap_aqic(): Control interruption for a specific AP.
  * @qid: The AP queue number
  * @qirqctrl: struct ap_qirq_ctrl (64 bit value)
- * @ind: The notification indicator byte
+ * @pa_ind: Physical address of the notification indicator byte
  *
  * Returns AP queue status.
  */
 static inline struct ap_queue_status ap_aqic(ap_qid_t qid,
                                             struct ap_qirq_ctrl qirqctrl,
-                                            void *ind)
+                                            phys_addr_t pa_ind)
 {
        unsigned long reg0 = qid | (3UL << 24);  /* fc 3UL is AQIC */
        union {
@@ -241,7 +241,7 @@ static inline struct ap_queue_status ap_aqic(ap_qid_t qid,
                struct ap_qirq_ctrl qirqctrl;
                struct ap_queue_status status;
        } reg1;
-       unsigned long reg2 = virt_to_phys(ind);
+       unsigned long reg2 = pa_ind;
 
        reg1.qirqctrl = qirqctrl;
 
index c48b0db824e3e64786974e62de530fbfc17c0e14..a32457b4cbb8a9125f0dbcd29dda90a6d28c0437 100644 (file)
@@ -34,7 +34,7 @@ static int ap_queue_enable_irq(struct ap_queue *aq, void *ind)
 
        qirqctrl.ir = 1;
        qirqctrl.isc = AP_ISC;
-       status = ap_aqic(aq->qid, qirqctrl, ind);
+       status = ap_aqic(aq->qid, qirqctrl, virt_to_phys(ind));
        switch (status.response_code) {
        case AP_RESPONSE_NORMAL:
        case AP_RESPONSE_OTHERWISE_CHANGED:
index bb1a1677c5c230c96564844bee1873520d886aac..5781059d3ed2b811166ec179c25fcb5d8c75ede9 100644 (file)
@@ -154,7 +154,7 @@ static struct ap_queue_status vfio_ap_irq_disable(struct vfio_ap_queue *q)
        int retries = 5;
 
        do {
-               status = ap_aqic(q->apqn, aqic_gisa, NULL);
+               status = ap_aqic(q->apqn, aqic_gisa, 0);
                switch (status.response_code) {
                case AP_RESPONSE_OTHERWISE_CHANGED:
                case AP_RESPONSE_NORMAL:
@@ -245,7 +245,8 @@ static struct ap_queue_status vfio_ap_irq_enable(struct vfio_ap_queue *q,
        struct kvm_s390_gisa *gisa;
        int nisc;
        struct kvm *kvm;
-       unsigned long h_nib, g_pfn, h_pfn;
+       unsigned long g_pfn, h_pfn;
+       phys_addr_t h_nib;
        int ret;
 
        /* Verify that the notification indicator byte address is valid */
@@ -290,7 +291,7 @@ static struct ap_queue_status vfio_ap_irq_enable(struct vfio_ap_queue *q,
        aqic_gisa.ir = 1;
        aqic_gisa.gisa = (uint64_t)gisa >> 4;
 
-       status = ap_aqic(q->apqn, aqic_gisa, (void *)h_nib);
+       status = ap_aqic(q->apqn, aqic_gisa, h_nib);
        switch (status.response_code) {
        case AP_RESPONSE_NORMAL:
                /* See if we did clear older IRQ configuration */