All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gavin Shan <gwshan@linux.vnet.ibm.com>
To: Wei Yang <weiyang@linux.vnet.ibm.com>
Cc: gwshan@linux.vnet.ibm.com, bhelgaas@google.com,
	linuxppc-dev@lists.ozlabs.org, linux-pci@vger.kernel.org
Subject: Re: [PATCH V3 6/9] powerpc/powernv: create/release eeh_dev for VF
Date: Mon, 11 May 2015 12:48:56 +1000	[thread overview]
Message-ID: <20150511024856.GB8816@gwshan> (raw)
In-Reply-To: <1430723258-21299-7-git-send-email-weiyang@linux.vnet.ibm.com>

On Mon, May 04, 2015 at 03:07:35PM +0800, Wei Yang wrote:

Please order this patch and PATCH[5] because EEH device is expected to
be created before EEH PE.

>EEH on powerpc platform needs eeh_dev structure to track the pci device
                                                              ^^^
							      PCI

>status. Since VFs are created/released dynamically, VF's eeh_dev is also
>dynamically created/released in system.
>
>This patch creates/removes eeh_dev when pci_dn is created/removed for VFs,
>and marks it with EEH_DEV_VF type.
>
>Signed-off-by: Wei Yang <weiyang@linux.vnet.ibm.com>
>---
> arch/powerpc/include/asm/eeh.h |    7 +++++++
> arch/powerpc/kernel/eeh.c      |    4 ++++
> arch/powerpc/kernel/eeh_dev.c  |   20 ++++++++++++++++++++
> arch/powerpc/kernel/pci_dn.c   |    7 +++++++
> 4 files changed, 38 insertions(+)
>
>diff --git a/arch/powerpc/include/asm/eeh.h b/arch/powerpc/include/asm/eeh.h
>index 56e8cd9..2067de4 100644
>--- a/arch/powerpc/include/asm/eeh.h
>+++ b/arch/powerpc/include/asm/eeh.h
>@@ -124,6 +124,7 @@ static inline bool eeh_pe_passed(struct eeh_pe *pe)
> #define EEH_DEV_NO_HANDLER	(1 << 8)	/* No error handler	*/
> #define EEH_DEV_SYSFS		(1 << 9)	/* Sysfs created	*/
> #define EEH_DEV_REMOVED		(1 << 10)	/* Removed permanently	*/
>+#define EEH_DEV_VF		(1 << 11)	/* VF port		*/
>

Why you need this flag? I guess "edev->physfn" can be used to distinguish
it's a normal or VF eeh_dev.

