Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
8a05d490
Commit
8a05d490
authored
Aug 06, 2002
by
Paul Mackerras
Browse files
Options
Browse Files
Download
Plain Diff
Merge samba.org:/home/paulus/kernel/linux-2.5
into samba.org:/home/paulus/kernel/for-linus-ppc
parents
35aa61ec
fe6d20fc
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
48 additions
and
295 deletions
+48
-295
arch/ppc/kernel/misc.S
arch/ppc/kernel/misc.S
+1
-0
arch/ppc/kernel/ptrace.c
arch/ppc/kernel/ptrace.c
+4
-0
arch/ppc/kernel/smp.c
arch/ppc/kernel/smp.c
+1
-268
arch/ppc/platforms/chrp_smp.c
arch/ppc/platforms/chrp_smp.c
+8
-13
arch/ppc/platforms/prep_setup.c
arch/ppc/platforms/prep_setup.c
+7
-5
include/asm-ppc/bitops.h
include/asm-ppc/bitops.h
+1
-7
include/asm-ppc/rwsem.h
include/asm-ppc/rwsem.h
+25
-1
include/asm-ppc/smplock.h
include/asm-ppc/smplock.h
+1
-1
No files found.
arch/ppc/kernel/misc.S
View file @
8a05d490
...
...
@@ -1296,6 +1296,7 @@ _GLOBAL(sys_call_table)
.
long
sys_futex
.
long
sys_sched_setaffinity
.
long
sys_sched_getaffinity
.
long
sys_security
.
rept
NR_syscalls
-(
.
-
sys_call_table
)/
4
.
long
sys_ni_syscall
.
endr
arch/ppc/kernel/ptrace.c
View file @
8a05d490
...
...
@@ -28,6 +28,7 @@
#include <linux/errno.h>
#include <linux/ptrace.h>
#include <linux/user.h>
#include <linux/security.h>
#include <asm/uaccess.h>
#include <asm/page.h>
...
...
@@ -168,6 +169,9 @@ int sys_ptrace(long request, long pid, long addr, long data)
/* are we already being traced? */
if
(
current
->
ptrace
&
PT_PTRACED
)
goto
out
;
ret
=
security_ops
->
ptrace
(
current
->
parent
,
current
);
if
(
ret
)
goto
out
;
/* set the ptrace bit in the process flags. */
current
->
ptrace
|=
PT_PTRACED
;
ret
=
0
;
...
...
arch/ppc/kernel/smp.c
View file @
8a05d490
...
...
@@ -289,273 +289,6 @@ void smp_call_function_interrupt(void)
atomic_inc
(
&
call_data
->
finished
);
}
#if 0 /* Old boot code. */
void __init smp_boot_cpus(void)
{
int i, cpu_nr;
struct task_struct *p;
printk("Entering SMP Mode...\n");
smp_store_cpu_info(0);
cpu_online_map = 1UL;
/*
* assume for now that the first cpu booted is
* cpu 0, the master -- Cort
*/
cpu_callin_map[0] = 1;
for (i = 0; i < NR_CPUS; i++) {
prof_counter[i] = 1;
prof_multiplier[i] = 1;
}
/*
* XXX very rough.
*/
cache_decay_ticks = HZ/100;
smp_ops = ppc_md.smp_ops;
if (smp_ops == NULL) {
printk("SMP not supported on this machine.\n");
return;
}
/* Probe platform for CPUs */
cpu_nr = smp_ops->probe();
/*
* only check for cpus we know exist. We keep the callin map
* with cpus at the bottom -- Cort
*/
if (cpu_nr > max_cpus)
cpu_nr = max_cpus;
#ifdef CONFIG_PPC_ISERIES
smp_iSeries_space_timers( cpu_nr );
#endif
for (i = 1; i < cpu_nr; i++) {
int c;
struct pt_regs regs;
/* create a process for the processor */
/* only regs.msr is actually used, and 0 is OK for it */
memset(®s, 0, sizeof(struct pt_regs));
p = do_fork(CLONE_VM|CLONE_IDLETASK, 0, ®s, 0);
if (IS_ERR(p))
panic("failed fork for CPU %d", i);
init_idle(p, i);
unhash_process(p);
secondary_ti = p->thread_info;
p->thread_info->cpu = i;
/*
* There was a cache flush loop here to flush the cache
* to memory for the first 8MB of RAM. The cache flush
* has been pushed into the kick_cpu function for those
* platforms that need it.
*/
/* wake up cpus */
smp_ops->kick_cpu(i);
/*
* wait to see if the cpu made a callin (is actually up).
* use this value that I found through experimentation.
* -- Cort
*/
for (c = 1000; c && !cpu_callin_map[i]; c--)
udelay(100);
if (cpu_callin_map[i]) {
char buf[32];
sprintf(buf, "found cpu %d", i);
if (ppc_md.progress) ppc_md.progress(buf, 0x350+i);
printk("Processor %d found.\n", i);
} else {
char buf[32];
sprintf(buf, "didn't find cpu %d", i);
if (ppc_md.progress) ppc_md.progress(buf, 0x360+i);
printk("Processor %d is stuck.\n", i);
}
}
/* Setup CPU 0 last (important) */
smp_ops->setup_cpu(0);
/* FIXME: Not with hotplug CPUS --RR */
if (num_online_cpus() < 2)
smp_tb_synchronized = 1;
}
void __init smp_software_tb_sync(int cpu)
{
#define PASSES 4 /* 4 passes.. */
int pass;
int i, j;
/* stop - start will be the number of timebase ticks it takes for cpu0
* to send a message to all others and the first reponse to show up.
*
* ASSUMPTION: this time is similiar for all cpus
* ASSUMPTION: the time to send a one-way message is ping/2
*/
register unsigned long start = 0;
register unsigned long stop = 0;
register unsigned long temp = 0;
set_tb(0, 0);
/* multiple passes to get in l1 cache.. */
for (pass = 2; pass < 2+PASSES; pass++){
if (cpu == 0){
mb();
for (i = j = 1; i < NR_CPUS; i++, j++){
/* skip stuck cpus */
while (!cpu_callin_map[j])
++j;
while (cpu_callin_map[j] != pass)
barrier();
}
mb();
tb_sync_flag = pass;
start = get_tbl(); /* start timing */
while (tb_sync_flag)
mb();
stop = get_tbl(); /* end timing */
/* theoretically, the divisor should be 2, but
* I get better results on my dual mtx. someone
* please report results on other smp machines..
*/
tb_offset = (stop-start)/4;
mb();
tb_sync_flag = pass;
udelay(10);
mb();
tb_sync_flag = 0;
mb();
set_tb(0,0);
mb();
} else {
cpu_callin_map[cpu] = pass;
mb();
while (!tb_sync_flag)
mb(); /* wait for cpu0 */
mb();
tb_sync_flag = 0; /* send response for timing */
mb();
while (!tb_sync_flag)
mb();
temp = tb_offset; /* make sure offset is loaded */
while (tb_sync_flag)
mb();
set_tb(0,temp); /* now, set the timebase */
mb();
}
}
if (cpu == 0) {
smp_tb_synchronized = 1;
printk("smp_software_tb_sync: %d passes, final offset: %ld\n",
PASSES, tb_offset);
}
/* so time.c doesn't get confused */
set_dec(tb_ticks_per_jiffy);
last_jiffy_stamp(cpu) = 0;
}
void __init smp_commence(void)
{
/*
* Lets the callin's below out of their loop.
*/
if (ppc_md.progress) ppc_md.progress("smp_commence", 0x370);
wmb();
smp_commenced = 1;
/* if the smp_ops->setup_cpu function has not already synched the
* timebases with a nicer hardware-based method, do so now
*
* I am open to suggestions for improvements to this method
* -- Troy <hozer@drgw.net>
*
* NOTE: if you are debugging, set smp_tb_synchronized for now
* since if this code runs pretty early and needs all cpus that
* reported in in smp_callin_map to be working
*
* NOTE2: this code doesn't seem to work on > 2 cpus. -- paulus/BenH
*/
/* FIXME: This doesn't work with hotplug CPUs --RR */
if (!smp_tb_synchronized && num_online_cpus() == 2) {
unsigned long flags;
local_irq_save(flags);
smp_software_tb_sync(0);
local_irq_restore(flags);
}
}
void __init smp_callin(void)
{
int cpu = smp_processor_id();
smp_store_cpu_info(cpu);
set_dec(tb_ticks_per_jiffy);
/* Set online before we acknowledge. */
set_bit(cpu, &cpu_online_map);
wmb();
cpu_callin_map[cpu] = 1;
smp_ops->setup_cpu(cpu);
while (!smp_commenced)
barrier();
/* see smp_commence for more info */
if (!smp_tb_synchronized && num_online_cpus() == 2) {
smp_software_tb_sync(cpu);
}
local_irq_enable();
}
/* intel needs this */
void __init initialize_secondary(void)
{
}
/* Activate a secondary processor. */
int __init start_secondary(void *unused)
{
atomic_inc(&init_mm.mm_count);
current->active_mm = &init_mm;
smp_callin();
return cpu_idle(NULL);
}
void __init smp_setup(char *str, int *ints)
{
}
int __init setup_profiling_timer(unsigned int multiplier)
{
return 0;
}
void __init smp_store_cpu_info(int id)
{
struct cpuinfo_PPC *c = &cpu_data[id];
/* assume bogomips are same for everything */
c->loops_per_jiffy = loops_per_jiffy;
c->pvr = mfspr(PVR);
}
static int __init maxcpus(char *str)
{
get_option(&str, &max_cpus);
return 1;
}
__setup("maxcpus=", maxcpus);
#else
/* New boot code */
/* FIXME: Do this properly for all archs --RR */
static
spinlock_t
timebase_lock
=
SPIN_LOCK_UNLOCKED
;
static
unsigned
int
timebase_upper
=
0
,
timebase_lower
=
0
;
...
...
@@ -643,6 +376,7 @@ int __devinit start_secondary(void *unused)
printk
(
"CPU %i done callin...
\n
"
,
cpu
);
smp_ops
->
setup_cpu
(
cpu
);
printk
(
"CPU %i done setup...
\n
"
,
cpu
);
local_irq_enable
();
smp_ops
->
take_timebase
();
printk
(
"CPU %i done timebase take...
\n
"
,
cpu
);
...
...
@@ -707,4 +441,3 @@ void smp_cpus_done(unsigned int max_cpus)
{
smp_ops
->
setup_cpu
(
0
);
}
#endif
arch/ppc/platforms/chrp_smp.c
View file @
8a05d490
...
...
@@ -77,25 +77,20 @@ smp_chrp_give_timebase(void)
spin_unlock
(
&
timebase_lock
);
while
(
timebase_upper
||
timebase_lower
)
rmb
();
barrier
();
call_rtas
(
"thaw-time-base"
,
0
,
1
,
NULL
);
}
void
__devinit
smp_chrp_take_timebase
(
void
)
{
int
done
=
0
;
while
(
!
done
)
{
spin_lock
(
&
timebase_lock
);
if
(
timebase_upper
||
timebase_lower
)
{
set_tb
(
timebase_upper
,
timebase_lower
);
timebase_upper
=
0
;
timebase_lower
=
0
;
done
=
1
;
}
spin_unlock
(
&
timebase_lock
);
}
while
(
!
(
timebase_upper
||
timebase_lower
))
barrier
();
spin_lock
(
&
timebase_lock
);
set_tb
(
timebase_upper
,
timebase_lower
);
timebase_upper
=
0
;
timebase_lower
=
0
;
spin_unlock
(
&
timebase_lock
);
printk
(
"CPU %i taken timebase
\n
"
,
smp_processor_id
());
}
...
...
arch/ppc/platforms/prep_setup.c
View file @
8a05d490
...
...
@@ -807,13 +807,15 @@ prep_map_io(void)
static
int
__init
prep_request_io
(
void
)
{
if
(
_machine
==
_MACH_prep
)
{
#ifdef CONFIG_NVRAM
request_region
(
PREP_NVRAM_AS0
,
0x8
,
"nvram"
);
request_region
(
PREP_NVRAM_AS0
,
0x8
,
"nvram"
);
#endif
request_region
(
0x00
,
0x20
,
"dma1"
);
request_region
(
0x40
,
0x20
,
"timer"
);
request_region
(
0x80
,
0x10
,
"dma page reg"
);
request_region
(
0xc0
,
0x20
,
"dma2"
);
request_region
(
0x00
,
0x20
,
"dma1"
);
request_region
(
0x40
,
0x20
,
"timer"
);
request_region
(
0x80
,
0x10
,
"dma page reg"
);
request_region
(
0xc0
,
0x20
,
"dma2"
);
}
return
0
;
}
...
...
include/asm-ppc/bitops.h
View file @
8a05d490
...
...
@@ -26,10 +26,6 @@
#define SMP_MB
#endif
/* CONFIG_SMP */
/*
* These used to be if'd out here because using : "cc" as a constraint
* resulted in errors from egcs. Things appear to be OK with gcc-2.95.
*/
static
__inline__
void
set_bit
(
int
nr
,
volatile
unsigned
long
*
addr
)
{
unsigned
long
old
;
...
...
@@ -224,9 +220,7 @@ static __inline__ int __test_and_change_bit(int nr, volatile unsigned long *addr
static
__inline__
int
test_bit
(
int
nr
,
__const__
volatile
unsigned
long
*
addr
)
{
__const__
unsigned
int
*
p
=
(
__const__
unsigned
int
*
)
addr
;
return
((
p
[
nr
>>
5
]
>>
(
nr
&
0x1f
))
&
1
)
!=
0
;
return
((
addr
[
nr
>>
5
]
>>
(
nr
&
0x1f
))
&
1
)
!=
0
;
}
/* Return the bit position of the most significant 1 bit in a word */
...
...
include/asm-ppc/rwsem.h
View file @
8a05d490
...
...
@@ -72,12 +72,26 @@ static inline void init_rwsem(struct rw_semaphore *sem)
*/
static
inline
void
__down_read
(
struct
rw_semaphore
*
sem
)
{
if
(
atomic_inc_return
((
atomic_t
*
)(
&
sem
->
count
))
>
=
0
)
if
(
atomic_inc_return
((
atomic_t
*
)(
&
sem
->
count
))
>
0
)
smp_wmb
();
else
rwsem_down_read_failed
(
sem
);
}
static
inline
int
__down_read_trylock
(
struct
rw_semaphore
*
sem
)
{
int
tmp
;
while
((
tmp
=
sem
->
count
)
>=
0
)
{
if
(
tmp
==
cmpxchg
(
&
sem
->
count
,
tmp
,
tmp
+
RWSEM_ACTIVE_READ_BIAS
))
{
smp_wmb
();
return
1
;
}
}
return
0
;
}
/*
* lock for writing
*/
...
...
@@ -93,6 +107,16 @@ static inline void __down_write(struct rw_semaphore *sem)
rwsem_down_write_failed
(
sem
);
}
static
inline
int
__down_write_trylock
(
struct
rw_semaphore
*
sem
)
{
int
tmp
;
tmp
=
cmpxchg
(
&
sem
->
count
,
RWSEM_UNLOCKED_VALUE
,
RWSEM_ACTIVE_WRITE_BIAS
);
smp_wmb
();
return
tmp
==
RWSEM_UNLOCKED_VALUE
;
}
/*
* unlock after reading
*/
...
...
include/asm-ppc/smplock.h
View file @
8a05d490
...
...
@@ -24,7 +24,7 @@ extern spinlock_t kernel_flag;
/*
* Release global kernel lock and global interrupt lock
*/
#define release_kernel_lock(task
, cpu
) \
#define release_kernel_lock(task) \
do { \
if (unlikely(task->lock_depth >= 0)) \
spin_unlock(&kernel_flag); \
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment