Message ID | 20220128185449.64936-3-imbrenda@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | s390x: smp: avoid hardcoded CPU addresses | expand |
On 28.01.22 19:54, Claudio Imbrenda wrote: > Guarantee that the boot CPU has index 0. This simplifies the > implementation of tests that require multiple CPUs. > > Also fix a small bug in the allocation of the cpus array. > > Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com> > Fixes: f77c0515 ("s390x: Add initial smp code") > Fixes: 52076a63 ("s390x: Consolidate sclp read info") > --- > lib/s390x/smp.c | 16 ++++++++-------- > 1 file changed, 8 insertions(+), 8 deletions(-) > > diff --git a/lib/s390x/smp.c b/lib/s390x/smp.c > index 64c647ec..01f513f0 100644 > --- a/lib/s390x/smp.c > +++ b/lib/s390x/smp.c > @@ -25,7 +25,6 @@ > #include "sclp.h" > > static struct cpu *cpus; > -static struct cpu *cpu0; > static struct spinlock lock; > > extern void smp_cpu_setup_state(void); > @@ -81,7 +80,7 @@ static int smp_cpu_stop_nolock(uint16_t addr, bool store) > uint8_t order = store ? SIGP_STOP_AND_STORE_STATUS : SIGP_STOP; > > cpu = smp_cpu_from_addr(addr); > - if (!cpu || cpu == cpu0) > + if (!cpu || addr == cpus[0].addr) > return -1; > > if (sigp_retry(addr, order, 0, NULL)) > @@ -205,7 +204,7 @@ int smp_cpu_setup(uint16_t addr, struct psw psw) > sigp_retry(cpu->addr, SIGP_SET_PREFIX, (unsigned long )lc, NULL); > > /* Copy all exception psws. */ > - memcpy(lc, cpu0->lowcore, 512); > + memcpy(lc, cpus[0].lowcore, 512); > > /* Setup stack */ > cpu->stack = (uint64_t *)alloc_pages(2); > @@ -263,15 +262,16 @@ void smp_setup(void) > if (num > 1) > printf("SMP: Initializing, found %d cpus\n", num); > > - cpus = calloc(num, sizeof(cpus)); > + cpus = calloc(num, sizeof(*cpus)); > for (i = 0; i < num; i++) { > cpus[i].addr = entry[i].address; > cpus[i].active = false; > if (entry[i].address == cpu0_addr) { > - cpu0 = &cpus[i]; > - cpu0->stack = stackptr; > - cpu0->lowcore = (void *)0; > - cpu0->active = true; > + cpus[i].addr = cpus[0].addr; Might deserve a comment that we'll move the the boot CPU to index 0. What's the expected behavior if i == 0?
On Mon, 31 Jan 2022 14:55:09 +0100 David Hildenbrand <david@redhat.com> wrote: > On 28.01.22 19:54, Claudio Imbrenda wrote: > > Guarantee that the boot CPU has index 0. This simplifies the > > implementation of tests that require multiple CPUs. > > > > Also fix a small bug in the allocation of the cpus array. > > > > Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com> > > Fixes: f77c0515 ("s390x: Add initial smp code") > > Fixes: 52076a63 ("s390x: Consolidate sclp read info") > > --- > > lib/s390x/smp.c | 16 ++++++++-------- > > 1 file changed, 8 insertions(+), 8 deletions(-) > > > > diff --git a/lib/s390x/smp.c b/lib/s390x/smp.c > > index 64c647ec..01f513f0 100644 > > --- a/lib/s390x/smp.c > > +++ b/lib/s390x/smp.c > > @@ -25,7 +25,6 @@ > > #include "sclp.h" > > > > static struct cpu *cpus; > > -static struct cpu *cpu0; > > static struct spinlock lock; > > > > extern void smp_cpu_setup_state(void); > > @@ -81,7 +80,7 @@ static int smp_cpu_stop_nolock(uint16_t addr, bool store) > > uint8_t order = store ? SIGP_STOP_AND_STORE_STATUS : SIGP_STOP; > > > > cpu = smp_cpu_from_addr(addr); > > - if (!cpu || cpu == cpu0) > > + if (!cpu || addr == cpus[0].addr) > > return -1; > > > > if (sigp_retry(addr, order, 0, NULL)) > > @@ -205,7 +204,7 @@ int smp_cpu_setup(uint16_t addr, struct psw psw) > > sigp_retry(cpu->addr, SIGP_SET_PREFIX, (unsigned long )lc, NULL); > > > > /* Copy all exception psws. */ > > - memcpy(lc, cpu0->lowcore, 512); > > + memcpy(lc, cpus[0].lowcore, 512); > > > > /* Setup stack */ > > cpu->stack = (uint64_t *)alloc_pages(2); > > @@ -263,15 +262,16 @@ void smp_setup(void) > > if (num > 1) > > printf("SMP: Initializing, found %d cpus\n", num); > > > > - cpus = calloc(num, sizeof(cpus)); > > + cpus = calloc(num, sizeof(*cpus)); > > for (i = 0; i < num; i++) { > > cpus[i].addr = entry[i].address; > > cpus[i].active = false; > > if (entry[i].address == cpu0_addr) { > > - cpu0 = &cpus[i]; > > - cpu0->stack = stackptr; > > - cpu0->lowcore = (void *)0; > > - cpu0->active = true; > > + cpus[i].addr = cpus[0].addr; > > Might deserve a comment that we'll move the the boot CPU to index 0. fair enough. > > What's the expected behavior if i == 0? > in that case, the boot CPU was already the one with index 0. The code will do a few extra useless steps, but in the end everything should Just Workâ˘
diff --git a/lib/s390x/smp.c b/lib/s390x/smp.c index 64c647ec..01f513f0 100644 --- a/lib/s390x/smp.c +++ b/lib/s390x/smp.c @@ -25,7 +25,6 @@ #include "sclp.h" static struct cpu *cpus; -static struct cpu *cpu0; static struct spinlock lock; extern void smp_cpu_setup_state(void); @@ -81,7 +80,7 @@ static int smp_cpu_stop_nolock(uint16_t addr, bool store) uint8_t order = store ? SIGP_STOP_AND_STORE_STATUS : SIGP_STOP; cpu = smp_cpu_from_addr(addr); - if (!cpu || cpu == cpu0) + if (!cpu || addr == cpus[0].addr) return -1; if (sigp_retry(addr, order, 0, NULL)) @@ -205,7 +204,7 @@ int smp_cpu_setup(uint16_t addr, struct psw psw) sigp_retry(cpu->addr, SIGP_SET_PREFIX, (unsigned long )lc, NULL); /* Copy all exception psws. */ - memcpy(lc, cpu0->lowcore, 512); + memcpy(lc, cpus[0].lowcore, 512); /* Setup stack */ cpu->stack = (uint64_t *)alloc_pages(2); @@ -263,15 +262,16 @@ void smp_setup(void) if (num > 1) printf("SMP: Initializing, found %d cpus\n", num); - cpus = calloc(num, sizeof(cpus)); + cpus = calloc(num, sizeof(*cpus)); for (i = 0; i < num; i++) { cpus[i].addr = entry[i].address; cpus[i].active = false; if (entry[i].address == cpu0_addr) { - cpu0 = &cpus[i]; - cpu0->stack = stackptr; - cpu0->lowcore = (void *)0; - cpu0->active = true; + cpus[i].addr = cpus[0].addr; + cpus[0].addr = cpu0_addr; + cpus[0].stack = stackptr; + cpus[0].lowcore = (void *)0; + cpus[0].active = true; } } spin_unlock(&lock);
Guarantee that the boot CPU has index 0. This simplifies the implementation of tests that require multiple CPUs. Also fix a small bug in the allocation of the cpus array. Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com> Fixes: f77c0515 ("s390x: Add initial smp code") Fixes: 52076a63 ("s390x: Consolidate sclp read info") --- lib/s390x/smp.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)