> struct eeh_dev {
> 	int mode;			/* EEH mode			*/
>@@ -139,6 +140,9 @@ struct eeh_dev {
> 	struct pci_controller *phb;	/* Associated PHB		*/
> 	struct pci_dn *pdn;		/* Associated PCI device node	*/
> 	struct pci_dev *pdev;		/* Associated PCI device	*/
>+#ifdef CONFIG_PCI_IOV
>+	struct pci_dev *physfn;		/* Associated PF PORT		*/
>+#endif /* CONFIG_PCI_IOV */
> 	struct pci_bus *bus;		/* PCI bus for partial hotplug	*/
> };
>
>@@ -273,6 +277,7 @@ const char *eeh_pe_loc_get(struct eeh_pe *pe);
> struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe);
>
> void *eeh_dev_init(struct pci_dn *pdn, void *data);
>+void eeh_dev_remove(struct pci_dn *pdn);
> void eeh_dev_phb_init_dynamic(struct pci_controller *phb);
> int eeh_init(void);
> int __init eeh_ops_register(struct eeh_ops *ops);
>@@ -328,6 +333,8 @@ static inline void *eeh_dev_init(struct pci_dn *pdn, void *data)
> 	return NULL;
> }
>
>+void eeh_dev_remove(struct pci_dn *pdn) { }
>+
> static inline void eeh_dev_phb_init_dynamic(struct pci_controller *phb) { }
>
> static inline int eeh_check_failure(const volatile void __iomem *token)
>diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c
>index 6c7ce1b..221e280 100644
>--- a/arch/powerpc/kernel/eeh.c
>+++ b/arch/powerpc/kernel/eeh.c
>@@ -1135,6 +1135,10 @@ void eeh_add_device_late(struct pci_dev *dev)
> 	}
>
> 	edev->pdev = dev;
>+#ifdef CONFIG_PCI_IOV
>+	if (dev->is_virtfn)
>+		edev->physfn = dev->physfn;
>+#endif
> 	dev->dev.archdata.edev = edev;
>
> 	if (eeh_has_flag(EEH_PROBE_MODE_DEV))
>diff --git a/arch/powerpc/kernel/eeh_dev.c b/arch/powerpc/kernel/eeh_dev.c
>index aabba94..ab88e61 100644
>--- a/arch/powerpc/kernel/eeh_dev.c
>+++ b/arch/powerpc/kernel/eeh_dev.c
>@@ -72,6 +72,26 @@ void *eeh_dev_init(struct pci_dn *pdn, void *data)
> }
>
> /**
>+ * eeh_dev_remove - Release EEH device according to OF node
>+ * @pdn: PCI device node
>+ */
>+void eeh_dev_remove(struct pci_dn *pdn)
>+{
>+	struct eeh_dev *edev;
>+
>+	if (!pdn)
>+		return;
>+
>+	edev = pdn_to_eeh_dev(pdn);
>+	if(!edev)
>+		return;
>+

You don't have to have the check "if (!pdn)" here because edev should
be NULL if pdn is NULL, which is covered by pdn_to_eeh_dev().

	struct eeh_dev *edev = pdn_to_eeh_dev(pdn);

	if (!edev)
		return;

>+	eeh_rmv_from_parent_pe(edev);
>+	kfree(edev);
>+	pdn->edev = NULL;
>+}
>+

[A]

The function itself isn't correct enough. When VF's pci_dev is released,
eeh_remove_device(), detaching eeh_dev from parent PE and destroying EEH
address cache, should be called. The function isn't complete and you don't
have to detach eeh_dev from parent PE again.

>+/**
>  * eeh_dev_phb_init_dynamic - Create EEH devices for devices included in PHB
>  * @phb: PHB
>  *
>diff --git a/arch/powerpc/kernel/pci_dn.c b/arch/powerpc/kernel/pci_dn.c
>index bf0fb873..a35f865 100644
>--- a/arch/powerpc/kernel/pci_dn.c
>+++ b/arch/powerpc/kernel/pci_dn.c
>@@ -179,7 +179,9 @@ static struct pci_dn *add_one_dev_pci_data(struct pci_dn *parent,
> struct pci_dn *add_dev_pci_data(struct pci_dev *pdev)
> {
> #ifdef CONFIG_PCI_IOV
>+	struct pci_controller *hose = pci_bus_to_host(pdev->bus);
> 	struct pci_dn *parent, *pdn;
>+	struct eeh_dev *edev;
> 	int i;
>
> 	/* Only support IOV for now */
>@@ -205,6 +207,9 @@ struct pci_dn *add_dev_pci_data(struct pci_dev *pdev)
> 				 __func__, i);
> 			return NULL;
> 		}
>+		eeh_dev_init(pdn, hose);
>+		edev = pdn_to_eeh_dev(pdn);
>+		edev->mode |= EEH_DEV_VF;
> 	}
> #endif /* CONFIG_PCI_IOV */
>
>@@ -257,6 +262,8 @@ void remove_dev_pci_data(struct pci_dev *pdev)
> 			    pdn->devfn != pci_iov_virtfn_devfn(pdev, i))
> 				continue;
>
>+			eeh_dev_remove(pdn);
>+

Remove the function in [A] and you just need:

	struct eeh_dev *edev = pdn_to_eeh_dev(pdn);

	if (edev) {
		pdn->edev = NULL;
		kfree(edev);
	}

> 			if (!list_empty(&pdn->list))
> 				list_del(&pdn->list);
>
>-- 
>1.7.9.5
>


