[PATCH kernel 0/2] powerpc/powernv/npu: Fixes for next tree

STALE3748d

9 messages, 3 authors, 2016-05-12 · open the first message on its own page

[PATCH kernel 0/2] powerpc/powernv/npu: Fixes for next tree

From: Alexey Kardashevskiy <hidden>
Date: 2016-05-12 05:51:01

git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git
"next" branch sha1 e682e4c needs 3 fixes to get NVLink passthrough
working (in fact 4 but the last one is goind via VFIO tree),
two of them are in this patchset; also:

35a3a27 "powerpc/powernv: Exclude root bus in pnv_pci_reset_secondary_bus()"
needs to be reverted (otherwise it produces EEH during GPU FLR reset, i.e.
each time when the guest starts and stops).


Please comment. Thanks.


Alexey Kardashevskiy (2):
  powerpc/powernv: Fix insufficient memory allocation
  powerpc/powernv/npu: Add PE to PHB's list

 arch/powerpc/platforms/powernv/pci-ioda.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

-- 
2.5.0.rc3

[PATCH kernel 1/2] powerpc/powernv: Fix insufficient memory allocation

From: Alexey Kardashevskiy <hidden>
Date: 2016-05-12 05:48:52

The pnv_pci_init_ioda_phb() helper allocates a blob to store auxilary
data such PE and M32/M64 segment allocation maps; this single blob has few
partitions, size of each is derived from the PE number -
phb->ioda.total_pe_num.

It was assumed that the minimum PE number is 8, however it is 4 for NPU
so the pe_alloc part was missing in the allocated blob.
It was invisible till recently as we were not tracking used M64 segments
and NPUs do not use M32 segments so the phb->ioda.m32_segmap
(which was pointing to the same address as phb->ioda.pe_alloc)
has never been written to leaving the pe_alloc memory intact.

After 401203ac2d "powerpc/powernv: Track M64 segment consumption"
the pe_alloc gets corrupted and PE allocation cannot work.
This fixes the issue by enforcing the minimum PE number to 8.

Signed-off-by: Alexey Kardashevskiy <redacted>
---
 arch/powerpc/platforms/powernv/pci-ioda.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
index 6cda2a8..d0d32c2 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -3507,7 +3507,8 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
 				PNV_IODA1_DMA32_SEGSIZE;
 
 	/* Allocate aux data & arrays. We don't have IO ports on PHB3 */
-	size = _ALIGN_UP(phb->ioda.total_pe_num / 8, sizeof(unsigned long));
+	size = _ALIGN_UP(max_t(unsigned, phb->ioda.total_pe_num, 8) / 8,
+			sizeof(unsigned long));
 	m64map_off = size;
 	size += phb->ioda.total_pe_num * sizeof(phb->ioda.m64_segmap[0]);
 	m32map_off = size;
-- 
2.5.0.rc3

[PATCH kernel 2/2] powerpc/powernv/npu: Add PE to PHB's list

From: Alexey Kardashevskiy <hidden>
Date: 2016-05-12 05:50:18

Before 3e68dc57 "powerpc/powernv: Remove DMA32 PE list", NPU PEs
were linked to the NPU PHB via phb->ioda.pe_dma_list; after that fix,
the phb->ioda.pe_list is used.

During the pe_dma_list removal, list_add_tail(&phb->ioda.pe_dma_list)
was removed, however no list_add() was added so does this patch.

Signed-off-by: Alexey Kardashevskiy <redacted>
---
 arch/powerpc/platforms/powernv/pci-ioda.c | 3 +++
 1 file changed, 3 insertions(+)
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
index d0d32c2..4f9e73a 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -1009,6 +1009,9 @@ static struct pnv_ioda_pe *pnv_ioda_setup_dev_PE(struct pci_dev *dev)
 		return NULL;
 	}
 
+	/* Put PE to the list */
+	list_add_tail(&pe->list, &phb->ioda.pe_list);
+
 	return pe;
 }
 
-- 
2.5.0.rc3

Re: [PATCH kernel 2/2] powerpc/powernv/npu: Add PE to PHB's list

From: Gavin Shan <hidden>
Date: 2016-05-12 06:18:07

On Thu, May 12, 2016 at 03:47:10PM +1000, Alexey Kardashevskiy wrote:
Before 3e68dc57 "powerpc/powernv: Remove DMA32 PE list", NPU PEs
were linked to the NPU PHB via phb->ioda.pe_dma_list; after that fix,
the phb->ioda.pe_list is used.

During the pe_dma_list removal, list_add_tail(&phb->ioda.pe_dma_list)
was removed, however no list_add() was added so does this patch.

Signed-off-by: Alexey Kardashevskiy <redacted>
Reviewed-by: Gavin Shan <redacted>
quoted hunk
---
arch/powerpc/platforms/powernv/pci-ioda.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
index d0d32c2..4f9e73a 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -1009,6 +1009,9 @@ static struct pnv_ioda_pe *pnv_ioda_setup_dev_PE(struct pci_dev *dev)
		return NULL;
	}

