check_signal: system call restart is done only once

Fujitsu: POSTK_TEMP_FIX_66
Refs: #1009
Change-Id: Ic0f04ac6b7f6c6bb01b55fb389bf9befd56b1dd9
This commit is contained in:
Tomoki Shirasawa
2018-09-05 13:59:10 +09:00
committed by Masamichi Takagi
parent c25fb2aa39
commit e4da71010c
12 changed files with 391 additions and 35 deletions

View File

@@ -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;
}