WARNING: multiple messages have this Message-ID (diff)
From: Gavin Shan <gwshan@linux.vnet.ibm.com>
To: Wei Yang <weiyang@linux.vnet.ibm.com>
Cc: bhelgaas@google.com, linux-pci@vger.kernel.org,
	linuxppc-dev@lists.ozlabs.org, gwshan@linux.vnet.ibm.com
Subject: Re: [PATCH V3 6/9] powerpc/powernv: create/release eeh_dev for VF
Date: Mon, 11 May 2015 12:48:56 +1000	[thread overview]
Message-ID: <20150511024856.GB8816@gwshan> (raw)
In-Reply-To: <1430723258-21299-7-git-send-email-weiyang@linux.vnet.ibm.com>

On Mon, May 04, 2015 at 03:07:35PM +0800, Wei Yang wrote:

Please order this patch and PATCH[5] because EEH device is expected to
be created before EEH PE.

>EEH on powerpc platform needs eeh_dev structure to track the pci device
                                                              ^^^
							      PCI

>status. Since VFs are created/released dynamically, VF's eeh_dev is also
>dynamically created/released in system.
>
>This patch creates/removes eeh_dev when pci_dn is created/removed for VFs,
>and marks it with EEH_DEV_VF type.
>
>Signed-off-by: Wei Yang <weiyang@linux.vnet.ibm.com>
>---
> arch/powerpc/include/asm/eeh.h |    7 +++++++
> arch/powerpc/kernel/eeh.c      |    4 ++++
> arch/powerpc/kernel/eeh_dev.c  |   20 ++++++++++++++++++++
> arch/powerpc/kernel/pci_dn.c   |    7 +++++++
> 4 files changed, 38 insertions(+)
>
>diff --git a/arch/powerpc/include/asm/eeh.h b/arch/powerpc/include/asm/eeh.h
>index 56e8cd9..2067de4 100644
>--- a/arch/powerpc/include/asm/eeh.h
>+++ b/arch/powerpc/include/asm/eeh.h
>@@ -124,6 +124,7 @@ static inline bool eeh_pe_passed(struct eeh_pe *pe)
> #define EEH_DEV_NO_HANDLER	(1 << 8)	/* No error handler	*/
> #define EEH_DEV_SYSFS		(1 << 9)	/* Sysfs created	*/
> #define EEH_DEV_REMOVED		(1 << 10)	/* Removed permanently	*/
>+#define EEH_DEV_VF		(1 << 11)	/* VF port		*/
>

Why you need this flag? I guess "edev->physfn" can be used to distinguish
it's a normal or VF eeh_dev.

> struct eeh_dev {
> 	int mode;			/* EEH mode			*/
>@@ -139,6 +140,9 @@ struct eeh_dev {
> 	struct pci_controller *phb;	/* Associated PHB		*/
> 	struct pci_dn *pdn;		/* Associated PCI device node	*/
> 	struct pci_dev *pdev;		/* Associated PCI device	*/
>+#ifdef CONFIG_PCI_IOV
>+	struct pci_dev *physfn;		/* Associated PF PORT		*/
>+#endif /* CONFIG_PCI_IOV */
> 	struct pci_bus *bus;		/* PCI bus for partial hotplug	*/
> };
>
>@@ -273,6 +277,7 @@ const char *eeh_pe_loc_get(struct eeh_pe *pe);
> struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe);
>
> void *eeh_dev_init(struct pci_dn *pdn, void *data);
>+void eeh_dev_remove(struct pci_dn *pdn);
> void eeh_dev_phb_init_dynamic(struct pci_controller *phb);
> int eeh_init(void);
> int __init eeh_ops_register(struct eeh_ops *ops);
>@@ -328,6 +333,8 @@ static inline void *eeh_dev_init(struct pci_dn *pdn, void *data)
> 	return NULL;
> }
>
>+void eeh_dev_remove(struct pci_dn *pdn) { }
>+
> static inline void eeh_dev_phb_init_dynamic(struct pci_controller *phb) { }
>
> static inline int eeh_check_failure(const volatile void __iomem *token)
>diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c
>index 6c7ce1b..221e280 100644
>--- a/arch/powerpc/kernel/eeh.c
>+++ b/arch/powerpc/kernel/eeh.c
>@@ -1135,6 +1135,10 @@ void eeh_add_device_late(struct pci_dev *dev)
> 	}
>
> 	edev->pdev = dev;
>+#ifdef CONFIG_PCI_IOV
>+	if (dev->is_virtfn)
>+		edev->physfn = dev->physfn;
>+#endif
> 	dev->dev.archdata.edev = edev;
>
> 	if (eeh_has_flag(EEH_PROBE_MODE_DEV))
>diff --git a/arch/powerpc/kernel/eeh_dev.c b/arch/powerpc/kernel/eeh_dev.c
>index aabba94..ab88e61 100644
>--- a/arch/powerpc/kernel/eeh_dev.c
>+++ b/arch/powerpc/kernel/eeh_dev.c
>@@ -72,6 +72,26 @@ void *eeh_dev_init(struct pci_dn *pdn, void *data)
> }
>
> /**
>+ * eeh_dev_remove - Release EEH device according to OF node
>+ * @pdn: PCI device node
>+ */
>+void eeh_dev_remove(struct pci_dn *pdn)
>+{
>+	struct eeh_dev *edev;
>+
>+	if (!pdn)
>+		return;
>+
>+	edev = pdn_to_eeh_dev(pdn);
>+	if(!edev)
>+		return;
>+

You don't have to have the check "if (!pdn)" here because edev should
be NULL if pdn is NULL, which is covered by pdn_to_eeh_dev().

	struct eeh_dev *edev = pdn_to_eeh_dev(pdn);

	if (!edev)
		return;

>+	eeh_rmv_from_parent_pe(edev);
>+	kfree(edev);
>+	pdn->edev = NULL;
>+}
>+

