[Very RFC 22/46] powernv/eeh: Allocate eeh_dev's when needed

Alexey Kardashevskiy aik at ozlabs.ru
Mon Nov 25 14:27:28 AEDT 2019



On 20/11/2019 12:28, Oliver O'Halloran wrote:
> Have the PowerNV EEH backend allocate the eeh_dev if needed rather than using
> the one attached to the pci_dn. 

So that pci_dn attached one is leaked then?


> This gets us most of the way towards decoupling
> pci_dn from the PowerNV EEH code.
> 
> Signed-off-by: Oliver O'Halloran <oohall at gmail.com>
> ---
> We should probably be free()ing the eeh_dev somewhere. The pci_dev release
> function is the right place for it.
> ---
>  arch/powerpc/platforms/powernv/eeh-powernv.c | 22 ++++++++++++++++----
>  1 file changed, 18 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/powerpc/platforms/powernv/eeh-powernv.c b/arch/powerpc/platforms/powernv/eeh-powernv.c
> index 1cd80b399995..7aba18e08996 100644
> --- a/arch/powerpc/platforms/powernv/eeh-powernv.c
> +++ b/arch/powerpc/platforms/powernv/eeh-powernv.c
> @@ -366,10 +366,9 @@ static int pnv_eeh_write_config(struct eeh_dev *edev,
>   */
>  static struct eeh_dev *pnv_eeh_probe_pdev(struct pci_dev *pdev)
>  {
> -	struct pci_dn *pdn = pci_get_pdn(pdev);
> -	struct pci_controller *hose = pdn->phb;
> -	struct pnv_phb *phb = hose->private_data;
> -	struct eeh_dev *edev = pdn_to_eeh_dev(pdn);
> +	struct pnv_phb *phb = pci_bus_to_pnvhb(pdev->bus);
> +	struct pci_controller *hose = phb->hose;
> +	struct eeh_dev *edev;
>  	uint32_t pcie_flags;
>  	int ret;
>  	int config_addr = (pdev->bus->number << 8) | (pdev->devfn);
> @@ -415,12 +414,27 @@ static struct eeh_dev *pnv_eeh_probe_pdev(struct pci_dev *pdev)
>  	if ((pdev->class >> 8) == PCI_CLASS_BRIDGE_ISA)
>  		return NULL;
>  
> +	/* otherwise allocate and initialise a new eeh_dev */
> +	edev = kzalloc(sizeof(*edev), GFP_KERNEL);
> +	if (!edev) {
> +		pr_err("%s: out of memory lol\n", __func__);

"lol"? I am pretty sure we do not have to print anything if alloc failed
as alloc prints an error anyway. Thanks,


> +		return NULL;
> +	}
> +
>  	/* Initialize eeh device */
> +	edev->bdfn       = config_addr;
> +	edev->controller = phb->hose;
> +
>  	edev->class_code = pdev->class;
>  	edev->pcix_cap = pci_find_capability(pdev, PCI_CAP_ID_PCIX);
>  	edev->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
>  	edev->af_cap   = pci_find_capability(pdev, PCI_CAP_ID_AF);
>  	edev->aer_cap  = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR);
> +
> +	/* TODO: stash the vf_index in here? */
> +	if (pdev->is_virtfn)
> +		edev->physfn = pdev->physfn;
> +
>  	if ((pdev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
>  		edev->mode |= EEH_DEV_BRIDGE;
>  		if (edev->pcie_cap) {
> 

-- 
Alexey


More information about the Linuxppc-dev mailing list