s390/smp: remove redundant pcpu::lowcore member
Per-CPU pointer to lowcore is stored in global lowcore_ptr[] array and duplicated in struct pcpu::lowcore member. This update removes the redundancy. Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com> Reviewed-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
This commit is contained in:
Родитель
587704efb3
Коммит
d2e834c62d
|
@ -74,7 +74,6 @@ enum {
|
|||
static DEFINE_PER_CPU(struct cpu *, cpu_device);
|
||||
|
||||
struct pcpu {
|
||||
struct lowcore *lowcore; /* lowcore page(s) for the cpu */
|
||||
unsigned long ec_mask; /* bit mask for ec_xxx functions */
|
||||
unsigned long ec_clk; /* sigp timestamp for ec_xxx */
|
||||
signed char state; /* physical cpu state */
|
||||
|
@ -214,7 +213,6 @@ static int pcpu_alloc_lowcore(struct pcpu *pcpu, int cpu)
|
|||
if (nmi_alloc_per_cpu(lc))
|
||||
goto out;
|
||||
lowcore_ptr[cpu] = lc;
|
||||
pcpu->lowcore = lc;
|
||||
pcpu_sigp_retry(pcpu, SIGP_SET_PREFIX, (u32)(unsigned long) lc);
|
||||
return 0;
|
||||
|
||||
|
@ -230,14 +228,15 @@ static void pcpu_free_lowcore(struct pcpu *pcpu)
|
|||
{
|
||||
unsigned long async_stack, nodat_stack, mcck_stack;
|
||||
struct lowcore *lc;
|
||||
int cpu;
|
||||
|
||||
lc = pcpu->lowcore;
|
||||
cpu = pcpu - pcpu_devices;
|
||||
lc = lowcore_ptr[cpu];
|
||||
nodat_stack = lc->nodat_stack - STACK_INIT_OFFSET;
|
||||
async_stack = lc->async_stack - STACK_INIT_OFFSET;
|
||||
mcck_stack = lc->mcck_stack - STACK_INIT_OFFSET;
|
||||
pcpu_sigp_retry(pcpu, SIGP_SET_PREFIX, 0);
|
||||
lowcore_ptr[pcpu - pcpu_devices] = NULL;
|
||||
pcpu->lowcore = NULL;
|
||||
lowcore_ptr[cpu] = NULL;
|
||||
nmi_free_per_cpu(lc);
|
||||
stack_free(async_stack);
|
||||
stack_free(mcck_stack);
|
||||
|
@ -247,7 +246,7 @@ static void pcpu_free_lowcore(struct pcpu *pcpu)
|
|||
|
||||
static void pcpu_prepare_secondary(struct pcpu *pcpu, int cpu)
|
||||
{
|
||||
struct lowcore *lc = pcpu->lowcore;
|
||||
struct lowcore *lc = lowcore_ptr[cpu];
|
||||
|
||||
cpumask_set_cpu(cpu, &init_mm.context.cpu_attach_mask);
|
||||
cpumask_set_cpu(cpu, mm_cpumask(&init_mm));
|
||||
|
@ -269,8 +268,11 @@ static void pcpu_prepare_secondary(struct pcpu *pcpu, int cpu)
|
|||
|
||||
static void pcpu_attach_task(struct pcpu *pcpu, struct task_struct *tsk)
|
||||
{
|
||||
struct lowcore *lc = pcpu->lowcore;
|
||||
struct lowcore *lc;
|
||||
int cpu;
|
||||
|
||||
cpu = pcpu - pcpu_devices;
|
||||
lc = lowcore_ptr[cpu];
|
||||
lc->kernel_stack = (unsigned long) task_stack_page(tsk)
|
||||
+ THREAD_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs);
|
||||
lc->current_task = (unsigned long) tsk;
|
||||
|
@ -286,8 +288,11 @@ static void pcpu_attach_task(struct pcpu *pcpu, struct task_struct *tsk)
|
|||
|
||||
static void pcpu_start_fn(struct pcpu *pcpu, void (*func)(void *), void *data)
|
||||
{
|
||||
struct lowcore *lc = pcpu->lowcore;
|
||||
struct lowcore *lc;
|
||||
int cpu;
|
||||
|
||||
cpu = pcpu - pcpu_devices;
|
||||
lc = lowcore_ptr[cpu];
|
||||
lc->restart_stack = lc->nodat_stack;
|
||||
lc->restart_fn = (unsigned long) func;
|
||||
lc->restart_data = (unsigned long) data;
|
||||
|
@ -372,7 +377,7 @@ void smp_call_online_cpu(void (*func)(void *), void *data)
|
|||
*/
|
||||
void smp_call_ipl_cpu(void (*func)(void *), void *data)
|
||||
{
|
||||
struct lowcore *lc = pcpu_devices->lowcore;
|
||||
struct lowcore *lc = lowcore_ptr[0];
|
||||
|
||||
if (pcpu_devices[0].address == stap())
|
||||
lc = &S390_lowcore;
|
||||
|
@ -585,18 +590,21 @@ EXPORT_SYMBOL(smp_ctl_clear_bit);
|
|||
|
||||
int smp_store_status(int cpu)
|
||||
{
|
||||
struct pcpu *pcpu = pcpu_devices + cpu;
|
||||
struct lowcore *lc;
|
||||
struct pcpu *pcpu;
|
||||
unsigned long pa;
|
||||
|
||||
pa = __pa(&pcpu->lowcore->floating_pt_save_area);
|
||||
pcpu = pcpu_devices + cpu;
|
||||
lc = lowcore_ptr[cpu];
|
||||
pa = __pa(&lc->floating_pt_save_area);
|
||||
if (__pcpu_sigp_relax(pcpu->address, SIGP_STORE_STATUS_AT_ADDRESS,
|
||||
pa) != SIGP_CC_ORDER_CODE_ACCEPTED)
|
||||
return -EIO;
|
||||
if (!MACHINE_HAS_VX && !MACHINE_HAS_GS)
|
||||
return 0;
|
||||
pa = __pa(pcpu->lowcore->mcesad & MCESA_ORIGIN_MASK);
|
||||
pa = __pa(lc->mcesad & MCESA_ORIGIN_MASK);
|
||||
if (MACHINE_HAS_GS)
|
||||
pa |= pcpu->lowcore->mcesad & MCESA_LC_MASK;
|
||||
pa |= lc->mcesad & MCESA_LC_MASK;
|
||||
if (__pcpu_sigp_relax(pcpu->address, SIGP_STORE_ADDITIONAL_STATUS,
|
||||
pa) != SIGP_CC_ORDER_CODE_ACCEPTED)
|
||||
return -EIO;
|
||||
|
@ -997,7 +1005,6 @@ void __init smp_prepare_boot_cpu(void)
|
|||
|
||||
WARN_ON(!cpu_present(0) || !cpu_online(0));
|
||||
pcpu->state = CPU_STATE_CONFIGURED;
|
||||
pcpu->lowcore = (struct lowcore *)(unsigned long) store_prefix();
|
||||
S390_lowcore.percpu_offset = __per_cpu_offset[0];
|
||||
smp_cpu_set_polarization(0, POLARIZATION_UNKNOWN);
|
||||
}
|
||||
|
@ -1264,7 +1271,6 @@ static int __init smp_reinit_ipl_cpu(void)
|
|||
S390_lowcore.async_stack = async_stack + STACK_INIT_OFFSET;
|
||||
S390_lowcore.mcck_stack = mcck_stack + STACK_INIT_OFFSET;
|
||||
lowcore_ptr[0] = lc;
|
||||
pcpu_devices[0].lowcore = lc;
|
||||
local_mcck_enable();
|
||||
local_irq_restore(flags);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче