* IOMMU group creation for pseries hotplug, and powernv VFs @ 2019-09-30 2:08 Oliver O'Halloran 2019-09-30 2:08 ` [PATCH 1/3] powernv/iov: Ensure the pdn for VFs always contains a valid PE number Oliver O'Halloran ` (3 more replies) 0 siblings, 4 replies; 11+ messages in thread From: Oliver O'Halloran @ 2019-09-30 2:08 UTC (permalink / raw) To: linuxppc-dev; +Cc: aik, linux-pci, shawn A couple of extra patches on top of Shawn's existing re-ordering patch. This seems to fix the problem Alexey noted with Shawn's change causing VFs to lose their IOMMU group. I've tried pretty hard to make this a minimal fix it's still a bit large. If mpe is happy to take this as a fix for 5.4 then I'll leave it, otherwise we might want to look at different approaches. ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 1/3] powernv/iov: Ensure the pdn for VFs always contains a valid PE number 2019-09-30 2:08 IOMMU group creation for pseries hotplug, and powernv VFs Oliver O'Halloran @ 2019-09-30 2:08 ` Oliver O'Halloran 2019-09-30 17:09 ` Bjorn Helgaas 2019-10-01 5:39 ` Alexey Kardashevskiy 2019-09-30 2:08 ` [PATCH 2/3] powerpc/pci: Fix pcibios_setup_device() ordering Oliver O'Halloran ` (2 subsequent siblings) 3 siblings, 2 replies; 11+ messages in thread From: Oliver O'Halloran @ 2019-09-30 2:08 UTC (permalink / raw) To: linuxppc-dev; +Cc: aik, linux-pci, Oliver O'Halloran, shawn On PowerNV we use the pcibios_sriov_enable() hook to do two things: 1. Create a pci_dn structure for each of the VFs, and 2. Configure the PHB's internal BARs that map MMIO ranges to PEs so that each VF has it's own PE. Note that the PE also determines the IOMMU table the HW uses for the device. Currently we do not set the pe_number field of the pci_dn immediately after assigning the PE number for the VF that it represents. Instead, we do that in a fixup (see pnv_pci_dma_dev_setup) which is run inside the pcibios_add_device() hook which is run prior to adding the device to the bus. On PowerNV we add the device to it's IOMMU group using a bus notifier and in order for this to work the PE number needs to be known when the bus notifier is run. This works today since the PE number is set in the fixup which runs before adding the device to the bus. However, if we want to move the fixup to a later stage this will break. We can fix this by setting the pdn->pe_number inside of pcibios_sriov_enable(). There's no good to avoid this since we already have all the required information at that point, so... do that. Moving this earlier does cause two problems: 1. We trip the WARN_ON() in the fixup code, and 2. The EEH core will clear pdn->pe_number while recovering VFs. The only justification for either of these is a comment in eeh_rmv_device() suggesting that pdn->pe_number *must* be set to IODA_INVALID_PE in order for the VF to be scanned. However, this comment appears to have no basis in reality so just delete it. Signed-off-by: Oliver O'Halloran <oohall@gmail.com> --- Can't get rid of the fixup entirely since we need it to set the ioda_pe->pdev back-pointer. I'll look at killing that another time. --- arch/powerpc/kernel/eeh_driver.c | 6 ------ arch/powerpc/platforms/powernv/pci-ioda.c | 19 +++++++++++++++---- arch/powerpc/platforms/powernv/pci.c | 4 ---- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c index d9279d0..7955fba 100644 --- a/arch/powerpc/kernel/eeh_driver.c +++ b/arch/powerpc/kernel/eeh_driver.c @@ -541,12 +541,6 @@ static void eeh_rmv_device(struct eeh_dev *edev, void *userdata) pci_iov_remove_virtfn(edev->physfn, pdn->vf_index); edev->pdev = NULL; - - /* - * We have to set the VF PE number to invalid one, which is - * required to plug the VF successfully. - */ - pdn->pe_number = IODA_INVALID_PE; #endif if (rmv_data) list_add(&edev->rmv_entry, &rmv_data->removed_vf_list); diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index 5e3172d..70508b3 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c @@ -1558,6 +1558,10 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, u16 num_vfs) /* Reserve PE for each VF */ for (vf_index = 0; vf_index < num_vfs; vf_index++) { + int vf_devfn = pci_iov_virtfn_devfn(pdev, vf_index); + int vf_bus = pci_iov_virtfn_bus(pdev, vf_index); + struct pci_dn *vf_pdn; + if (pdn->m64_single_mode) pe_num = pdn->pe_num_map[vf_index]; else @@ -1570,13 +1574,11 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, u16 num_vfs) pe->pbus = NULL; pe->parent_dev = pdev; pe->mve_number = -1; - pe->rid = (pci_iov_virtfn_bus(pdev, vf_index) << 8) | - pci_iov_virtfn_devfn(pdev, vf_index); + pe->rid = (vf_bus << 8) | vf_devfn; pe_info(pe, "VF %04d:%02d:%02d.%d associated with PE#%x\n", hose->global_number, pdev->bus->number, - PCI_SLOT(pci_iov_virtfn_devfn(pdev, vf_index)), - PCI_FUNC(pci_iov_virtfn_devfn(pdev, vf_index)), pe_num); + PCI_SLOT(vf_devfn), PCI_FUNC(vf_devfn), pe_num); if (pnv_ioda_configure_pe(phb, pe)) { /* XXX What do we do here ? */ @@ -1590,6 +1592,15 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, u16 num_vfs) list_add_tail(&pe->list, &phb->ioda.pe_list); mutex_unlock(&phb->ioda.pe_list_mutex); + /* associate this pe to it's pdn */ + list_for_each_entry(vf_pdn, &pdn->parent->child_list, list) { + if (vf_pdn->busno == vf_bus && + vf_pdn->devfn == vf_devfn) { + vf_pdn->pe_number = pe_num; + break; + } + } + pnv_pci_ioda2_setup_dma_pe(phb, pe); #ifdef CONFIG_IOMMU_API iommu_register_group(&pe->table_group, diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c index 2825d00..b7761e2 100644 --- a/arch/powerpc/platforms/powernv/pci.c +++ b/arch/powerpc/platforms/powernv/pci.c @@ -816,16 +816,12 @@ void pnv_pci_dma_dev_setup(struct pci_dev *pdev) struct pnv_phb *phb = hose->private_data; #ifdef CONFIG_PCI_IOV struct pnv_ioda_pe *pe; - struct pci_dn *pdn; /* Fix the VF pdn PE number */ if (pdev->is_virtfn) { - pdn = pci_get_pdn(pdev); - WARN_ON(pdn->pe_number != IODA_INVALID_PE); list_for_each_entry(pe, &phb->ioda.pe_list, list) { if (pe->rid == ((pdev->bus->number << 8) | (pdev->devfn & 0xff))) { - pdn->pe_number = pe->pe_number; pe->pdev = pdev; break; } -- 2.9.5 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 1/3] powernv/iov: Ensure the pdn for VFs always contains a valid PE number 2019-09-30 2:08 ` [PATCH 1/3] powernv/iov: Ensure the pdn for VFs always contains a valid PE number Oliver O'Halloran @ 2019-09-30 17:09 ` Bjorn Helgaas 2019-10-01 1:33 ` Oliver O'Halloran 2019-10-01 5:39 ` Alexey Kardashevskiy 1 sibling, 1 reply; 11+ messages in thread From: Bjorn Helgaas @ 2019-09-30 17:09 UTC (permalink / raw) To: Oliver O'Halloran; +Cc: aik, shawn, linuxppc-dev, linux-pci On Mon, Sep 30, 2019 at 12:08:46PM +1000, Oliver O'Halloran wrote: This is all powerpc, so I assume Michael will handle this. Just random things I noticed; ignore if they don't make sense: > On PowerNV we use the pcibios_sriov_enable() hook to do two things: > > 1. Create a pci_dn structure for each of the VFs, and > 2. Configure the PHB's internal BARs that map MMIO ranges to PEs > so that each VF has it's own PE. Note that the PE also determines s/it's/its/ > the IOMMU table the HW uses for the device. > > Currently we do not set the pe_number field of the pci_dn immediately after > assigning the PE number for the VF that it represents. Instead, we do that > in a fixup (see pnv_pci_dma_dev_setup) which is run inside the > pcibios_add_device() hook which is run prior to adding the device to the > bus. > > On PowerNV we add the device to it's IOMMU group using a bus notifier and s/it's/its/ > in order for this to work the PE number needs to be known when the bus > notifier is run. This works today since the PE number is set in the fixup > which runs before adding the device to the bus. However, if we want to move > the fixup to a later stage this will break. > > We can fix this by setting the pdn->pe_number inside of > pcibios_sriov_enable(). There's no good to avoid this since we already have s/no good/no good reason/ ? Not quite sure what "this" refers to ... "no good reason to avoid setting pdn->pe_number in pcibios_sriov_enable()"? The double negative makes it a little hard to parse. > all the required information at that point, so... do that. Moving this > earlier does cause two problems: > > 1. We trip the WARN_ON() in the fixup code, and > 2. The EEH core will clear pdn->pe_number while recovering VFs. > > The only justification for either of these is a comment in eeh_rmv_device() > suggesting that pdn->pe_number *must* be set to IODA_INVALID_PE in order > for the VF to be scanned. However, this comment appears to have no basis in > reality so just delete it. > > Signed-off-by: Oliver O'Halloran <oohall@gmail.com> > --- > Can't get rid of the fixup entirely since we need it to set the > ioda_pe->pdev back-pointer. I'll look at killing that another time. > --- > arch/powerpc/kernel/eeh_driver.c | 6 ------ > arch/powerpc/platforms/powernv/pci-ioda.c | 19 +++++++++++++++---- > arch/powerpc/platforms/powernv/pci.c | 4 ---- > 3 files changed, 15 insertions(+), 14 deletions(-) > > diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c > index d9279d0..7955fba 100644 > --- a/arch/powerpc/kernel/eeh_driver.c > +++ b/arch/powerpc/kernel/eeh_driver.c > @@ -541,12 +541,6 @@ static void eeh_rmv_device(struct eeh_dev *edev, void *userdata) > > pci_iov_remove_virtfn(edev->physfn, pdn->vf_index); > edev->pdev = NULL; > - > - /* > - * We have to set the VF PE number to invalid one, which is > - * required to plug the VF successfully. > - */ > - pdn->pe_number = IODA_INVALID_PE; > #endif > if (rmv_data) > list_add(&edev->rmv_entry, &rmv_data->removed_vf_list); > diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c > index 5e3172d..70508b3 100644 > --- a/arch/powerpc/platforms/powernv/pci-ioda.c > +++ b/arch/powerpc/platforms/powernv/pci-ioda.c > @@ -1558,6 +1558,10 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, u16 num_vfs) > > /* Reserve PE for each VF */ > for (vf_index = 0; vf_index < num_vfs; vf_index++) { > + int vf_devfn = pci_iov_virtfn_devfn(pdev, vf_index); > + int vf_bus = pci_iov_virtfn_bus(pdev, vf_index); > + struct pci_dn *vf_pdn; > + > if (pdn->m64_single_mode) > pe_num = pdn->pe_num_map[vf_index]; > else > @@ -1570,13 +1574,11 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, u16 num_vfs) > pe->pbus = NULL; > pe->parent_dev = pdev; > pe->mve_number = -1; > - pe->rid = (pci_iov_virtfn_bus(pdev, vf_index) << 8) | > - pci_iov_virtfn_devfn(pdev, vf_index); > + pe->rid = (vf_bus << 8) | vf_devfn; > > pe_info(pe, "VF %04d:%02d:%02d.%d associated with PE#%x\n", Not related to *this* patch, but this looks like maybe it's supposed to match the pci_name(), e.g., "%04x:%02x:%02x.%d" from pci_setup_device()? If so, the "%04d:%02d:%02d" here will be confusing since the decimal & hex won't always match. > hose->global_number, pdev->bus->number, Consider pci_domain_nr(bus) instead of hose->global_number? It would be nice if you had the pci_dev * for each VF so you could just use pci_name(vf) instead of all this domain/bus/PCI_SLOT/FUNC. > - PCI_SLOT(pci_iov_virtfn_devfn(pdev, vf_index)), > - PCI_FUNC(pci_iov_virtfn_devfn(pdev, vf_index)), pe_num); > + PCI_SLOT(vf_devfn), PCI_FUNC(vf_devfn), pe_num); > > if (pnv_ioda_configure_pe(phb, pe)) { > /* XXX What do we do here ? */ > @@ -1590,6 +1592,15 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, u16 num_vfs) > list_add_tail(&pe->list, &phb->ioda.pe_list); > mutex_unlock(&phb->ioda.pe_list_mutex); > > + /* associate this pe to it's pdn */ > + list_for_each_entry(vf_pdn, &pdn->parent->child_list, list) { > + if (vf_pdn->busno == vf_bus && > + vf_pdn->devfn == vf_devfn) { > + vf_pdn->pe_number = pe_num; > + break; > + } > + } > + > pnv_pci_ioda2_setup_dma_pe(phb, pe); > #ifdef CONFIG_IOMMU_API > iommu_register_group(&pe->table_group, > diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c > index 2825d00..b7761e2 100644 > --- a/arch/powerpc/platforms/powernv/pci.c > +++ b/arch/powerpc/platforms/powernv/pci.c > @@ -816,16 +816,12 @@ void pnv_pci_dma_dev_setup(struct pci_dev *pdev) > struct pnv_phb *phb = hose->private_data; > #ifdef CONFIG_PCI_IOV > struct pnv_ioda_pe *pe; > - struct pci_dn *pdn; > > /* Fix the VF pdn PE number */ > if (pdev->is_virtfn) { > - pdn = pci_get_pdn(pdev); > - WARN_ON(pdn->pe_number != IODA_INVALID_PE); > list_for_each_entry(pe, &phb->ioda.pe_list, list) { > if (pe->rid == ((pdev->bus->number << 8) | > (pdev->devfn & 0xff))) { > - pdn->pe_number = pe->pe_number; > pe->pdev = pdev; > break; > } > -- > 2.9.5 > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/3] powernv/iov: Ensure the pdn for VFs always contains a valid PE number 2019-09-30 17:09 ` Bjorn Helgaas @ 2019-10-01 1:33 ` Oliver O'Halloran 2019-10-11 8:27 ` Michael Ellerman 0 siblings, 1 reply; 11+ messages in thread From: Oliver O'Halloran @ 2019-10-01 1:33 UTC (permalink / raw) To: Bjorn Helgaas Cc: Alexey Kardashevskiy, Shawn Anastasio, linuxppc-dev, linux-pci On Tue, Oct 1, 2019 at 3:09 AM Bjorn Helgaas <helgaas@kernel.org> wrote: > > On Mon, Sep 30, 2019 at 12:08:46PM +1000, Oliver O'Halloran wrote: > > This is all powerpc, so I assume Michael will handle this. Just > random things I noticed; ignore if they don't make sense: > > > On PowerNV we use the pcibios_sriov_enable() hook to do two things: > > > > 1. Create a pci_dn structure for each of the VFs, and > > 2. Configure the PHB's internal BARs that map MMIO ranges to PEs > > so that each VF has it's own PE. Note that the PE also determines > > s/it's/its/ > > > the IOMMU table the HW uses for the device. > > > > Currently we do not set the pe_number field of the pci_dn immediately after > > assigning the PE number for the VF that it represents. Instead, we do that > > in a fixup (see pnv_pci_dma_dev_setup) which is run inside the > > pcibios_add_device() hook which is run prior to adding the device to the > > bus. > > > > On PowerNV we add the device to it's IOMMU group using a bus notifier and > > s/it's/its/ > > > in order for this to work the PE number needs to be known when the bus > > notifier is run. This works today since the PE number is set in the fixup > > which runs before adding the device to the bus. However, if we want to move > > the fixup to a later stage this will break. > > > > We can fix this by setting the pdn->pe_number inside of > > pcibios_sriov_enable(). There's no good to avoid this since we already have > > s/no good/no good reason/ ? > > Not quite sure what "this" refers to ... "no good reason to avoid > setting pdn->pe_number in pcibios_sriov_enable()"? The double > negative makes it a little hard to parse. I agree it's a bit vague, I'll re-word it. > > all the required information at that point, so... do that. Moving this > > earlier does cause two problems: > > > > 1. We trip the WARN_ON() in the fixup code, and > > 2. The EEH core will clear pdn->pe_number while recovering VFs. > > > > The only justification for either of these is a comment in eeh_rmv_device() > > suggesting that pdn->pe_number *must* be set to IODA_INVALID_PE in order > > for the VF to be scanned. However, this comment appears to have no basis in > > reality so just delete it. > > > > Signed-off-by: Oliver O'Halloran <oohall@gmail.com> > > --- > > Can't get rid of the fixup entirely since we need it to set the > > ioda_pe->pdev back-pointer. I'll look at killing that another time. > > --- > > arch/powerpc/kernel/eeh_driver.c | 6 ------ > > arch/powerpc/platforms/powernv/pci-ioda.c | 19 +++++++++++++++---- > > arch/powerpc/platforms/powernv/pci.c | 4 ---- > > 3 files changed, 15 insertions(+), 14 deletions(-) > > > > diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c > > index d9279d0..7955fba 100644 > > --- a/arch/powerpc/kernel/eeh_driver.c > > +++ b/arch/powerpc/kernel/eeh_driver.c > > @@ -541,12 +541,6 @@ static void eeh_rmv_device(struct eeh_dev *edev, void *userdata) > > > > pci_iov_remove_virtfn(edev->physfn, pdn->vf_index); > > edev->pdev = NULL; > > - > > - /* > > - * We have to set the VF PE number to invalid one, which is > > - * required to plug the VF successfully. > > - */ > > - pdn->pe_number = IODA_INVALID_PE; > > #endif > > if (rmv_data) > > list_add(&edev->rmv_entry, &rmv_data->removed_vf_list); > > diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c > > index 5e3172d..70508b3 100644 > > --- a/arch/powerpc/platforms/powernv/pci-ioda.c > > +++ b/arch/powerpc/platforms/powernv/pci-ioda.c > > @@ -1558,6 +1558,10 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, u16 num_vfs) > > > > /* Reserve PE for each VF */ > > for (vf_index = 0; vf_index < num_vfs; vf_index++) { > > + int vf_devfn = pci_iov_virtfn_devfn(pdev, vf_index); > > + int vf_bus = pci_iov_virtfn_bus(pdev, vf_index); > > + struct pci_dn *vf_pdn; > > + > > if (pdn->m64_single_mode) > > pe_num = pdn->pe_num_map[vf_index]; > > else > > @@ -1570,13 +1574,11 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, u16 num_vfs) > > pe->pbus = NULL; > > pe->parent_dev = pdev; > > pe->mve_number = -1; > > - pe->rid = (pci_iov_virtfn_bus(pdev, vf_index) << 8) | > > - pci_iov_virtfn_devfn(pdev, vf_index); > > + pe->rid = (vf_bus << 8) | vf_devfn; > > > > pe_info(pe, "VF %04d:%02d:%02d.%d associated with PE#%x\n", > > Not related to *this* patch, but this looks like maybe it's supposed > to match the pci_name(), e.g., "%04x:%02x:%02x.%d" from > pci_setup_device()? If so, the "%04d:%02d:%02d" here will be > confusing since the decimal & hex won't always match. That looks plain wrong. I'll send a separate patch to fix it. > > hose->global_number, pdev->bus->number, > > Consider pci_domain_nr(bus) instead of hose->global_number? It would > be nice if you had the pci_dev * for each VF so you could just use > pci_name(vf) instead of all this domain/bus/PCI_SLOT/FUNC. Unfortunately, we don't have pci_devs for the VFs when pcibios_sriov_enable() is called. On powernv (and pseries) we only permit config accesses to a BDF when a pci_dn exists for that BDF because the platform code assumes that one will exist. As a result we can't scan the VFs until after pcibios_sriov_enable() is called since that's where pci_dn's are created for the VFs. I'm working on removing the use of pci_dn from powernv entirely though. Once that's done we should revisit whether any of this infrastructure is necessary... Oliver ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/3] powernv/iov: Ensure the pdn for VFs always contains a valid PE number 2019-10-01 1:33 ` Oliver O'Halloran @ 2019-10-11 8:27 ` Michael Ellerman 0 siblings, 0 replies; 11+ messages in thread From: Michael Ellerman @ 2019-10-11 8:27 UTC (permalink / raw) To: Oliver O'Halloran, Bjorn Helgaas Cc: Alexey Kardashevskiy, linuxppc-dev, Shawn Anastasio, linux-pci "Oliver O'Halloran" <oohall@gmail.com> writes: > On Tue, Oct 1, 2019 at 3:09 AM Bjorn Helgaas <helgaas@kernel.org> wrote: >> On Mon, Sep 30, 2019 at 12:08:46PM +1000, Oliver O'Halloran wrote: >> This is all powerpc, so I assume Michael will handle this. Just >> random things I noticed; ignore if they don't make sense: >> >> > On PowerNV we use the pcibios_sriov_enable() hook to do two things: >> > >> > 1. Create a pci_dn structure for each of the VFs, and >> > 2. Configure the PHB's internal BARs that map MMIO ranges to PEs >> > so that each VF has it's own PE. Note that the PE also determines >> >> s/it's/its/ >> >> > the IOMMU table the HW uses for the device. >> > >> > Currently we do not set the pe_number field of the pci_dn immediately after >> > assigning the PE number for the VF that it represents. Instead, we do that >> > in a fixup (see pnv_pci_dma_dev_setup) which is run inside the >> > pcibios_add_device() hook which is run prior to adding the device to the >> > bus. >> > >> > On PowerNV we add the device to it's IOMMU group using a bus notifier and >> >> s/it's/its/ >> >> > in order for this to work the PE number needs to be known when the bus >> > notifier is run. This works today since the PE number is set in the fixup >> > which runs before adding the device to the bus. However, if we want to move >> > the fixup to a later stage this will break. >> > >> > We can fix this by setting the pdn->pe_number inside of >> > pcibios_sriov_enable(). There's no good to avoid this since we already have >> >> s/no good/no good reason/ ? >> >> Not quite sure what "this" refers to ... "no good reason to avoid >> setting pdn->pe_number in pcibios_sriov_enable()"? The double >> negative makes it a little hard to parse. > > I agree it's a bit vague, I'll re-word it. So I'm expecting a v2? cheers ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/3] powernv/iov: Ensure the pdn for VFs always contains a valid PE number 2019-09-30 2:08 ` [PATCH 1/3] powernv/iov: Ensure the pdn for VFs always contains a valid PE number Oliver O'Halloran 2019-09-30 17:09 ` Bjorn Helgaas @ 2019-10-01 5:39 ` Alexey Kardashevskiy 1 sibling, 0 replies; 11+ messages in thread From: Alexey Kardashevskiy @ 2019-10-01 5:39 UTC (permalink / raw) To: Oliver O'Halloran, linuxppc-dev; +Cc: linux-pci, shawn On 30/09/2019 12:08, Oliver O'Halloran wrote: > On PowerNV we use the pcibios_sriov_enable() hook to do two things: > > 1. Create a pci_dn structure for each of the VFs, and > 2. Configure the PHB's internal BARs that map MMIO ranges to PEs > so that each VF has it's own PE. Note that the PE also determines > the IOMMU table the HW uses for the device. > > Currently we do not set the pe_number field of the pci_dn immediately after > assigning the PE number for the VF that it represents. Instead, we do that > in a fixup (see pnv_pci_dma_dev_setup) which is run inside the > pcibios_add_device() hook which is run prior to adding the device to the > bus. > > On PowerNV we add the device to it's IOMMU group using a bus notifier and > in order for this to work the PE number needs to be known when the bus > notifier is run. This works today since the PE number is set in the fixup > which runs before adding the device to the bus. However, if we want to move > the fixup to a later stage this will break. > > We can fix this by setting the pdn->pe_number inside of > pcibios_sriov_enable(). There's no good to avoid this since we already have > all the required information at that point, so... do that. Moving this > earlier does cause two problems: > > 1. We trip the WARN_ON() in the fixup code, and > 2. The EEH core will clear pdn->pe_number while recovering VFs. > > The only justification for either of these is a comment in eeh_rmv_device() > suggesting that pdn->pe_number *must* be set to IODA_INVALID_PE in order > for the VF to be scanned. However, this comment appears to have no basis in > reality so just delete it. > > Signed-off-by: Oliver O'Halloran <oohall@gmail.com> Tested-by: Alexey Kardashevskiy <aik@ozlabs.ru> Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru> > --- > Can't get rid of the fixup entirely since we need it to set the > ioda_pe->pdev back-pointer. I'll look at killing that another time. > --- > arch/powerpc/kernel/eeh_driver.c | 6 ------ > arch/powerpc/platforms/powernv/pci-ioda.c | 19 +++++++++++++++---- > arch/powerpc/platforms/powernv/pci.c | 4 ---- > 3 files changed, 15 insertions(+), 14 deletions(-) > > diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c > index d9279d0..7955fba 100644 > --- a/arch/powerpc/kernel/eeh_driver.c > +++ b/arch/powerpc/kernel/eeh_driver.c > @@ -541,12 +541,6 @@ static void eeh_rmv_device(struct eeh_dev *edev, void *userdata) > > pci_iov_remove_virtfn(edev->physfn, pdn->vf_index); > edev->pdev = NULL; > - > - /* > - * We have to set the VF PE number to invalid one, which is > - * required to plug the VF successfully. > - */ > - pdn->pe_number = IODA_INVALID_PE; > #endif > if (rmv_data) > list_add(&edev->rmv_entry, &rmv_data->removed_vf_list); > diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c > index 5e3172d..70508b3 100644 > --- a/arch/powerpc/platforms/powernv/pci-ioda.c > +++ b/arch/powerpc/platforms/powernv/pci-ioda.c > @@ -1558,6 +1558,10 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, u16 num_vfs) > > /* Reserve PE for each VF */ > for (vf_index = 0; vf_index < num_vfs; vf_index++) { > + int vf_devfn = pci_iov_virtfn_devfn(pdev, vf_index); > + int vf_bus = pci_iov_virtfn_bus(pdev, vf_index); > + struct pci_dn *vf_pdn; > + > if (pdn->m64_single_mode) > pe_num = pdn->pe_num_map[vf_index]; > else > @@ -1570,13 +1574,11 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, u16 num_vfs) > pe->pbus = NULL; > pe->parent_dev = pdev; > pe->mve_number = -1; > - pe->rid = (pci_iov_virtfn_bus(pdev, vf_index) << 8) | > - pci_iov_virtfn_devfn(pdev, vf_index); > + pe->rid = (vf_bus << 8) | vf_devfn; > > pe_info(pe, "VF %04d:%02d:%02d.%d associated with PE#%x\n", > hose->global_number, pdev->bus->number, > - PCI_SLOT(pci_iov_virtfn_devfn(pdev, vf_index)), > - PCI_FUNC(pci_iov_virtfn_devfn(pdev, vf_index)), pe_num); > + PCI_SLOT(vf_devfn), PCI_FUNC(vf_devfn), pe_num); > > if (pnv_ioda_configure_pe(phb, pe)) { > /* XXX What do we do here ? */ > @@ -1590,6 +1592,15 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, u16 num_vfs) > list_add_tail(&pe->list, &phb->ioda.pe_list); > mutex_unlock(&phb->ioda.pe_list_mutex); > > + /* associate this pe to it's pdn */ > + list_for_each_entry(vf_pdn, &pdn->parent->child_list, list) { > + if (vf_pdn->busno == vf_bus && > + vf_pdn->devfn == vf_devfn) { > + vf_pdn->pe_number = pe_num; > + break; > + } > + } > + > pnv_pci_ioda2_setup_dma_pe(phb, pe); > #ifdef CONFIG_IOMMU_API > iommu_register_group(&pe->table_group, > diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c > index 2825d00..b7761e2 100644 > --- a/arch/powerpc/platforms/powernv/pci.c > +++ b/arch/powerpc/platforms/powernv/pci.c > @@ -816,16 +816,12 @@ void pnv_pci_dma_dev_setup(struct pci_dev *pdev) > struct pnv_phb *phb = hose->private_data; > #ifdef CONFIG_PCI_IOV > struct pnv_ioda_pe *pe; > - struct pci_dn *pdn; > > /* Fix the VF pdn PE number */ > if (pdev->is_virtfn) { > - pdn = pci_get_pdn(pdev); > - WARN_ON(pdn->pe_number != IODA_INVALID_PE); > list_for_each_entry(pe, &phb->ioda.pe_list, list) { > if (pe->rid == ((pdev->bus->number << 8) | > (pdev->devfn & 0xff))) { > - pdn->pe_number = pe->pe_number; > pe->pdev = pdev; > break; > } > -- Alexey ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 2/3] powerpc/pci: Fix pcibios_setup_device() ordering 2019-09-30 2:08 IOMMU group creation for pseries hotplug, and powernv VFs Oliver O'Halloran 2019-09-30 2:08 ` [PATCH 1/3] powernv/iov: Ensure the pdn for VFs always contains a valid PE number Oliver O'Halloran @ 2019-09-30 2:08 ` Oliver O'Halloran 2019-10-01 5:39 ` Alexey Kardashevskiy 2019-09-30 2:08 ` [PATCH 3/3] powerpc/pci: Remove pcibios_setup_bus_devices() Oliver O'Halloran 2019-10-01 7:39 ` IOMMU group creation for pseries hotplug, and powernv VFs Shawn Anastasio 3 siblings, 1 reply; 11+ messages in thread From: Oliver O'Halloran @ 2019-09-30 2:08 UTC (permalink / raw) To: linuxppc-dev; +Cc: aik, linux-pci, shawn From: Shawn Anastasio <shawn@anastas.io> Move PCI device setup from pcibios_add_device() and pcibios_fixup_bus() to pcibios_bus_add_device(). This ensures that platform-specific DMA and IOMMU setup occurs after the device has been registered in sysfs, which is a requirement for IOMMU group assignment to work This fixes IOMMU group assignment for hotplugged devices on pseries, where the existing behavior results in IOMMU assignment before registration. Thanks to Lukas Wunner <lukas@wunner.de> for the suggestion. Signed-off-by: Shawn Anastasio <shawn@anastas.io> --- arch/powerpc/kernel/pci-common.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 1c448cf..b89925ed 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -261,12 +261,6 @@ int pcibios_sriov_disable(struct pci_dev *pdev) #endif /* CONFIG_PCI_IOV */ -void pcibios_bus_add_device(struct pci_dev *pdev) -{ - if (ppc_md.pcibios_bus_add_device) - ppc_md.pcibios_bus_add_device(pdev); -} - static resource_size_t pcibios_io_size(const struct pci_controller *hose) { #ifdef CONFIG_PPC64 @@ -987,15 +981,17 @@ static void pcibios_setup_device(struct pci_dev *dev) ppc_md.pci_irq_fixup(dev); } -int pcibios_add_device(struct pci_dev *dev) +void pcibios_bus_add_device(struct pci_dev *pdev) { - /* - * We can only call pcibios_setup_device() after bus setup is complete, - * since some of the platform specific DMA setup code depends on it. - */ - if (dev->bus->is_added) - pcibios_setup_device(dev); + /* Perform platform-specific device setup */ + pcibios_setup_device(pdev); + + if (ppc_md.pcibios_bus_add_device) + ppc_md.pcibios_bus_add_device(pdev); +} +int pcibios_add_device(struct pci_dev *dev) +{ #ifdef CONFIG_PCI_IOV if (ppc_md.pcibios_fixup_sriov) ppc_md.pcibios_fixup_sriov(dev); @@ -1037,9 +1033,6 @@ void pcibios_fixup_bus(struct pci_bus *bus) /* Now fixup the bus bus */ pcibios_setup_bus_self(bus); - - /* Now fixup devices on that bus */ - pcibios_setup_bus_devices(bus); } EXPORT_SYMBOL(pcibios_fixup_bus); -- 2.9.5 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 2/3] powerpc/pci: Fix pcibios_setup_device() ordering 2019-09-30 2:08 ` [PATCH 2/3] powerpc/pci: Fix pcibios_setup_device() ordering Oliver O'Halloran @ 2019-10-01 5:39 ` Alexey Kardashevskiy 0 siblings, 0 replies; 11+ messages in thread From: Alexey Kardashevskiy @ 2019-10-01 5:39 UTC (permalink / raw) To: Oliver O'Halloran, linuxppc-dev; +Cc: linux-pci, shawn On 30/09/2019 12:08, Oliver O'Halloran wrote: > From: Shawn Anastasio <shawn@anastas.io> > > Move PCI device setup from pcibios_add_device() and pcibios_fixup_bus() to > pcibios_bus_add_device(). This ensures that platform-specific DMA and IOMMU > setup occurs after the device has been registered in sysfs, which is a > requirement for IOMMU group assignment to work > > This fixes IOMMU group assignment for hotplugged devices on pseries, where > the existing behavior results in IOMMU assignment before registration. > > Thanks to Lukas Wunner <lukas@wunner.de> for the suggestion. > > Signed-off-by: Shawn Anastasio <shawn@anastas.io> Tested-by: Alexey Kardashevskiy <aik@ozlabs.ru> Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru> > --- > arch/powerpc/kernel/pci-common.c | 25 +++++++++---------------- > 1 file changed, 9 insertions(+), 16 deletions(-) > > diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c > index 1c448cf..b89925ed 100644 > --- a/arch/powerpc/kernel/pci-common.c > +++ b/arch/powerpc/kernel/pci-common.c > @@ -261,12 +261,6 @@ int pcibios_sriov_disable(struct pci_dev *pdev) > > #endif /* CONFIG_PCI_IOV */ > > -void pcibios_bus_add_device(struct pci_dev *pdev) > -{ > - if (ppc_md.pcibios_bus_add_device) > - ppc_md.pcibios_bus_add_device(pdev); > -} > - > static resource_size_t pcibios_io_size(const struct pci_controller *hose) > { > #ifdef CONFIG_PPC64 > @@ -987,15 +981,17 @@ static void pcibios_setup_device(struct pci_dev *dev) > ppc_md.pci_irq_fixup(dev); > } > > -int pcibios_add_device(struct pci_dev *dev) > +void pcibios_bus_add_device(struct pci_dev *pdev) > { > - /* > - * We can only call pcibios_setup_device() after bus setup is complete, > - * since some of the platform specific DMA setup code depends on it. > - */ > - if (dev->bus->is_added) > - pcibios_setup_device(dev); > + /* Perform platform-specific device setup */ > + pcibios_setup_device(pdev); > + > + if (ppc_md.pcibios_bus_add_device) > + ppc_md.pcibios_bus_add_device(pdev); > +} > > +int pcibios_add_device(struct pci_dev *dev) > +{ > #ifdef CONFIG_PCI_IOV > if (ppc_md.pcibios_fixup_sriov) > ppc_md.pcibios_fixup_sriov(dev); > @@ -1037,9 +1033,6 @@ void pcibios_fixup_bus(struct pci_bus *bus) > > /* Now fixup the bus bus */ > pcibios_setup_bus_self(bus); > - > - /* Now fixup devices on that bus */ > - pcibios_setup_bus_devices(bus); > } > EXPORT_SYMBOL(pcibios_fixup_bus); > > -- Alexey ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 3/3] powerpc/pci: Remove pcibios_setup_bus_devices() 2019-09-30 2:08 IOMMU group creation for pseries hotplug, and powernv VFs Oliver O'Halloran 2019-09-30 2:08 ` [PATCH 1/3] powernv/iov: Ensure the pdn for VFs always contains a valid PE number Oliver O'Halloran 2019-09-30 2:08 ` [PATCH 2/3] powerpc/pci: Fix pcibios_setup_device() ordering Oliver O'Halloran @ 2019-09-30 2:08 ` Oliver O'Halloran 2019-10-01 5:40 ` Alexey Kardashevskiy 2019-10-01 7:39 ` IOMMU group creation for pseries hotplug, and powernv VFs Shawn Anastasio 3 siblings, 1 reply; 11+ messages in thread From: Oliver O'Halloran @ 2019-09-30 2:08 UTC (permalink / raw) To: linuxppc-dev; +Cc: aik, linux-pci, Oliver O'Halloran, shawn With the previous patch applied pcibios_setup_device() will always be run when pcibios_bus_add_device() is called. There are several code paths where pcibios_setup_bus_device() is still called (the PowerPC specific PCI hotplug support is one) so with just the previous patch applied the setup can be run multiple times on a device, once before the device is added to the bus and once after. There's no need to run the setup in the early case any more so just remove it entirely. Signed-off-by: Oliver O'Halloran <oohall@gmail.com> --- arch/powerpc/include/asm/pci.h | 1 - arch/powerpc/kernel/pci-common.c | 25 ------------------------- arch/powerpc/kernel/pci-hotplug.c | 1 - arch/powerpc/kernel/pci_of_scan.c | 1 - 4 files changed, 28 deletions(-) diff --git a/arch/powerpc/include/asm/pci.h b/arch/powerpc/include/asm/pci.h index 327567b..63ed7e3 100644 --- a/arch/powerpc/include/asm/pci.h +++ b/arch/powerpc/include/asm/pci.h @@ -113,7 +113,6 @@ extern pgprot_t pci_phys_mem_access_prot(struct file *file, pgprot_t prot); extern resource_size_t pcibios_io_space_offset(struct pci_controller *hose); -extern void pcibios_setup_bus_devices(struct pci_bus *bus); extern void pcibios_setup_bus_self(struct pci_bus *bus); extern void pcibios_setup_phb_io_space(struct pci_controller *hose); extern void pcibios_scan_phb(struct pci_controller *hose); diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index b89925ed..f8a59d7 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -1000,24 +1000,6 @@ int pcibios_add_device(struct pci_dev *dev) return 0; } -void pcibios_setup_bus_devices(struct pci_bus *bus) -{ - struct pci_dev *dev; - - pr_debug("PCI: Fixup bus devices %d (%s)\n", - bus->number, bus->self ? pci_name(bus->self) : "PHB"); - - list_for_each_entry(dev, &bus->devices, bus_list) { - /* Cardbus can call us to add new devices to a bus, so ignore - * those who are already fully discovered - */ - if (pci_dev_is_added(dev)) - continue; - - pcibios_setup_device(dev); - } -} - void pcibios_set_master(struct pci_dev *dev) { /* No special bus mastering setup handling */ @@ -1036,13 +1018,6 @@ void pcibios_fixup_bus(struct pci_bus *bus) } EXPORT_SYMBOL(pcibios_fixup_bus); -void pci_fixup_cardbus(struct pci_bus *bus) -{ - /* Now fixup devices on that bus */ - pcibios_setup_bus_devices(bus); -} - - static int skip_isa_ioresource_align(struct pci_dev *dev) { if (pci_has_flag(PCI_CAN_SKIP_ISA_ALIGN) && diff --git a/arch/powerpc/kernel/pci-hotplug.c b/arch/powerpc/kernel/pci-hotplug.c index fc62c4b..d6a67f8 100644 --- a/arch/powerpc/kernel/pci-hotplug.c +++ b/arch/powerpc/kernel/pci-hotplug.c @@ -134,7 +134,6 @@ void pci_hp_add_devices(struct pci_bus *bus) */ slotno = PCI_SLOT(PCI_DN(dn->child)->devfn); pci_scan_slot(bus, PCI_DEVFN(slotno, 0)); - pcibios_setup_bus_devices(bus); max = bus->busn_res.start; /* * Scan bridges that are already configured. We don't touch diff --git a/arch/powerpc/kernel/pci_of_scan.c b/arch/powerpc/kernel/pci_of_scan.c index f91d7e9..c3024f1 100644 --- a/arch/powerpc/kernel/pci_of_scan.c +++ b/arch/powerpc/kernel/pci_of_scan.c @@ -414,7 +414,6 @@ static void __of_scan_bus(struct device_node *node, struct pci_bus *bus, */ if (!rescan_existing) pcibios_setup_bus_self(bus); - pcibios_setup_bus_devices(bus); /* Now scan child busses */ for_each_pci_bridge(dev, bus) -- 2.9.5 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 3/3] powerpc/pci: Remove pcibios_setup_bus_devices() 2019-09-30 2:08 ` [PATCH 3/3] powerpc/pci: Remove pcibios_setup_bus_devices() Oliver O'Halloran @ 2019-10-01 5:40 ` Alexey Kardashevskiy 0 siblings, 0 replies; 11+ messages in thread From: Alexey Kardashevskiy @ 2019-10-01 5:40 UTC (permalink / raw) To: Oliver O'Halloran, linuxppc-dev; +Cc: linux-pci, shawn On 30/09/2019 12:08, Oliver O'Halloran wrote: > With the previous patch applied pcibios_setup_device() will always be run > when pcibios_bus_add_device() is called. There are several code paths where > pcibios_setup_bus_device() is still called (the PowerPC specific PCI > hotplug support is one) so with just the previous patch applied the setup > can be run multiple times on a device, once before the device is added > to the bus and once after. > > There's no need to run the setup in the early case any more so just > remove it entirely. > > Signed-off-by: Oliver O'Halloran <oohall@gmail.com> Tested-by: Alexey Kardashevskiy <aik@ozlabs.ru> Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru> > --- > arch/powerpc/include/asm/pci.h | 1 - > arch/powerpc/kernel/pci-common.c | 25 ------------------------- > arch/powerpc/kernel/pci-hotplug.c | 1 - > arch/powerpc/kernel/pci_of_scan.c | 1 - > 4 files changed, 28 deletions(-) > > diff --git a/arch/powerpc/include/asm/pci.h b/arch/powerpc/include/asm/pci.h > index 327567b..63ed7e3 100644 > --- a/arch/powerpc/include/asm/pci.h > +++ b/arch/powerpc/include/asm/pci.h > @@ -113,7 +113,6 @@ extern pgprot_t pci_phys_mem_access_prot(struct file *file, > pgprot_t prot); > > extern resource_size_t pcibios_io_space_offset(struct pci_controller *hose); > -extern void pcibios_setup_bus_devices(struct pci_bus *bus); > extern void pcibios_setup_bus_self(struct pci_bus *bus); > extern void pcibios_setup_phb_io_space(struct pci_controller *hose); > extern void pcibios_scan_phb(struct pci_controller *hose); > diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c > index b89925ed..f8a59d7 100644 > --- a/arch/powerpc/kernel/pci-common.c > +++ b/arch/powerpc/kernel/pci-common.c > @@ -1000,24 +1000,6 @@ int pcibios_add_device(struct pci_dev *dev) > return 0; > } > > -void pcibios_setup_bus_devices(struct pci_bus *bus) > -{ > - struct pci_dev *dev; > - > - pr_debug("PCI: Fixup bus devices %d (%s)\n", > - bus->number, bus->self ? pci_name(bus->self) : "PHB"); > - > - list_for_each_entry(dev, &bus->devices, bus_list) { > - /* Cardbus can call us to add new devices to a bus, so ignore > - * those who are already fully discovered > - */ > - if (pci_dev_is_added(dev)) > - continue; > - > - pcibios_setup_device(dev); > - } > -} > - > void pcibios_set_master(struct pci_dev *dev) > { > /* No special bus mastering setup handling */ > @@ -1036,13 +1018,6 @@ void pcibios_fixup_bus(struct pci_bus *bus) > } > EXPORT_SYMBOL(pcibios_fixup_bus); > > -void pci_fixup_cardbus(struct pci_bus *bus) > -{ > - /* Now fixup devices on that bus */ > - pcibios_setup_bus_devices(bus); > -} > - > - > static int skip_isa_ioresource_align(struct pci_dev *dev) > { > if (pci_has_flag(PCI_CAN_SKIP_ISA_ALIGN) && > diff --git a/arch/powerpc/kernel/pci-hotplug.c b/arch/powerpc/kernel/pci-hotplug.c > index fc62c4b..d6a67f8 100644 > --- a/arch/powerpc/kernel/pci-hotplug.c > +++ b/arch/powerpc/kernel/pci-hotplug.c > @@ -134,7 +134,6 @@ void pci_hp_add_devices(struct pci_bus *bus) > */ > slotno = PCI_SLOT(PCI_DN(dn->child)->devfn); > pci_scan_slot(bus, PCI_DEVFN(slotno, 0)); > - pcibios_setup_bus_devices(bus); > max = bus->busn_res.start; > /* > * Scan bridges that are already configured. We don't touch > diff --git a/arch/powerpc/kernel/pci_of_scan.c b/arch/powerpc/kernel/pci_of_scan.c > index f91d7e9..c3024f1 100644 > --- a/arch/powerpc/kernel/pci_of_scan.c > +++ b/arch/powerpc/kernel/pci_of_scan.c > @@ -414,7 +414,6 @@ static void __of_scan_bus(struct device_node *node, struct pci_bus *bus, > */ > if (!rescan_existing) > pcibios_setup_bus_self(bus); > - pcibios_setup_bus_devices(bus); > > /* Now scan child busses */ > for_each_pci_bridge(dev, bus) > -- Alexey ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: IOMMU group creation for pseries hotplug, and powernv VFs 2019-09-30 2:08 IOMMU group creation for pseries hotplug, and powernv VFs Oliver O'Halloran ` (2 preceding siblings ...) 2019-09-30 2:08 ` [PATCH 3/3] powerpc/pci: Remove pcibios_setup_bus_devices() Oliver O'Halloran @ 2019-10-01 7:39 ` Shawn Anastasio 3 siblings, 0 replies; 11+ messages in thread From: Shawn Anastasio @ 2019-10-01 7:39 UTC (permalink / raw) To: Oliver O'Halloran, linuxppc-dev; +Cc: aik, linux-pci On 9/29/19 9:08 PM, Oliver O'Halloran wrote: > A couple of extra patches on top of Shawn's existing re-ordering patch. > This seems to fix the problem Alexey noted with Shawn's change causing > VFs to lose their IOMMU group. I've tried pretty hard to make this a > minimal fix it's still a bit large. > > If mpe is happy to take this as a fix for 5.4 then I'll leave it, > otherwise we might want to look at different approaches. > Thanks for fixing this Oliver! Reviewed-by: Shawn Anastasio <shawn@anastas.io> ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2019-10-11 8:37 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2019-09-30 2:08 IOMMU group creation for pseries hotplug, and powernv VFs Oliver O'Halloran 2019-09-30 2:08 ` [PATCH 1/3] powernv/iov: Ensure the pdn for VFs always contains a valid PE number Oliver O'Halloran 2019-09-30 17:09 ` Bjorn Helgaas 2019-10-01 1:33 ` Oliver O'Halloran 2019-10-11 8:27 ` Michael Ellerman 2019-10-01 5:39 ` Alexey Kardashevskiy 2019-09-30 2:08 ` [PATCH 2/3] powerpc/pci: Fix pcibios_setup_device() ordering Oliver O'Halloran 2019-10-01 5:39 ` Alexey Kardashevskiy 2019-09-30 2:08 ` [PATCH 3/3] powerpc/pci: Remove pcibios_setup_bus_devices() Oliver O'Halloran 2019-10-01 5:40 ` Alexey Kardashevskiy 2019-10-01 7:39 ` IOMMU group creation for pseries hotplug, and powernv VFs Shawn Anastasio
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).