RE: [RFC PATCH 5/5] powerpc/smp: Remap boot CPU onto core 0 if >= nr_cpu_ids

2024-02-13 Thread Wen Xiong
>>And loop in Wen Xiong and Ming Lei, who care for this issue too.


Hi Pingfan, Thanks for your email!

Hi Michael,

Thanks for your new patchset!

In past month, Our several test team have modified /etc/sysconfig/kdump file 
with nr_cpus=1, triggered kdump over the following IO devices and  kdump works 
fine with generating vmcore file.

Test kernel:  the latest upstream kernel + your patchset
  the latest rhel94 kernel + backport of your patchset

Test hardware: Nvme drives, FC adapter, NVmf-over-FC

Test device drivers: nvme, lpfc, nvme-fc

Thanks for your work! Please consideration for inclusion in upstream kernel.

Thanks for your help!
Wendy

> the problems that have been seen. I've tested this fairly thoroughly 
> with a qemu script, and also a few boots on a real machine.
>
> If you can test it with your setups that would be great. Hopefully 
> there isn't some obscure case I've missed.
>
> cheers
>



RE: [PATCHv7 2/4] powerpc/setup: Loosen the mapping between cpu logical id and its seq in dt

2023-09-28 Thread Wen Xiong
Hi Pingfan,

+   avail = intserv_node->avail;
+   nthreads = intserv_node->len / sizeof(int);
+   for (j = 0; j < nthreads && cpu < nr_cpu_ids; j++) {
set_cpu_present(cpu, avail);
set_cpu_possible(cpu, true);
-   cpu_to_phys_id[cpu] = be32_to_cpu(intserv[j]);
+   cpu_to_phys_id[cpu] = 
be32_to_cpu(intserv_node->intserv[j]);
+   DBG("thread %d -> cpu %d (hard id %d)\n",
+   j, cpu, be32_to_cpu(intserv[j]));

Intserv is not defined. Should "be32_to_cpu(intserv_node->intserv[j])?
cpu++;
}
+   }

-Original Message-
From: Pingfan Liu  
Sent: Monday, September 25, 2023 2:54 AM
To: linuxppc-dev@lists.ozlabs.org
Cc: Pingfan Liu ; Michael Ellerman ; 
Nicholas Piggin ; Christophe Leroy 
; Mahesh Salgaonkar ; Wen 
Xiong ; Baoquan He ; Ming Lei 
; ke...@lists.infradead.org
Subject: [EXTERNAL] [PATCHv7 2/4] powerpc/setup: Loosen the mapping between cpu 
logical id and its seq in dt

*** Idea ***
For kexec -p, the boot cpu can be not the cpu0, this causes the problem of 
allocating memory for paca_ptrs[]. However, in theory, there is no requirement 
to assign cpu's logical id as its present sequence in the device tree. But 
there is something like cpu_first_thread_sibling(), which makes assumption on 
the mapping inside a core. Hence partially loosening the mapping, i.e. unbind 
the mapping of core while keep the mapping inside a core.

*** Implement ***
At this early stage, there are plenty of memory to utilize. Hence, this patch 
allocates interim memory to link the cpu info on a list, then reorder cpus by 
changing the list head. As a result, there is a rotate shift between the 
sequence number in dt and the cpu logical number.

*** Result ***
After this patch, a boot-cpu's logical id will always be mapped into the range 
[0,threads_per_core).

Besides this, at this phase, all threads in the boot core are forced to be 
onlined. This restriction will be lifted in a later patch with extra effort.

Signed-off-by: Pingfan Liu 
Cc: Michael Ellerman 
Cc: Nicholas Piggin 
Cc: Christophe Leroy 
Cc: Mahesh Salgaonkar 
Cc: Wen Xiong 
Cc: Baoquan He 
Cc: Ming Lei 
Cc: ke...@lists.infradead.org
To: linuxppc-dev@lists.ozlabs.org
---
 arch/powerpc/kernel/prom.c | 25 +
 arch/powerpc/kernel/setup-common.c | 87 +++---
 2 files changed, 85 insertions(+), 27 deletions(-)

diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 
ec82f5bda908..87272a2d8c10 100644
--- a/arch/powerpc/kernel/prom.c
+++ b/arch/powerpc/kernel/prom.c
@@ -76,7 +76,9 @@ u64 ppc64_rma_size;
 unsigned int boot_cpu_node_count __ro_after_init;  #endif  static phys_addr_t 
first_memblock_size;
+#ifdef CONFIG_SMP
 static int __initdata boot_cpu_count;
