check_signal: system call restart is done only once
Fujitsu: POSTK_TEMP_FIX_66 Refs: #1009 Change-Id: Ic0f04ac6b7f6c6bb01b55fb389bf9befd56b1dd9
This commit is contained in:
committed by
Masamichi Takagi
parent
c25fb2aa39
commit
e4da71010c
@@ -839,6 +839,13 @@ void chain_thread(struct thread *);
|
||||
void proc_init(void);
|
||||
void set_timer(int runq_locked);
|
||||
struct sig_pending *hassigpending(struct thread *thread);
|
||||
extern int do_signal(unsigned long rc, void *regs0, struct thread *thread,
|
||||
struct sig_pending *pending, int num);
|
||||
extern void check_signal(unsigned long rc, void *regs0, int num);
|
||||
extern unsigned long do_kill(struct thread *thread, int pid, int tid, int sig,
|
||||
struct siginfo *info, int ptracecont);
|
||||
extern void set_signal(int sig, void *regs, struct siginfo *info);
|
||||
extern void check_sig_pending(void);
|
||||
|
||||
void release_fp_regs(struct thread *proc);
|
||||
void save_fp_regs(struct thread *proc);
|
||||
|
||||
@@ -960,8 +960,6 @@ static struct ihk_mc_interrupt_handler query_free_mem_handler = {
|
||||
.priv = NULL,
|
||||
};
|
||||
|
||||
void set_signal(int sig, void *regs, struct siginfo *info);
|
||||
void check_signal(unsigned long, void *, int);
|
||||
int gencore(struct thread *, void *, struct coretable **, int *);
|
||||
void freecore(struct coretable **);
|
||||
|
||||
@@ -1221,7 +1219,7 @@ out:
|
||||
if(interrupt_from_user(regs)){
|
||||
cpu_enable_interrupt();
|
||||
check_need_resched();
|
||||
check_signal(0, regs, 0);
|
||||
check_signal(0, regs, -1);
|
||||
}
|
||||
set_cputime(interrupt_from_user(regs)? 0: 1);
|
||||
#ifdef PROFILE_ENABLE
|
||||
|
||||
@@ -82,7 +82,6 @@ extern void lapic_timer_disable();
|
||||
extern int num_processors;
|
||||
extern ihk_spinlock_t cpuid_head_lock;
|
||||
int ptrace_detach(int pid, int data);
|
||||
extern unsigned long do_kill(struct thread *, int pid, int tid, int sig, struct siginfo *info, int ptracecont);
|
||||
extern void procfs_create_thread(struct thread *);
|
||||
extern void procfs_delete_thread(struct thread *);
|
||||
|
||||
|
||||
@@ -116,10 +116,7 @@ static ihk_spinlock_t tod_data_lock = SPIN_LOCK_UNLOCKED;
|
||||
static unsigned long uti_desc; /* Address of struct uti_desc object in syscall_intercept.c */
|
||||
static void calculate_time_from_tsc(struct timespec *ts);
|
||||
|
||||
void check_signal(unsigned long, void *, int);
|
||||
void save_syscall_return_value(int num, unsigned long rc);
|
||||
void do_signal(long rc, void *regs, struct thread *thread, struct sig_pending *pending, int num);
|
||||
extern unsigned long do_kill(struct thread *thread, int pid, int tid, int sig, struct siginfo *info, int ptracecont);
|
||||
extern long alloc_debugreg(struct thread *thread);
|
||||
extern int num_processors;
|
||||
extern unsigned long ihk_mc_get_ns_per_tsc(void);
|
||||
@@ -4204,7 +4201,7 @@ SYSCALL_DECLARE(rt_sigtimedwait)
|
||||
list_del(&pending->list);
|
||||
thread->sigmask.__val[0] = bset;
|
||||
mcs_rwlock_writer_unlock(lock, &mcs_rw_node);
|
||||
do_signal(-EINTR, NULL, thread, pending, 0);
|
||||
do_signal(-EINTR, NULL, thread, pending, -1);
|
||||
return -EINTR;
|
||||
}
|
||||
mcs_rwlock_writer_unlock(lock, &mcs_rw_node);
|
||||
@@ -4317,7 +4314,7 @@ do_sigsuspend(struct thread *thread, const sigset_t *set)
|
||||
list_del(&pending->list);
|
||||
mcs_rwlock_writer_unlock(lock, &mcs_rw_node);
|
||||
thread->sigmask.__val[0] = bset;
|
||||
do_signal(-EINTR, NULL, thread, pending, 0);
|
||||
do_signal(-EINTR, NULL, thread, pending, -1);
|
||||
break;
|
||||
}
|
||||
return -EINTR;
|
||||
@@ -9549,7 +9546,7 @@ long syscall(int num, ihk_mc_user_context_t *ctx)
|
||||
if(cpu_local_var(current)->proc->status == PS_EXITED &&
|
||||
(num != __NR_exit && num != __NR_exit_group)){
|
||||
save_syscall_return_value(num, -EINVAL);
|
||||
check_signal(-EINVAL, NULL, 0);
|
||||
check_signal(-EINVAL, NULL, -1);
|
||||
set_cputime(0);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user