[A]

The function itself isn't correct enough. When VF's pci_dev is released,
eeh_remove_device(), detaching eeh_dev from parent PE and destroying EEH
address cache, should be called. The function isn't complete and you don't
have to detach eeh_dev from parent PE again.

>+/**
>  * eeh_dev_phb_init_dynamic - Create EEH devices for devices included in PHB
>  * @phb: PHB
>  *
>diff --git a/arch/powerpc/kernel/pci_dn.c b/arch/powerpc/kernel/pci_dn.c
>index bf0fb873..a35f865 100644
>--- a/arch/powerpc/kernel/pci_dn.c
>+++ b/arch/powerpc/kernel/pci_dn.c
>@@ -179,7 +179,9 @@ static struct pci_dn *add_one_dev_pci_data(struct pci_dn *parent,
> struct pci_dn *add_dev_pci_data(struct pci_dev *pdev)
> {
> #ifdef CONFIG_PCI_IOV
>+	struct pci_controller *hose = pci_bus_to_host(pdev->bus);
> 	struct pci_dn *parent, *pdn;
>+	struct eeh_dev *edev;
> 	int i;
>
> 	/* Only support IOV for now */
>@@ -205,6 +207,9 @@ struct pci_dn *add_dev_pci_data(struct pci_dev *pdev)
> 				 __func__, i);
> 			return NULL;
> 		}
>+		eeh_dev_init(pdn, hose);
>+		edev = pdn_to_eeh_dev(pdn);
>+		edev->mode |= EEH_DEV_VF;
> 	}
> #endif /* CONFIG_PCI_IOV */
>
>@@ -257,6 +262,8 @@ void remove_dev_pci_data(struct pci_dev *pdev)
> 			    pdn->devfn != pci_iov_virtfn_devfn(pdev, i))
> 				continue;
>
>+			eeh_dev_remove(pdn);
>+

Remove the function in [A] and you just need:

	struct eeh_dev *edev = pdn_to_eeh_dev(pdn);

	if (edev) {
		pdn->edev = NULL;
		kfree(edev);
	}