+#endif
 
 static int __init early_parse_mem(char *p)  { @@ -331,8 +333,7 @@ static int 
__init early_init_dt_scan_cpus(unsigned long node,
const __be32 *intserv;
int i, nthreads;
int len;
-   int found = -1;
-   int found_thread = 0;
+   bool found = false;
 
/* We are scanning "cpu" nodes only */
if (type == NULL || strcmp(type, "cpu") != 0) @@ -355,8 +356,15 @@ 
static int __init early_init_dt_scan_cpus(unsigned long node,
for (i = 0; i < nthreads; i++) {
if (be32_to_cpu(intserv[i]) ==
fdt_boot_cpuid_phys(initial_boot_params)) {
-   found = boot_cpu_count;
-   found_thread = i;
+   /*
+* always map the boot-cpu logical id into the
+* range of [0, thread_per_core)
+*/
+   boot_cpuid = i;
+   found = true;
+   /* This works around the hole in paca_ptrs[]. */
+   if (nr_cpu_ids < nthreads)
+   set_nr_cpu_ids(nthreads);
}
 #ifdef CONFIG_SMP
/* logical cpu id is always 0 on UP kernels */ @@ -365,14 
+373,13 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
}
 
/* Not the boot CPU */
-   if (found < 0)
+   if (!found)
return 0;
 
-   DBG("boot cpu: logical %d physical %d\n", found,
-   be32_to_cpu(intserv[found_thread]));
-   boot_cpuid = found;
+   DBG("boot cpu: logical %d physical %d\n", boot_cpuid,
+   be32_to_cpu(intserv[boot_cpuid]));
 
-   boot_cpu_hwid = be32_to_cpu(intserv[found_thread]);
+   boot_cpu_hwid = be32_to_cpu(intserv[boot_cpuid]);
 
/*
 * PAPR defines "logical" PVR values for cpus that diff --git 
a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kerne

Re: [PATCH kernel] powerpc/pseries/ddw: Extend upper limit for huge DMA window for persistent memory

2020-04-02 Thread Wen Xiong
I applied the patch on top of the latest upstream kernel. I ran HTX over pmem nodes for several hours and it works.
 
Tested-by: Wen Xiong
 
Thanks,
Wendy
- Original message -From: Alexey Kardashevskiy To: linuxppc-dev@lists.ozlabs.orgCc: Alexey Kardashevskiy , David Gibson , Michael Ellerman , Oliver O'Halloran , "Aneesh Kumar K . V" , Wen Xiong , Brian J King Subject: [EXTERNAL] [PATCH kernel] powerpc/pseries/ddw: Extend upper limit for huge DMA window for persistent memoryDate: Mon, Mar 30, 2020 8:23 PM 
Unlike normal memory ("memory" compatible type in the FDT),the persistent memory ("ibm,pmemory" in the FDT) can be mapped anywherein the guest physical space and it can be used for DMA.In order to maintain 1:1 mapping via the huge DMA window, we need toknow the maximum physical address at the time of the window setup.So far we've been looking at "memory" nodes but "ibm,pmemory" does nothave fixed addresses and the persistent memory may be mapped afterwards.Since the persistent memory is still backed with page structs,use MAX_PHYSMEM_BITS as the upper limit.This effectively disables huge DMA window in LPAR under pHyp ifpersistent memory is present but this is the best we can do.Signed-off-by: Alexey Kardashevskiy --- arch/powerpc/platforms/pseries/iommu.c | 9 + 1 file changed, 9 insertions(+)diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.cindex 2e0a8eab5588..6d47b4a3ce39 100644--- a/arch/powerpc/platforms/pseries/iommu.c+++ b/arch/powerpc/platforms/pseries/iommu.c@@ -945,6 +945,15 @@ static phys_addr_t ddw_memory_hotplug_max(void)  phys_addr_t max_addr = memory_hotplug_max();  struct device_node *memory; + /*+ * The "ibm,pmemory" can appear anywhere in the address space.+ * Assuming it is still backed by page structs, set the upper limit+ * for the huge DMA window as MAX_PHYSMEM_BITS.+ */+ if (of_find_node_by_type(NULL, "ibm,pmemory"))+ return (sizeof(phys_addr_t) * 8 <= MAX_PHYSMEM_BITS) ?+ (phys_addr_t) -1 : (1ULL << MAX_PHYSMEM_BITS);+  for_each_node_by_type(memory, "memory") {  unsigned long start, size;  int n_mem_addr_cells, n_mem_size_cells, len;--2.17.1