+	/* Put PE to the list */
+	list_add_tail(&pe->list, &phb->ioda.pe_list);
+
	return pe;
}

-- 
2.5.0.rc3

Re: [PATCH kernel 1/2] powerpc/powernv: Fix insufficient memory allocation

From: Gavin Shan <hidden>
Date: 2016-05-12 06:21:22

On Thu, May 12, 2016 at 03:47:09PM +1000, Alexey Kardashevskiy wrote:
The pnv_pci_init_ioda_phb() helper allocates a blob to store auxilary
data such PE and M32/M64 segment allocation maps; this single blob has few
partitions, size of each is derived from the PE number -
phb->ioda.total_pe_num.

It was assumed that the minimum PE number is 8, however it is 4 for NPU
so the pe_alloc part was missing in the allocated blob.
It was invisible till recently as we were not tracking used M64 segments
and NPUs do not use M32 segments so the phb->ioda.m32_segmap
(which was pointing to the same address as phb->ioda.pe_alloc)
has never been written to leaving the pe_alloc memory intact.

After 401203ac2d "powerpc/powernv: Track M64 segment consumption"
the pe_alloc gets corrupted and PE allocation cannot work.
This fixes the issue by enforcing the minimum PE number to 8.
As I said offline yesterday, the issue exists from day-1 when NPU PHB
is supported. I don't think it's related to 401203ac2d. Without the logic
tracking M64 segments, the PE# bitmap still can be corrupted when writting
to M32 segment map. It's confusing to mention a unrelated commit in the
changelog.

Since the issue exists from day-1 when NPU PHB is supported, is a stable
tag needed?
Signed-off-by: Alexey Kardashevskiy <redacted>
With above parts fixed:

Reviewed-by: Gavin Shan <redacted>
quoted hunk
---
arch/powerpc/platforms/powernv/pci-ioda.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
index 6cda2a8..d0d32c2 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -3507,7 +3507,8 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
				PNV_IODA1_DMA32_SEGSIZE;

	/* Allocate aux data & arrays. We don't have IO ports on PHB3 */
-	size = _ALIGN_UP(phb->ioda.total_pe_num / 8, sizeof(unsigned long));
+	size = _ALIGN_UP(max_t(unsigned, phb->ioda.total_pe_num, 8) / 8,
+			sizeof(unsigned long));
	m64map_off = size;
	size += phb->ioda.total_pe_num * sizeof(phb->ioda.m64_segmap[0]);
	m32map_off = size;
-- 
2.5.0.rc3

Re: [PATCH kernel 1/2] powerpc/powernv: Fix insufficient memory allocation

From: Alexey Kardashevskiy <hidden>
Date: 2016-05-12 06:40:05

On 05/12/2016 04:09 PM, Gavin Shan wrote:
On Thu, May 12, 2016 at 03:47:09PM +1000, Alexey Kardashevskiy wrote:
quoted
The pnv_pci_init_ioda_phb() helper allocates a blob to store auxilary
data such PE and M32/M64 segment allocation maps; this single blob has few
partitions, size of each is derived from the PE number -
phb->ioda.total_pe_num.

It was assumed that the minimum PE number is 8, however it is 4 for NPU
so the pe_alloc part was missing in the allocated blob.
It was invisible till recently as we were not tracking used M64 segments
and NPUs do not use M32 segments so the phb->ioda.m32_segmap
(which was pointing to the same address as phb->ioda.pe_alloc)
has never been written to leaving the pe_alloc memory intact.

After 401203ac2d "powerpc/powernv: Track M64 segment consumption"
the pe_alloc gets corrupted and PE allocation cannot work.
This fixes the issue by enforcing the minimum PE number to 8.
As I said offline yesterday, the issue exists from day-1 when NPU PHB
is supported. I don't think it's related to 401203ac2d. Without the logic
tracking M64 segments, the PE# bitmap still can be corrupted when writting
to M32 segment map. It's confusing to mention a unrelated commit in the
changelog.

The bug exists from day 1. The actual corruption started happening from 
401203ac2d, it could be happening before but it was not.
Since the issue exists from day-1 when NPU PHB is supported, is a stable
tag needed?
quoted
Signed-off-by: Alexey Kardashevskiy <redacted>
With above parts fixed:

Reviewed-by: Gavin Shan <redacted>
quoted
---
arch/powerpc/platforms/powernv/pci-ioda.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
index 6cda2a8..d0d32c2 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -3507,7 +3507,8 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
				PNV_IODA1_DMA32_SEGSIZE;

	/* Allocate aux data & arrays. We don't have IO ports on PHB3 */
-	size = _ALIGN_UP(phb->ioda.total_pe_num / 8, sizeof(unsigned long));
+	size = _ALIGN_UP(max_t(unsigned, phb->ioda.total_pe_num, 8) / 8,
+			sizeof(unsigned long));
	m64map_off = size;
	size += phb->ioda.total_pe_num * sizeof(phb->ioda.m64_segmap[0]);
	m32map_off = size;