> 			if (!list_empty(&pdn->list))
> 				list_del(&pdn->list);
>
>-- 
>1.7.9.5
>

  reply	other threads:[~2015-05-11  2:49 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-04  7:07 [PATCH V3 0/9] VF EEH on Power8 Wei Yang
2015-05-04  7:07 ` Wei Yang
2015-05-04  7:07 ` [PATCH V3 1/9] pci/iov: rename and export virtfn_add/virtfn_remove Wei Yang
2015-05-04  7:07   ` Wei Yang
2015-05-11  2:13   ` Gavin Shan
2015-05-11  2:13     ` Gavin Shan
2015-05-04  7:07 ` [PATCH V3 2/9] powerpc/pci_dn: cache vf_index in pci_dn Wei Yang
2015-05-04  7:07   ` Wei Yang
2015-05-11  2:21   ` Gavin Shan
2015-05-11  2:21     ` Gavin Shan
2015-05-11  5:54     ` Wei Yang
2015-05-11  5:54       ` Wei Yang
2015-05-12  6:15       ` Gavin Shan
2015-05-12  6:15         ` Gavin Shan
2015-05-12  7:29         ` Wei Yang
2015-05-12  7:29           ` Wei Yang
2015-05-04  7:07 ` [PATCH V3 3/9] powerpc/pci: remove PCI devices in reverse order Wei Yang
2015-05-04  7:07   ` Wei Yang
2015-05-04  7:07 ` [PATCH V3 4/9] powerpc/eeh: cache address range just for normal device Wei Yang
2015-05-04  7:07   ` Wei Yang
2015-05-04  7:07 ` [PATCH V3 5/9] powerpc/eeh: create EEH_PE_VF for VF PE Wei Yang
2015-05-04  7:07   ` Wei Yang
2015-05-11  2:37   ` Gavin Shan
2015-05-11  2:37     ` Gavin Shan
2015-05-11  6:25     ` Wei Yang
2015-05-11  6:25       ` Wei Yang
2015-05-12  6:28       ` Gavin Shan
2015-05-12  6:28         ` Gavin Shan
2015-05-12  7:52         ` Wei Yang
2015-05-12  7:52           ` Wei Yang
2015-05-04  7:07 ` [PATCH V3 6/9] powerpc/powernv: create/release eeh_dev for VF Wei Yang
2015-05-04  7:07   ` Wei Yang
2015-05-11  2:48   ` Gavin Shan [this message]
2015-05-11  2:48     ` Gavin Shan
2015-05-12  8:06     ` Wei Yang
2015-05-12  8:06       ` Wei Yang
2015-05-12 23:09       ` Gavin Shan
2015-05-12 23:09         ` Gavin Shan
2015-05-04  7:07 ` [PATCH V3 7/9] powerpc/powernv: Support EEH reset for VFs Wei Yang
2015-05-04  7:07   ` Wei Yang
2015-05-11  3:03   ` Gavin Shan
2015-05-11  3:03     ` Gavin Shan
2015-05-04  7:07 ` [PATCH V3 8/9] powerpc/powernv: Support PCI config restore " Wei Yang
2015-05-04  7:07   ` Wei Yang
2015-05-11  4:22   ` Gavin Shan
2015-05-11  4:22     ` Gavin Shan
2015-05-12  1:31     ` Wei Yang
2015-05-12  1:31       ` Wei Yang
2015-05-12  6:34       ` Gavin Shan
2015-05-12  6:34         ` Gavin Shan
2015-05-12  8:16         ` Wei Yang
2015-05-12  8:16           ` Wei Yang
2015-05-12 23:16           ` Gavin Shan
2015-05-12 23:16             ` Gavin Shan
2015-05-04  7:07 ` [PATCH V3 9/9] powerpc/eeh: handle VF PE properly Wei Yang
2015-05-04  7:07   ` Wei Yang
2015-05-13  1:16   ` Gavin Shan
2015-05-13  1:16     ` Gavin Shan
2015-05-14  9:35     ` Wei Yang
2015-05-14  9:35       ` Wei Yang
2015-05-14 12:15       ` Gavin Shan
2015-05-14 12:15         ` Gavin Shan
2015-05-14 10:02     ` Wei Yang
2015-05-14 10:02       ` Wei Yang
2015-05-14 12:30       ` Gavin Shan
2015-05-14 12:30         ` Gavin Shan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150511024856.GB8816@gwshan \
    --to=gwshan@linux.vnet.ibm.com \
    --cc=bhelgaas@google.com \
    --cc=linux-pci@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=weiyang@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.