]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: s390: pci: Fix missing error codes and memory unaccounting
authorFarhan Ali <alifm@linux.ibm.com>
Thu, 23 Jul 2026 22:14:06 +0000 (15:14 -0700)
committerChristian Borntraeger <borntraeger@linux.ibm.com>
Fri, 24 Jul 2026 09:26:53 +0000 (11:26 +0200)
In kvm_s390_pci_aif_enable() two error paths failed to set an error code,
causing the function to return 0 on failure. It also failed to rollback
memory accounting on failure. Fix both by propagating an error code on
failure and calling unaccount_mem() in the cleanup path.

Fixes: 3c5a1b6f0a18 ("KVM: s390: pci: provide routines for enabling/disabling interrupt forwarding")
Cc: stable@vger.kernel.org
Reviewed-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
Signed-off-by: Farhan Ali <alifm@linux.ibm.com>
Tested-by: Matthew Rosato <mjrosato@linux.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
arch/s390/kvm/pci.c

index 0741aed442bc15a793534bca961e4913fa285a04..36eb30953bb59a0a2d34668d3f7dca5b93e4a758 100644 (file)
@@ -300,14 +300,17 @@ static int kvm_s390_pci_aif_enable(struct zpci_dev *zdev, struct zpci_fib *fib,
        }
 
        /* Account for pinned pages, roll back on failure */
-       if (account_mem(zdev->kzdev, pcount))
+       rc = account_mem(zdev->kzdev, pcount);
+       if (rc)
                goto unpin2;
 
        /* AISB must be allocated before we can fill in GAITE */
        mutex_lock(&aift->aift_lock);
        bit = airq_iv_alloc_bit(aift->sbv);
-       if (bit == -1UL)
+       if (bit == -1UL) {
+               rc = -ENOMEM;
                goto unlock;
+       }
        zdev->aisb = bit; /* store the summary bit number */
        zdev->aibv = airq_iv_create(msi_vecs, AIRQ_IV_DATA |
                                    AIRQ_IV_BITLOCK |
@@ -351,6 +354,8 @@ static int kvm_s390_pci_aif_enable(struct zpci_dev *zdev, struct zpci_fib *fib,
        return rc;
 
 unlock:
+       if (pcount > 0)
+               unaccount_mem(zdev->kzdev, pcount);
        mutex_unlock(&aift->aift_lock);
 unpin2:
        if (fib->fmt0.sum == 1)