Comment 3 for bug 1874057

Revision history for this message
Frank Heimes (fheimes) wrote :

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;
  }