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
Kirill Smelkov
linux
Commits
58124996
Commit
58124996
authored
Mar 21, 2006
by
Tony Luck
Browse files
Options
Browse Files
Download
Plain Diff
Pull delete-sigdelayed into release branch
parents
6a8a8e14
b0a06623
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
1 addition
and
127 deletions
+1
-127
arch/ia64/kernel/entry.S
arch/ia64/kernel/entry.S
+0
-14
arch/ia64/kernel/signal.c
arch/ia64/kernel/signal.c
+0
-101
include/asm-ia64/signal.h
include/asm-ia64/signal.h
+0
-2
include/asm-ia64/thread_info.h
include/asm-ia64/thread_info.h
+1
-10
No files found.
arch/ia64/kernel/entry.S
View file @
58124996
...
...
@@ -1102,9 +1102,6 @@ skip_rbs_switch:
st8
[
r2
]=
r8
st8
[
r3
]=
r10
.
work_pending
:
tbit.nz
p6
,
p0
=
r31
,
TIF_SIGDELAYED
//
signal
delayed
from
MCA
/
INIT
/
NMI
/
PMI
context
?
(
p6
)
br.cond.sptk.few
.
sigdelayed
;;
tbit.z
p6
,
p0
=
r31
,
TIF_NEED_RESCHED
//
current_thread_info
()->
need_resched
==
0
?
(
p6
)
br.cond.sptk.few
.
notify
#ifdef CONFIG_PREEMPT
...
...
@@ -1131,17 +1128,6 @@ skip_rbs_switch:
(
pLvSys
)
br
.
cond
.
sptk
.
few
.
work_pending_syscall_end
br.cond.sptk.many
.
work_processed_kernel
//
don
't re-check
//
There
is
a
delayed
signal
that
was
detected
in
MCA
/
INIT
/
NMI
/
PMI
context
where
//
it
could
not
be
delivered
.
Deliver
it
now
.
The
signal
might
be
for
us
and
//
may
set
TIF_SIGPENDING
,
so
redrive
ia64_leave_
*
after
processing
the
delayed
//
signal
.
.
sigdelayed
:
br.call.sptk.many
rp
=
do_sigdelayed
cmp.eq
p6
,
p0
=
r0
,
r0
//
p6
<-
1
,
always
re
-
check
(
pLvSys
)
br
.
cond
.
sptk
.
few
.
work_pending_syscall_end
br.cond.sptk.many
.
work_processed_kernel
//
re
-
check
.
work_pending_syscall_end
:
adds
r2
=
PT
(
R8
)+
16
,
r12
adds
r3
=
PT
(
R10
)+
16
,
r12
...
...
arch/ia64/kernel/signal.c
View file @
58124996
...
...
@@ -588,104 +588,3 @@ ia64_do_signal (sigset_t *oldset, struct sigscratch *scr, long in_syscall)
}
return
0
;
}
/* Set a delayed signal that was detected in MCA/INIT/NMI/PMI context where it
* could not be delivered. It is important that the target process is not
* allowed to do any more work in user space. Possible cases for the target
* process:
*
* - It is sleeping and will wake up soon. Store the data in the current task,
* the signal will be sent when the current task returns from the next
* interrupt.
*
* - It is running in user context. Store the data in the current task, the
* signal will be sent when the current task returns from the next interrupt.
*
* - It is running in kernel context on this or another cpu and will return to
* user context. Store the data in the target task, the signal will be sent
* to itself when the target task returns to user space.
*
* - It is running in kernel context on this cpu and will sleep before
* returning to user context. Because this is also the current task, the
* signal will not get delivered and the task could sleep indefinitely.
* Store the data in the idle task for this cpu, the signal will be sent
* after the idle task processes its next interrupt.
*
* To cover all cases, store the data in the target task, the current task and
* the idle task on this cpu. Whatever happens, the signal will be delivered
* to the target task before it can do any useful user space work. Multiple
* deliveries have no unwanted side effects.
*
* Note: This code is executed in MCA/INIT/NMI/PMI context, with interrupts
* disabled. It must not take any locks nor use kernel structures or services
* that require locks.
*/
/* To ensure that we get the right pid, check its start time. To avoid extra
* include files in thread_info.h, convert the task start_time to unsigned long,
* giving us a cycle time of > 580 years.
*/
static
inline
unsigned
long
start_time_ul
(
const
struct
task_struct
*
t
)
{
return
t
->
start_time
.
tv_sec
*
NSEC_PER_SEC
+
t
->
start_time
.
tv_nsec
;
}
void
set_sigdelayed
(
pid_t
pid
,
int
signo
,
int
code
,
void
__user
*
addr
)
{
struct
task_struct
*
t
;
unsigned
long
start_time
=
0
;
int
i
;
for
(
i
=
1
;
i
<=
3
;
++
i
)
{
switch
(
i
)
{
case
1
:
t
=
find_task_by_pid
(
pid
);
if
(
t
)
start_time
=
start_time_ul
(
t
);
break
;
case
2
:
t
=
current
;
break
;
default:
t
=
idle_task
(
smp_processor_id
());
break
;
}
if
(
!
t
)
return
;
task_thread_info
(
t
)
->
sigdelayed
.
signo
=
signo
;
task_thread_info
(
t
)
->
sigdelayed
.
code
=
code
;
task_thread_info
(
t
)
->
sigdelayed
.
addr
=
addr
;
task_thread_info
(
t
)
->
sigdelayed
.
start_time
=
start_time
;
task_thread_info
(
t
)
->
sigdelayed
.
pid
=
pid
;
wmb
();
set_tsk_thread_flag
(
t
,
TIF_SIGDELAYED
);
}
}
/* Called from entry.S when it detects TIF_SIGDELAYED, a delayed signal that
* was detected in MCA/INIT/NMI/PMI context where it could not be delivered.
*/
void
do_sigdelayed
(
void
)
{
struct
siginfo
siginfo
;
pid_t
pid
;
struct
task_struct
*
t
;
clear_thread_flag
(
TIF_SIGDELAYED
);
memset
(
&
siginfo
,
0
,
sizeof
(
siginfo
));
siginfo
.
si_signo
=
current_thread_info
()
->
sigdelayed
.
signo
;
siginfo
.
si_code
=
current_thread_info
()
->
sigdelayed
.
code
;
siginfo
.
si_addr
=
current_thread_info
()
->
sigdelayed
.
addr
;
pid
=
current_thread_info
()
->
sigdelayed
.
pid
;
t
=
find_task_by_pid
(
pid
);
if
(
!
t
)
return
;
if
(
current_thread_info
()
->
sigdelayed
.
start_time
!=
start_time_ul
(
t
))
return
;
force_sig_info
(
siginfo
.
si_signo
,
&
siginfo
,
t
);
}
include/asm-ia64/signal.h
View file @
58124996
...
...
@@ -158,8 +158,6 @@ struct k_sigaction {
#define ptrace_signal_deliver(regs, cookie) do { } while (0)
void
set_sigdelayed
(
pid_t
pid
,
int
signo
,
int
code
,
void
__user
*
addr
);
#endif
/* __KERNEL__ */
# endif
/* !__ASSEMBLY__ */
...
...
include/asm-ia64/thread_info.h
View file @
58124996
...
...
@@ -29,13 +29,6 @@ struct thread_info {
mm_segment_t
addr_limit
;
/* user-level address space limit */
int
preempt_count
;
/* 0=premptable, <0=BUG; will also serve as bh-counter */
struct
restart_block
restart_block
;
struct
{
int
signo
;
int
code
;
void
__user
*
addr
;
unsigned
long
start_time
;
pid_t
pid
;
}
sigdelayed
;
/* Saved information for TIF_SIGDELAYED */
};
#define THREAD_SIZE KERNEL_STACK_SIZE
...
...
@@ -89,7 +82,6 @@ struct thread_info {
#define TIF_NEED_RESCHED 2
/* rescheduling necessary */
#define TIF_SYSCALL_TRACE 3
/* syscall trace active */
#define TIF_SYSCALL_AUDIT 4
/* syscall auditing active */
#define TIF_SIGDELAYED 5
/* signal delayed from MCA/INIT/NMI/PMI context */
#define TIF_POLLING_NRFLAG 16
/* true if poll_idle() is polling TIF_NEED_RESCHED */
#define TIF_MEMDIE 17
#define TIF_MCA_INIT 18
/* this task is processing MCA or INIT */
...
...
@@ -101,13 +93,12 @@ struct thread_info {
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
#define _TIF_SIGDELAYED (1 << TIF_SIGDELAYED)
#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
#define _TIF_MCA_INIT (1 << TIF_MCA_INIT)
#define _TIF_DB_DISABLED (1 << TIF_DB_DISABLED)
/* "work to do on user-return" bits */
#define TIF_ALLWORK_MASK (_TIF_NOTIFY_RESUME|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT
|_TIF_SIGDELAYED
)
#define TIF_ALLWORK_MASK (_TIF_NOTIFY_RESUME|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
/* like TIF_ALLWORK_BITS but sans TIF_SYSCALL_TRACE or TIF_SYSCALL_AUDIT */
#define TIF_WORK_MASK (TIF_ALLWORK_MASK&~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT))
...
...
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