--
2.5.0.rc3

-- 
Alexey

Re: [PATCH kernel 1/2] powerpc/powernv: Fix insufficient memory allocation

From: Gavin Shan <hidden>
Date: 2016-05-12 07:56:04

On Thu, May 12, 2016 at 04:39:57PM +1000, Alexey Kardashevskiy wrote:
On 05/12/2016 04:09 PM, Gavin Shan wrote:
quoted
On Thu, May 12, 2016 at 03:47:09PM +1000, Alexey Kardashevskiy wrote:
quoted
The pnv_pci_init_ioda_phb() helper allocates a blob to store auxilary
data such PE and M32/M64 segment allocation maps; this single blob has few
partitions, size of each is derived from the PE number -
phb->ioda.total_pe_num.

It was assumed that the minimum PE number is 8, however it is 4 for NPU
so the pe_alloc part was missing in the allocated blob.
It was invisible till recently as we were not tracking used M64 segments
and NPUs do not use M32 segments so the phb->ioda.m32_segmap
(which was pointing to the same address as phb->ioda.pe_alloc)
has never been written to leaving the pe_alloc memory intact.

After 401203ac2d "powerpc/powernv: Track M64 segment consumption"
the pe_alloc gets corrupted and PE allocation cannot work.
This fixes the issue by enforcing the minimum PE number to 8.
As I said offline yesterday, the issue exists from day-1 when NPU PHB
is supported. I don't think it's related to 401203ac2d. Without the logic
tracking M64 segments, the PE# bitmap still can be corrupted when writting
to M32 segment map. It's confusing to mention a unrelated commit in the
changelog.

The bug exists from day 1. The actual corruption started happening from
401203ac2d, it could be happening before but it was not.
well, Are you sure it starts from 401203ac2d? I would believe it starts
from commit 3fa23ff ("powerpc/powernv: Fix initial IO and M32 segmap").
Please fix the commit log.
quoted
Since the issue exists from day-1 when NPU PHB is supported, is a stable
tag needed?
quoted
Signed-off-by: Alexey Kardashevskiy <redacted>
With above parts fixed:

Reviewed-by: Gavin Shan <redacted>
quoted
---
arch/powerpc/platforms/powernv/pci-ioda.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
index 6cda2a8..d0d32c2 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -3507,7 +3507,8 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
			PNV_IODA1_DMA32_SEGSIZE;

/* Allocate aux data & arrays. We don't have IO ports on PHB3 */
-	size = _ALIGN_UP(phb->ioda.total_pe_num / 8, sizeof(unsigned long));
+	size = _ALIGN_UP(max_t(unsigned, phb->ioda.total_pe_num, 8) / 8,
+			sizeof(unsigned long));
m64map_off = size;
size += phb->ioda.total_pe_num * sizeof(phb->ioda.m64_segmap[0]);
m32map_off = size;
--
2.5.0.rc3

-- 
Alexey

Re: [kernel,1/2] powerpc/powernv: Fix insufficient memory allocation

From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2016-05-12 11:32:43

On Thu, 2016-12-05 at 05:47:09 UTC, Alexey Kardashevskiy wrote:
The pnv_pci_init_ioda_phb() helper allocates a blob to store auxilary
data such PE and M32/M64 segment allocation maps; this single blob has few
partitions, size of each is derived from the PE number -
phb->ioda.total_pe_num.

It was assumed that the minimum PE number is 8, however it is 4 for NPU
so the pe_alloc part was missing in the allocated blob.
It was invisible till recently as we were not tracking used M64 segments
and NPUs do not use M32 segments so the phb->ioda.m32_segmap
(which was pointing to the same address as phb->ioda.pe_alloc)
has never been written to leaving the pe_alloc memory intact.

After 401203ac2d "powerpc/powernv: Track M64 segment consumption"
the pe_alloc gets corrupted and PE allocation cannot work.
This fixes the issue by enforcing the minimum PE number to 8.

Signed-off-by: Alexey Kardashevskiy <redacted>
Reviewed-by: Gavin Shan <redacted>
Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/92a86756904b127a3450262b33

cheers

Re: [kernel,2/2] powerpc/powernv/npu: Add PE to PHB's list

From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2016-05-12 11:32:43

On Thu, 2016-12-05 at 05:47:10 UTC, Alexey Kardashevskiy wrote:
Before 3e68dc57 "powerpc/powernv: Remove DMA32 PE list", NPU PEs
were linked to the NPU PHB via phb->ioda.pe_dma_list; after that fix,
the phb->ioda.pe_list is used.

During the pe_dma_list removal, list_add_tail(&phb->ioda.pe_dma_list)
was removed, however no list_add() was added so does this patch.

Signed-off-by: Alexey Kardashevskiy <redacted>
Reviewed-by: Gavin Shan <redacted>
Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/1d4e89cf0a4e819fbde428e9e5

cheers
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help