The mentioned commit from 5.7 does not simply apply to focal master-
next:

cherry-pick says:

Auto-merging arch/s390/pci/pci.c
CONFLICT (content): Merge conflict in arch/s390/pci/pci.c
Auto-merging arch/s390/include/asm/pci.h
warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your merge.renamelimit variable to at least 2342 
and retry the command.
error: could not apply 969ae01bab2f... s390/pci: Fix zpci_alloc_domain() over 
allocation
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

with status:

On branch master-next
Your branch is ahead of 'origin/master-next' by 2 commits.
  (use "git push" to publish your local commits)

You are currently cherry-picking commit 969ae01bab2f.
  (fix conflicts and run "git cherry-pick --continue")
  (use "git cherry-pick --skip" to skip this patch)
  (use "git cherry-pick --abort" to cancel the cherry-pick operation)

Changes to be committed:
        modified:   arch/s390/include/asm/pci.h

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   arch/s390/pci/pci.c

and the git diff is:

diff --cc arch/s390/pci/pci.c
index 6105b1b6e49b,2b90a90aa81d..000000000000
--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@@ -39,11 -40,12 +39,12 @@@
  static LIST_HEAD(zpci_list);
  static DEFINE_SPINLOCK(zpci_list_lock);
  
- static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES);
+ static DECLARE_BITMAP(zpci_domain, ZPCI_DOMAIN_BITMAP_SIZE);
  static DEFINE_SPINLOCK(zpci_domain_lock);
+ static unsigned int zpci_num_domains_allocated;
  
  #define ZPCI_IOMAP_ENTRIES                                            \
 -      min(((unsigned long) ZPCI_NR_DEVICES * PCI_STD_NUM_BARS / 2),   \
 +      min(((unsigned long) ZPCI_NR_DEVICES * PCI_BAR_COUNT / 2),      \
            ZPCI_IOMAP_MAX_ENTRIES)
  
  static DEFINE_SPINLOCK(zpci_iomap_lock);
@@@ -606,59 -608,22 +607,63 @@@ void pcibios_disable_device(struct pci_
        zpci_debug_exit_device(zdev);
  }
  
 +#ifdef CONFIG_HIBERNATE_CALLBACKS
 +static int zpci_restore(struct device *dev)
 +{
 +      struct pci_dev *pdev = to_pci_dev(dev);
 +      struct zpci_dev *zdev = to_zpci(pdev);
 +      int ret = 0;
 +
 +      if (zdev->state != ZPCI_FN_STATE_ONLINE)
 +              goto out;
 +
 +      ret = clp_enable_fh(zdev, ZPCI_NR_DMA_SPACES);
 +      if (ret)
 +              goto out;
 +
 +      zpci_map_resources(pdev);
 +      zpci_register_ioat(zdev, 0, zdev->start_dma, zdev->end_dma,
 +                         (u64) zdev->dma_table);
 +
 +out:
 +      return ret;
 +}
 +
 +static int zpci_freeze(struct device *dev)
 +{
 +      struct pci_dev *pdev = to_pci_dev(dev);
 +      struct zpci_dev *zdev = to_zpci(pdev);
 +
 +      if (zdev->state != ZPCI_FN_STATE_ONLINE)
 +              return 0;
 +
 +      zpci_unregister_ioat(zdev, 0);
 +      zpci_unmap_resources(pdev);
 +      return clp_disable_fh(zdev);
 +}
 +
 +struct dev_pm_ops pcibios_pm_ops = {
 +      .thaw_noirq = zpci_restore,
 +      .freeze_noirq = zpci_freeze,
 +      .restore_noirq = zpci_restore,
 +      .poweroff_noirq = zpci_freeze,
 +};
 +#endif /* CONFIG_HIBERNATE_CALLBACKS */
 +
  static int zpci_alloc_domain(struct zpci_dev *zdev)
  {
+       spin_lock(&zpci_domain_lock);
+       if (zpci_num_domains_allocated > (ZPCI_NR_DEVICES - 1)) {
+               spin_unlock(&zpci_domain_lock);
+               pr_err("Adding PCI function %08x failed because the configured 
limit of %d is reached\n",
+                       zdev->fid, ZPCI_NR_DEVICES);
+               return -ENOSPC;
+       }
+ 
        if (zpci_unique_uid) {
                zdev->domain = (u16) zdev->uid;
-               if (zdev->domain >= ZPCI_NR_DEVICES)
-                       return 0;
- 
-               spin_lock(&zpci_domain_lock);
                if (test_bit(zdev->domain, zpci_domain)) {
                        spin_unlock(&zpci_domain_lock);
 -                      pr_err("Adding PCI function %08x failed because domain 
%04x is already assigned\n",
 -                              zdev->fid, zdev->domain);
                        return -EEXIST;
                }
                set_bit(zdev->domain, zpci_domain);
@@@ -665,14 -631,14 +671,21 @@@
                spin_unlock(&zpci_domain_lock);
                return 0;
        }
- 
-       spin_lock(&zpci_domain_lock);
+       /*
+        * We can always auto allocate domains below ZPCI_NR_DEVICES.
+        * There is either a free domain or we have reached the maximum in
+        * which case we would have bailed earlier.
+        */
        zdev->domain = find_first_zero_bit(zpci_domain, ZPCI_NR_DEVICES);
++<<<<<<< HEAD
 +      if (zdev->domain == ZPCI_NR_DEVICES) {
 +              spin_unlock(&zpci_domain_lock);
 +              return -ENOSPC;
 +      }
++=======
++>>>>>>> 969ae01bab2f... s390/pci: Fix zpci_alloc_domain() over allocation
        set_bit(zdev->domain, zpci_domain);
+       zpci_num_domains_allocated++;
        spin_unlock(&zpci_domain_lock);
        return 0;
  }

-- 
You received this bug notification because you are a member of Kernel
Packages, which is subscribed to linux in Ubuntu.
https://bugs.launchpad.net/bugs/1874057

Title:
  [UBUNTU 20.04] s390x/pci: do not allow to create more pci functions
  than configured via CONFIG_PCI_NR_FUNCTIONS

Status in Ubuntu on IBM z Systems:
  New
Status in linux package in Ubuntu:
  New

Bug description:
  PCI Functions with UIDs >128 are currently not accounted correctly in
  the s390x/pci code. Furthermore, the code allows that more than
  CONFIG_PCI_NR_FUNCTIONS are created. This can lead to issues with data
  structures which were only allocated for CONFIG_PCI_NR_FUNCTIONS.

  This has been fixed in the following upstream commit:

  969ae01bab2fe938b4c8324836038b5ac1c78fac
  ("s390/pci: Fix zpci_alloc_domain() over allocation")

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu-z-systems/+bug/1874057/+subscriptions

-- 
Mailing list: https://launchpad.net/~kernel-packages
Post to     : kernel-packages@lists.launchpad.net
Unsubscribe : https://launchpad.net/~kernel-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to