Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
bd6aeeff
Commit
bd6aeeff
authored
Oct 03, 2007
by
Ralf Baechle
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[MIPS] SMP: Implement smp_call_function_mask().
Signed-off-by:
Ralf Baechle
<
ralf@linux-mips.org
>
parent
9966db25
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
30 additions
and
40 deletions
+30
-40
arch/mips/kernel/gdb-stub.c
arch/mips/kernel/gdb-stub.c
+5
-5
arch/mips/kernel/smp.c
arch/mips/kernel/smp.c
+16
-35
include/asm-mips/smp.h
include/asm-mips/smp.h
+9
-0
No files found.
arch/mips/kernel/gdb-stub.c
View file @
bd6aeeff
...
...
@@ -676,15 +676,18 @@ static void kgdb_wait(void *arg)
static
int
kgdb_smp_call_kgdb_wait
(
void
)
{
#ifdef CONFIG_SMP
cpumask_t
mask
=
cpu_online_map
;
struct
call_data_struct
data
;
int
i
,
cpus
=
num_online_cpus
()
-
1
;
int
cpu
=
smp_processor_id
();
int
cpus
;
/*
* Can die spectacularly if this CPU isn't yet marked online
*/
BUG_ON
(
!
cpu_online
(
cpu
));
cpu_clear
(
cpu
,
mask
);
cpus
=
cpus_weight
(
mask
);
if
(
!
cpus
)
return
0
;
...
...
@@ -711,10 +714,7 @@ static int kgdb_smp_call_kgdb_wait(void)
call_data
=
&
data
;
mb
();
/* Send a message to all other CPUs and wait for them to respond */
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
if
(
cpu_online
(
i
)
&&
i
!=
cpu
)
core_send_ipi
(
i
,
SMP_CALL_FUNCTION
);
core_send_ipi_mask
(
mask
,
SMP_CALL_FUNCTION
);
/* Wait for response */
/* FIXME: lock-up detection, backtrace on lock-up */
...
...
arch/mips/kernel/smp.c
View file @
bd6aeeff
...
...
@@ -97,6 +97,8 @@ struct call_data_struct *call_data;
/*
* Run a function on all other CPUs.
*
* <mask> cpuset_t of all processors to run the function on.
* <func> The function to run. This must be fast and non-blocking.
* <info> An arbitrary pointer to pass to the function.
* <retry> If true, keep retrying until ready.
...
...
@@ -121,18 +123,20 @@ struct call_data_struct *call_data;
* Spin waiting for call_lock
* Deadlock Deadlock
*/
int
smp_call_function
(
void
(
*
func
)
(
void
*
info
),
void
*
info
,
int
retry
,
int
wait
)
int
smp_call_function
_mask
(
cpumask_t
mask
,
void
(
*
func
)
(
void
*
info
)
,
void
*
info
,
int
retry
,
int
wait
)
{
struct
call_data_struct
data
;
int
i
,
cpus
=
num_online_cpus
()
-
1
;
int
cpu
=
smp_processor_id
();
int
cpus
;
/*
* Can die spectacularly if this CPU isn't yet marked online
*/
BUG_ON
(
!
cpu_online
(
cpu
));
cpu_clear
(
cpu
,
mask
);
cpus
=
cpus_weight
(
mask
);
if
(
!
cpus
)
return
0
;
...
...
@@ -151,9 +155,7 @@ int smp_call_function (void (*func) (void *info), void *info, int retry,
smp_mb
();
/* Send a message to all other CPUs and wait for them to respond */
for_each_online_cpu
(
i
)
if
(
i
!=
cpu
)
core_send_ipi
(
i
,
SMP_CALL_FUNCTION
);
core_send_ipi_mask
(
mask
,
SMP_CALL_FUNCTION
);
/* Wait for response */
/* FIXME: lock-up detection, backtrace on lock-up */
...
...
@@ -169,6 +171,11 @@ int smp_call_function (void (*func) (void *info), void *info, int retry,
return
0
;
}
int
smp_call_function
(
void
(
*
func
)
(
void
*
info
),
void
*
info
,
int
retry
,
int
wait
)
{
return
smp_call_function_mask
(
cpu_online_map
,
func
,
info
,
retry
,
wait
);
}
void
smp_call_function_interrupt
(
void
)
{
...
...
@@ -199,8 +206,7 @@ void smp_call_function_interrupt(void)
int
smp_call_function_single
(
int
cpu
,
void
(
*
func
)
(
void
*
info
),
void
*
info
,
int
retry
,
int
wait
)
{
struct
call_data_struct
data
;
int
me
;
int
ret
,
me
;
/*
* Can die spectacularly if this CPU isn't yet marked online
...
...
@@ -219,33 +225,8 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
return
0
;
}
/* Can deadlock when called with interrupts disabled */
WARN_ON
(
irqs_disabled
());
data
.
func
=
func
;
data
.
info
=
info
;
atomic_set
(
&
data
.
started
,
0
);
data
.
wait
=
wait
;
if
(
wait
)
atomic_set
(
&
data
.
finished
,
0
);
spin_lock
(
&
smp_call_lock
);
call_data
=
&
data
;
smp_mb
();
/* Send a message to the other CPU */
core_send_ipi
(
cpu
,
SMP_CALL_FUNCTION
);
/* Wait for response */
/* FIXME: lock-up detection, backtrace on lock-up */
while
(
atomic_read
(
&
data
.
started
)
!=
1
)
barrier
();
if
(
wait
)
while
(
atomic_read
(
&
data
.
finished
)
!=
1
)
barrier
();
call_data
=
NULL
;
spin_unlock
(
&
smp_call_lock
);
ret
=
smp_call_function_mask
(
cpumask_of_cpu
(
cpu
),
func
,
info
,
retry
,
wait
);
put_cpu
();
return
0
;
...
...
include/asm-mips/smp.h
View file @
bd6aeeff
...
...
@@ -60,6 +60,15 @@ extern cpumask_t phys_cpu_present_map;
*/
extern
void
core_send_ipi
(
int
cpu
,
unsigned
int
action
);
static
inline
void
core_send_ipi_mask
(
cpumask_t
mask
,
unsigned
int
action
)
{
unsigned
int
i
;
for_each_cpu_mask
(
i
,
mask
)
core_send_ipi
(
i
,
action
);
}
/*
* Firmware CPU startup hook
*/
...
...
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