Skip to content

Commit

Permalink
powerpc: Abstract indexing of lppaca structs
Browse files Browse the repository at this point in the history
Currently we have the lppaca structs as a simple array of NR_CPUS
entries, taking up space in the data section of the kernel image.
In future we would like to allocate them dynamically, so this
abstracts out the accesses to the array, making it easier to
change how we locate the lppaca for a given cpu in future.
Specifically, lppaca[cpu] changes to lppaca_of(cpu).

Signed-off-by: Paul Mackerras <[email protected]>
Signed-off-by: Benjamin Herrenschmidt <[email protected]>
  • Loading branch information
paulusmack authored and ozbenh committed Sep 2, 2010
1 parent e1f0ece commit 8154c5d
Show file tree
Hide file tree
Showing 7 changed files with 20 additions and 18 deletions.
2 changes: 2 additions & 0 deletions arch/powerpc/include/asm/lppaca.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,8 @@ struct lppaca {

extern struct lppaca lppaca[];

#define lppaca_of(cpu) (lppaca[cpu])

/*
* SLB shadow buffer structure as defined in the PAPR. The save_area
* contains adjacent ESID and VSID pairs for each shadowed SLB. The
Expand Down
14 changes: 7 additions & 7 deletions arch/powerpc/kernel/lparcfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ static unsigned long get_purr(void)

for_each_possible_cpu(cpu) {
if (firmware_has_feature(FW_FEATURE_ISERIES))
sum_purr += lppaca[cpu].emulated_time_base;
sum_purr += lppaca_of(cpu).emulated_time_base;
else {
struct cpu_usage *cu;

Expand Down Expand Up @@ -263,7 +263,7 @@ static void parse_ppp_data(struct seq_file *m)
ppp_data.active_system_procs);

/* pool related entries are apropriate for shared configs */
if (lppaca[0].shared_proc) {
if (lppaca_of(0).shared_proc) {
unsigned long pool_idle_time, pool_procs;

seq_printf(m, "pool=%d\n", ppp_data.pool_num);
Expand Down Expand Up @@ -460,8 +460,8 @@ static void pseries_cmo_data(struct seq_file *m)
return;

for_each_possible_cpu(cpu) {
cmo_faults += lppaca[cpu].cmo_faults;
cmo_fault_time += lppaca[cpu].cmo_fault_time;
cmo_faults += lppaca_of(cpu).cmo_faults;
cmo_fault_time += lppaca_of(cpu).cmo_fault_time;
}

seq_printf(m, "cmo_faults=%lu\n", cmo_faults);
Expand All @@ -479,8 +479,8 @@ static void splpar_dispatch_data(struct seq_file *m)
unsigned long dispatch_dispersions = 0;

for_each_possible_cpu(cpu) {
dispatches += lppaca[cpu].yield_count;
dispatch_dispersions += lppaca[cpu].dispersion_count;
dispatches += lppaca_of(cpu).yield_count;
dispatch_dispersions += lppaca_of(cpu).dispersion_count;
}

seq_printf(m, "dispatches=%lu\n", dispatches);
Expand Down Expand Up @@ -545,7 +545,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
seq_printf(m, "partition_potential_processors=%d\n",
partition_potential_processors);

seq_printf(m, "shared_processor_mode=%d\n", lppaca[0].shared_proc);
seq_printf(m, "shared_processor_mode=%d\n", lppaca_of(0).shared_proc);

seq_printf(m, "slb_size=%d\n", mmu_slb_size);

Expand Down
4 changes: 2 additions & 2 deletions arch/powerpc/lib/locks.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ void __spin_yield(arch_spinlock_t *lock)
return;
holder_cpu = lock_value & 0xffff;
BUG_ON(holder_cpu >= NR_CPUS);
yield_count = lppaca[holder_cpu].yield_count;
yield_count = lppaca_of(holder_cpu).yield_count;
if ((yield_count & 1) == 0)
return; /* virtual cpu is currently running */
rmb();
Expand Down Expand Up @@ -65,7 +65,7 @@ void __rw_yield(arch_rwlock_t *rw)
return; /* no write lock at present */
holder_cpu = lock_value & 0xffff;
BUG_ON(holder_cpu >= NR_CPUS);
yield_count = lppaca[holder_cpu].yield_count;
yield_count = lppaca_of(holder_cpu).yield_count;
if ((yield_count & 1) == 0)
return; /* virtual cpu is currently running */
rmb();
Expand Down
4 changes: 2 additions & 2 deletions arch/powerpc/platforms/iseries/dt.c
Original file line number Diff line number Diff line change
Expand Up @@ -243,15 +243,15 @@ static void __init dt_cpus(struct iseries_flat_dt *dt)
pft_size[1] = __ilog2(HvCallHpt_getHptPages() * HW_PAGE_SIZE);

for (i = 0; i < NR_CPUS; i++) {
if (lppaca[i].dyn_proc_status >= 2)
if (lppaca_of(i).dyn_proc_status >= 2)
continue;

snprintf(p, 32 - (p - buf), "@%d", i);
dt_start_node(dt, buf);

dt_prop_str(dt, "device_type", device_type_cpu);

index = lppaca[i].dyn_hv_phys_proc_index;
index = lppaca_of(i).dyn_hv_phys_proc_index;
d = &xIoHriProcessorVpd[index];

dt_prop_u32(dt, "i-cache-size", d->xInstCacheSize * 1024);
Expand Down
2 changes: 1 addition & 1 deletion arch/powerpc/platforms/iseries/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ static void smp_iSeries_kick_cpu(int nr)
BUG_ON((nr < 0) || (nr >= NR_CPUS));

/* Verify that our partition has a processor nr */
if (lppaca[nr].dyn_proc_status >= 2)
if (lppaca_of(nr).dyn_proc_status >= 2)
return;

/* The processor is currently spinning, waiting
Expand Down
8 changes: 4 additions & 4 deletions arch/powerpc/platforms/pseries/dtl.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,14 +107,14 @@ static int dtl_enable(struct dtl *dtl)
}

/* set our initial buffer indices */
dtl->last_idx = lppaca[dtl->cpu].dtl_idx = 0;
dtl->last_idx = lppaca_of(dtl->cpu).dtl_idx = 0;

/* ensure that our updates to the lppaca fields have occurred before
* we actually enable the logging */
smp_wmb();

/* enable event logging */
lppaca[dtl->cpu].dtl_enable_mask = dtl_event_mask;
lppaca_of(dtl->cpu).dtl_enable_mask = dtl_event_mask;

return 0;
}
Expand All @@ -123,7 +123,7 @@ static void dtl_disable(struct dtl *dtl)
{
int hwcpu = get_hard_smp_processor_id(dtl->cpu);

lppaca[dtl->cpu].dtl_enable_mask = 0x0;
lppaca_of(dtl->cpu).dtl_enable_mask = 0x0;

unregister_dtl(hwcpu, __pa(dtl->buf));

Expand Down Expand Up @@ -171,7 +171,7 @@ static ssize_t dtl_file_read(struct file *filp, char __user *buf, size_t len,
/* actual number of entries read */
n_read = 0;

cur_idx = lppaca[dtl->cpu].dtl_idx;
cur_idx = lppaca_of(dtl->cpu).dtl_idx;
last_idx = dtl->last_idx;

if (cur_idx - last_idx > dtl->buf_entries) {
Expand Down
4 changes: 2 additions & 2 deletions arch/powerpc/platforms/pseries/lpar.c
Original file line number Diff line number Diff line change
Expand Up @@ -250,9 +250,9 @@ void vpa_init(int cpu)
long ret;

if (cpu_has_feature(CPU_FTR_ALTIVEC))
lppaca[cpu].vmxregs_in_use = 1;
lppaca_of(cpu).vmxregs_in_use = 1;

addr = __pa(&lppaca[cpu]);
addr = __pa(&lppaca_of(cpu));
ret = register_vpa(hwcpu, addr);

if (ret) {
Expand Down

0 comments on commit 8154c5d

Please sign in to comment.