Compare commits

...

24 Commits

Author SHA1 Message Date
7c0e624b13 spec: prerelase 0.8 for testing mcexec -n issue
Change-Id: Ie54f7bc74097c8390f75ddbd0d6e58a8ea87ea7c
2020-07-21 13:31:45 +09:00
0b66bab992 Revert "mcexec: detect mismatch of mcexec -n and mpirun -ppn"
This reverts commit 1d135492c3.

Conflicts:
	executer/kernel/mcctrl/control.c

Change-Id: I224cced408aa4b77691a153c5e1d2fdf8043fa04
2020-07-21 13:08:21 +09:00
63ed4e7af0 spec: prerelase 0.7 for testing hugetlb map for stack
Change-Id: I4997340cd984ca8915e45749b91b1d72c1de85af
2020-07-20 08:11:40 +09:00
d7cf39883f Revert "shmobj: Support large page"
This reverts commit 9a60997ea0.

Change-Id: Id60959b4e03451987239faa0bbc2e780b72fafaa
2020-07-19 12:53:45 +00:00
40f8091fab stack: grow on page fault
The steps of the technique to replace stack with hugetlbfs map are as
follows:

(1) Prepare a hugetlbfs map with the size of rlim_cur
(2) Copy the active region of the stack to the hugetlbfs map.
    The range to copy is determined by reading /proc/[pid]/maps.
(3) Replace the stack map with the hugetlbfs map

The step (2) tries to copy a huge region if McKernel doesn't grow the
stack at run-time.

Change-Id: I5858c35b5c26dd0a42cccf9e3cc4c64b1a81f160
2020-07-19 12:53:31 +00:00
a20e1acf01 syscall: add prlimit64
Change-Id: Iad882813d54b439c236c0df74dc81508190e6707
2020-07-19 21:52:46 +09:00
b3d7bbda56 rus_vm_fault: compat: RHEL-8.2
This applies the following patch:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=1c8f422059ae5da07db7406ab916203f9417e396
mm: change return type to vm_fault_t

Change-Id: I7189fc92824d21b4906f1033f1de5899bbad4680
2020-07-15 13:02:32 +09:00
9a60997ea0 shmobj: Support large page
Mixing page sizes is allowed by shmobj.

Change-Id: Ic48b71da2db6ce3f68fa3dbc8ad5ae96347d6018
Refs: #1381
Refs: #1458
2020-07-15 03:50:56 +00:00
4b66373813 mcexec: Don't forward SIGTSTP SIGTTIN SIGTTOUT to mckernel
Change-Id: I72bb74d6b98e1f0bf519c8f0fef742624a2a699a
Refs: #1425
2020-07-14 08:34:11 +00:00
b44b11ace7 set_robust_list: Add error check
set_robust_list is not supported by McKernel.

Change-Id: I1f679e2e4df24139cceb1f2294bc072cb7956002
Refs: 1399
2020-07-14 01:06:49 +00:00
ebc91cea0e tgkill: Fix argument validatation
Formerly, if tgid is specified as -1, tgkill() was equivalent to tkill().
Now it is treated as an error EINVAL.

Change-Id: I47bc75d439662a36dc6167c4446a5277422de507
Refs: 1380
2020-07-14 01:03:47 +00:00
58106d791a struct process: fix type of group_exit_status
Change-Id: Ib8492cbb077106cef1d0fa2d6d5e8e13bbb209c0
Refs: #1377
2020-07-13 08:33:07 +00:00
56b51d4f97 spec: prerelase 0.6 for testing cpuinfo and mmap overcommit
Change-Id: Iab5acc2c08ebe19251c37782cff87a4b5c914448
2020-07-13 10:14:23 +09:00
bafe540d86 mmap: allow unlimited overcommit
Change-Id: Iba07b5c504b4a202cd163ce682f3fc72a31284a0
2020-07-10 14:52:57 +09:00
d78a0fd05d sysinfo: support basic entries
Change-Id: I27f3e55058cc29f895831a1dddfafbc8585746a5
refs: #1389
2020-07-10 14:51:25 +09:00
999bc91b4f arch: Move some functions from arch-dependent to common part
Moved syscall rt_sigaction and functions related to signal.

Change-Id: I39f619e008d9c6018d91099a76dfb30e48757673
Refs: 1487
2020-07-10 03:54:28 +00:00
b3bd2ea9b3 procfs cpuinfo: use sequence number as processor
Change-Id: Id54ea74c5fda198a0bb9c9b6a19e6799fee0ed3f
2020-07-09 13:10:08 +09:00
d3d9e2400d test: ihklib: syscall_list.h: add robust marker for patch
Change-Id: Ie5f72b4b296db4d44e9839f38fd9a68854be78c3
2020-07-06 16:25:11 +09:00
199407b2a1 spec: prerelease 0.5 for testing ppoll
Change-Id: I51deb1c1703a986ba0aa4e02da9f53009554dbb7
2020-07-01 08:49:08 +09:00
5973d66e2d Revert "epoll_wait(): make sure to schedule in offload"
This reverts commit 5e44c9c9f9.

Change-Id: I826336f1ece31a84072c3e62c6c6c68a641e8fb5
2020-06-30 17:11:26 +09:00
d7ef74659b Revert "epoll, ppoll: deschedule on offload, don't do it when exiting system call"
This reverts commit d4056acfc3.

Change-Id: I7df15b9d3957ca571f4b4e2d576799f8b97ae299
2020-06-30 17:11:23 +09:00
ac86affecc mcexec: fix FLIB_AFFINITY_ON_PROCESS mask for McKernel CPU numbers (Fugaku)
Change-Id: If42b139fb53866bcff0809d898d4a2a712946f0c
2020-06-30 16:29:03 +09:00
2026cf8dad mcexec: explicit CPU list in partitoned execution (for Fujitsu's FLIB_AFFINITY_ON_PROCESS)
Change-Id: I05c11f73553de8ccb5f79083ce2115ac57e62584
2020-06-30 16:29:00 +09:00
1d135492c3 mcexec: detect mismatch of mcexec -n and mpirun -ppn
Change-Id: I0c42e3119143da40ea2e69cd9ec99bde78a0ad2a
Refs: #929
2020-06-30 16:28:08 +09:00
56 changed files with 2627 additions and 695 deletions

View File

@ -10,7 +10,7 @@ project(mckernel C ASM)
set(MCKERNEL_VERSION "1.7.0") set(MCKERNEL_VERSION "1.7.0")
# See "Fedora Packaging Guidlines -- Versioning" # See "Fedora Packaging Guidlines -- Versioning"
set(MCKERNEL_RELEASE "0.4") set(MCKERNEL_RELEASE "0.8")
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
# for rpmbuild # for rpmbuild

View File

@ -535,3 +535,6 @@ Restrictions on McKernel
25. The behaviors of madvise and mbind are changed to do nothing and 25. The behaviors of madvise and mbind are changed to do nothing and
report success as a workaround for Fugaku. report success as a workaround for Fugaku.
26. mmap() allows unlimited overcommit. Note that it corresponds to
setting sysctl ``vm.overcommit_memory`` to 1.

View File

@ -1279,7 +1279,7 @@ long ihk_mc_show_cpuinfo(char *buf, size_t buf_size, unsigned long read_off, int
/* generate strings */ /* generate strings */
loff += scnprintf(lbuf + loff, lbuf_size - loff, loff += scnprintf(lbuf + loff, lbuf_size - loff,
"processor\t: %d\n", cpuinfo->hwid); "processor\t: %d\n", i);
loff += scnprintf(lbuf + loff, lbuf_size - loff, "Features\t:"); loff += scnprintf(lbuf + loff, lbuf_size - loff, "Features\t:");
for (j = 0; hwcap_str[j]; j++) { for (j = 0; hwcap_str[j]; j++) {

View File

@ -85,7 +85,11 @@ enum __rlimit_resource
__RLIMIT_RTPRIO = 14, __RLIMIT_RTPRIO = 14,
#define RLIMIT_RTPRIO __RLIMIT_RTPRIO #define RLIMIT_RTPRIO __RLIMIT_RTPRIO
__RLIMIT_NLIMITS = 15, /* timeout for RT tasks in us */
__RLIMIT_RTTIME = 15,
#define RLIMIT_RTTIME __RLIMIT_RTTIME
__RLIMIT_NLIMITS = 16,
__RLIM_NLIMITS = __RLIMIT_NLIMITS __RLIM_NLIMITS = __RLIMIT_NLIMITS
#define RLIMIT_NLIMITS __RLIMIT_NLIMITS #define RLIMIT_NLIMITS __RLIMIT_NLIMITS
#define RLIM_NLIMITS __RLIM_NLIMITS #define RLIM_NLIMITS __RLIM_NLIMITS

View File

@ -83,6 +83,7 @@ SYSCALL_HANDLED(175, geteuid)
SYSCALL_HANDLED(176, getgid) SYSCALL_HANDLED(176, getgid)
SYSCALL_HANDLED(177, getegid) SYSCALL_HANDLED(177, getegid)
SYSCALL_HANDLED(178, gettid) SYSCALL_HANDLED(178, gettid)
SYSCALL_HANDLED(179, sysinfo)
SYSCALL_DELEGATED(188, msgrcv) SYSCALL_DELEGATED(188, msgrcv)
SYSCALL_DELEGATED(189, msgsnd) SYSCALL_DELEGATED(189, msgsnd)
SYSCALL_DELEGATED(192, semtimedop) SYSCALL_DELEGATED(192, semtimedop)
@ -117,6 +118,7 @@ SYSCALL_HANDLED(241, perf_event_open)
SYSCALL_DELEGATED(241, perf_event_open) SYSCALL_DELEGATED(241, perf_event_open)
#endif // PERF_ENABLE #endif // PERF_ENABLE
SYSCALL_HANDLED(260, wait4) SYSCALL_HANDLED(260, wait4)
SYSCALL_HANDLED(261, prlimit64)
SYSCALL_HANDLED(270, process_vm_readv) SYSCALL_HANDLED(270, process_vm_readv)
SYSCALL_HANDLED(271, process_vm_writev) SYSCALL_HANDLED(271, process_vm_writev)
SYSCALL_HANDLED(281, execveat) SYSCALL_HANDLED(281, execveat)
@ -143,3 +145,8 @@ SYSCALL_DELEGATED(1049, stat)
SYSCALL_DELEGATED(1060, getpgrp) SYSCALL_DELEGATED(1060, getpgrp)
SYSCALL_HANDLED(1062, time) SYSCALL_HANDLED(1062, time)
SYSCALL_DELEGATED(1069, epoll_wait) SYSCALL_DELEGATED(1069, epoll_wait)
/* Do not edit the lines including this comment and
* EOF just after it because those are used as a
* robust marker for the autotest patch.
*/

View File

@ -142,17 +142,6 @@ int obtain_clone_cpuid(cpu_set_t *cpu_set, int use_last)
return min_cpu; return min_cpu;
} }
int
arch_clear_host_user_space()
{
struct thread *th = cpu_local_var(current);
/* XXX: might be unnecessary */
clear_host_pte(th->vm->region.user_start,
(th->vm->region.user_end - th->vm->region.user_start), 0);
return 0;
}
/* archtecture-depended syscall handlers */ /* archtecture-depended syscall handlers */
extern unsigned long do_fork(int clone_flags, unsigned long newsp, extern unsigned long do_fork(int clone_flags, unsigned long newsp,
unsigned long parent_tidptr, unsigned long child_tidptr, unsigned long parent_tidptr, unsigned long child_tidptr,
@ -185,33 +174,6 @@ SYSCALL_DECLARE(clone)
return ret; return ret;
} }
SYSCALL_DECLARE(rt_sigaction)
{
int sig = ihk_mc_syscall_arg0(ctx);
const struct sigaction *act = (const struct sigaction *)ihk_mc_syscall_arg1(ctx);
struct sigaction *oact = (struct sigaction *)ihk_mc_syscall_arg2(ctx);
size_t sigsetsize = ihk_mc_syscall_arg3(ctx);
struct k_sigaction new_sa, old_sa;
int rc;
if (sigsetsize != sizeof(sigset_t))
return -EINVAL;
if(act)
if(copy_from_user(&new_sa.sa, act, sizeof new_sa.sa)){
goto fault;
}
rc = do_sigaction(sig, act? &new_sa: NULL, oact? &old_sa: NULL);
if(rc == 0 && oact)
if(copy_to_user(oact, &old_sa.sa, sizeof old_sa.sa)){
goto fault;
}
return rc;
fault:
return -EFAULT;
}
SYSCALL_DECLARE(prctl) SYSCALL_DECLARE(prctl)
{ {
struct process *proc = cpu_local_var(current)->proc; struct process *proc = cpu_local_var(current)->proc;
@ -1368,70 +1330,6 @@ out:
return restart; return restart;
} }
static struct sig_pending *
getsigpending(struct thread *thread, int delflag){
struct list_head *head;
mcs_rwlock_lock_t *lock;
struct mcs_rwlock_node_irqsave mcs_rw_node;
struct sig_pending *next;
struct sig_pending *pending;
__sigset_t w;
w = thread->sigmask.__val[0];
lock = &thread->sigcommon->lock;
head = &thread->sigcommon->sigpending;
for(;;) {
if (delflag) {
mcs_rwlock_writer_lock(lock, &mcs_rw_node);
}
else {
mcs_rwlock_reader_lock(lock, &mcs_rw_node);
}
list_for_each_entry_safe(pending, next, head, list){
if(!(pending->sigmask.__val[0] & w)){
if(delflag)
list_del(&pending->list);
if (delflag) {
mcs_rwlock_writer_unlock(lock, &mcs_rw_node);
}
else {
mcs_rwlock_reader_unlock(lock, &mcs_rw_node);
}
return pending;
}
}
if (delflag) {
mcs_rwlock_writer_unlock(lock, &mcs_rw_node);
}
else {
mcs_rwlock_reader_unlock(lock, &mcs_rw_node);
}
if(lock == &thread->sigpendinglock)
return NULL;
lock = &thread->sigpendinglock;
head = &thread->sigpending;
}
return NULL;
}
struct sig_pending *
hassigpending(struct thread *thread)
{
if (list_empty(&thread->sigpending) &&
list_empty(&thread->sigcommon->sigpending)) {
return NULL;
}
return getsigpending(thread, 0);
}
int int
interrupt_from_user(void *regs0) interrupt_from_user(void *regs0)
{ {
@ -1455,191 +1353,6 @@ void save_syscall_return_value(int num, unsigned long rc)
} }
} }
void
check_signal(unsigned long rc, void *regs0, int num)
{
__check_signal(rc, regs0, num, 0);
}
void
check_signal_irq_disabled(unsigned long rc, void *regs0, int num)
{
__check_signal(rc, regs0, num, 1);
}
static void
__check_signal(unsigned long rc, void *regs0, int num, int irq_disabled)
{
ihk_mc_user_context_t *regs = regs0;
struct thread *thread;
struct sig_pending *pending;
int irqstate;
if(clv == NULL)
return;
thread = cpu_local_var(current);
if(thread == NULL || thread->proc->pid == 0){
struct thread *t;
irqstate = cpu_disable_interrupt_save();
ihk_mc_spinlock_lock_noirq(&(cpu_local_var(runq_lock)));
list_for_each_entry(t, &(cpu_local_var(runq)), sched_list){
if(t->proc->pid <= 0)
continue;
if(t->status == PS_INTERRUPTIBLE &&
hassigpending(t)){
t->status = PS_RUNNING;
break;
}
}
ihk_mc_spinlock_unlock_noirq(&(cpu_local_var(runq_lock)));
cpu_restore_interrupt(irqstate);
goto out;
}
if(regs != NULL && !interrupt_from_user(regs)) {
goto out;
}
if (list_empty(&thread->sigpending) &&
list_empty(&thread->sigcommon->sigpending)) {
goto out;
}
for(;;){
/* When this function called from check_signal_irq_disabled,
* return with interrupt invalid.
* This is to eliminate signal loss.
*/
if (irq_disabled == 1) {
irqstate = cpu_disable_interrupt_save();
}
pending = getsigpending(thread, 1);
if(!pending) {
dkprintf("check_signal,queue is empty\n");
goto out;
}
if (irq_disabled == 1) {
cpu_restore_interrupt(irqstate);
}
if (do_signal(rc, regs, thread, pending, num)) {
num = -1;
}
}
out:
return;
}
static int
check_sig_pending_thread(struct thread *thread)
{
int found = 0;
struct list_head *head;
mcs_rwlock_lock_t *lock;
struct mcs_rwlock_node_irqsave mcs_rw_node;
struct sig_pending *next;
struct sig_pending *pending;
__sigset_t w;
__sigset_t x;
int sig = 0;
struct k_sigaction *k;
struct cpu_local_var *v;
v = get_this_cpu_local_var();
w = thread->sigmask.__val[0];
lock = &thread->sigcommon->lock;
head = &thread->sigcommon->sigpending;
for (;;) {
mcs_rwlock_reader_lock(lock, &mcs_rw_node);
list_for_each_entry_safe(pending, next, head, list) {
for (x = pending->sigmask.__val[0], sig = 0; x;
sig++, x >>= 1)
;
k = thread->sigcommon->action + sig - 1;
if ((sig != SIGCHLD &&
sig != SIGURG &&
sig != SIGCONT) ||
(k->sa.sa_handler != SIG_IGN &&
k->sa.sa_handler != NULL)) {
if (!(pending->sigmask.__val[0] & w)) {
if (pending->interrupted == 0) {
pending->interrupted = 1;
found = 1;
if (sig != SIGCHLD &&
sig != SIGURG &&
sig != SIGCONT &&
!k->sa.sa_handler) {
found = 2;
break;
}
}
}
}
}
mcs_rwlock_reader_unlock(lock, &mcs_rw_node);
if (found == 2) {
break;
}
if (lock == &thread->sigpendinglock) {
break;
}
lock = &thread->sigpendinglock;
head = &thread->sigpending;
}
if (found == 2) {
ihk_mc_spinlock_unlock(&v->runq_lock, v->runq_irqstate);
terminate_mcexec(0, sig);
return 1;
}
else if (found == 1) {
ihk_mc_spinlock_unlock(&v->runq_lock, v->runq_irqstate);
interrupt_syscall(thread, 0);
return 1;
}
return 0;
}
void
check_sig_pending(void)
{
struct thread *thread;
struct cpu_local_var *v;
if (clv == NULL)
return;
v = get_this_cpu_local_var();
repeat:
v->runq_irqstate = ihk_mc_spinlock_lock(&v->runq_lock);
list_for_each_entry(thread, &(v->runq), sched_list) {
if (thread == NULL || thread == &cpu_local_var(idle)) {
continue;
}
if (thread->in_syscall_offload == 0) {
continue;
}
if (thread->proc->group_exit_status & 0x0000000100000000L) {
continue;
}
if (check_sig_pending_thread(thread))
goto repeat;
}
ihk_mc_spinlock_unlock(&v->runq_lock, v->runq_irqstate);
}
unsigned long unsigned long
do_kill(struct thread * thread, int pid, int tid, int sig, siginfo_t *info, int ptracecont) do_kill(struct thread * thread, int pid, int tid, int sig, siginfo_t *info, int ptracecont)
{ {

View File

@ -84,7 +84,11 @@ enum __rlimit_resource
__RLIMIT_RTPRIO = 14, __RLIMIT_RTPRIO = 14,
#define RLIMIT_RTPRIO __RLIMIT_RTPRIO #define RLIMIT_RTPRIO __RLIMIT_RTPRIO
__RLIMIT_NLIMITS = 15, /* timeout for RT tasks in us */
__RLIMIT_RTTIME = 15,
#define RLIMIT_RTTIME __RLIMIT_RTTIME
__RLIMIT_NLIMITS = 16,
__RLIM_NLIMITS = __RLIMIT_NLIMITS __RLIM_NLIMITS = __RLIMIT_NLIMITS
#define RLIMIT_NLIMITS __RLIMIT_NLIMITS #define RLIMIT_NLIMITS __RLIMIT_NLIMITS
#define RLIM_NLIMITS __RLIM_NLIMITS #define RLIM_NLIMITS __RLIM_NLIMITS

View File

@ -74,6 +74,7 @@ SYSCALL_DELEGATED(89, readlink)
SYSCALL_HANDLED(96, gettimeofday) SYSCALL_HANDLED(96, gettimeofday)
SYSCALL_HANDLED(97, getrlimit) SYSCALL_HANDLED(97, getrlimit)
SYSCALL_HANDLED(98, getrusage) SYSCALL_HANDLED(98, getrusage)
SYSCALL_HANDLED(99, sysinfo)
SYSCALL_HANDLED(100, times) SYSCALL_HANDLED(100, times)
SYSCALL_HANDLED(101, ptrace) SYSCALL_HANDLED(101, ptrace)
SYSCALL_HANDLED(102, getuid) SYSCALL_HANDLED(102, getuid)
@ -157,6 +158,7 @@ SYSCALL_HANDLED(289, signalfd4)
#ifdef ENABLE_PERF #ifdef ENABLE_PERF
SYSCALL_HANDLED(298, perf_event_open) SYSCALL_HANDLED(298, perf_event_open)
#endif #endif
SYSCALL_HANDLED(302, prlimit64)
#ifdef DCFA_KMOD #ifdef DCFA_KMOD
SYSCALL_HANDLED(303, mod_call) SYSCALL_HANDLED(303, mod_call)
#endif #endif
@ -179,4 +181,8 @@ SYSCALL_HANDLED(802, linux_mlock)
SYSCALL_HANDLED(803, suspend_threads) SYSCALL_HANDLED(803, suspend_threads)
SYSCALL_HANDLED(804, resume_threads) SYSCALL_HANDLED(804, resume_threads)
SYSCALL_HANDLED(811, linux_spawn) SYSCALL_HANDLED(811, linux_spawn)
/**** End of File ****/
/* Do not edit the lines including this comment and
* EOF just after it because those are used as a
* robust marker for the autotest patch.
*/

View File

@ -147,44 +147,6 @@ int obtain_clone_cpuid(cpu_set_t *cpu_set, int use_last) {
return min_cpu; return min_cpu;
} }
int
arch_clear_host_user_space()
{
struct thread *th = cpu_local_var(current);
/* XXX: might be unnecessary */
clear_host_pte(th->vm->region.user_start,
(th->vm->region.user_end - th->vm->region.user_start), 0);
return 0;
}
SYSCALL_DECLARE(rt_sigaction)
{
int sig = ihk_mc_syscall_arg0(ctx);
const struct sigaction *act = (const struct sigaction *)ihk_mc_syscall_arg1(ctx);
struct sigaction *oact = (struct sigaction *)ihk_mc_syscall_arg2(ctx);
size_t sigsetsize = ihk_mc_syscall_arg3(ctx);
struct k_sigaction new_sa, old_sa;
int rc;
if (sigsetsize != sizeof(sigset_t))
return -EINVAL;
if(act)
if(copy_from_user(&new_sa.sa, act, sizeof new_sa.sa)){
goto fault;
}
rc = do_sigaction(sig, act? &new_sa: NULL, oact? &old_sa: NULL);
if(rc == 0 && oact)
if(copy_to_user(oact, &old_sa.sa, sizeof old_sa.sa)){
goto fault;
}
return rc;
fault:
return -EFAULT;
}
SYSCALL_DECLARE(prctl) SYSCALL_DECLARE(prctl)
{ {
struct process *proc = cpu_local_var(current)->proc; struct process *proc = cpu_local_var(current)->proc;
@ -1039,82 +1001,6 @@ out:
return restart; return restart;
} }
static struct sig_pending *
getsigpending(struct thread *thread, int delflag){
struct list_head *head;
mcs_rwlock_lock_t *lock;
struct mcs_rwlock_node_irqsave mcs_rw_node;
struct sig_pending *next;
struct sig_pending *pending;
__sigset_t w;
__sigset_t x;
int sig;
struct k_sigaction *k;
w = thread->sigmask.__val[0];
lock = &thread->sigcommon->lock;
head = &thread->sigcommon->sigpending;
for(;;) {
if (delflag) {
mcs_rwlock_writer_lock(lock, &mcs_rw_node);
}
else {
mcs_rwlock_reader_lock(lock, &mcs_rw_node);
}
list_for_each_entry_safe(pending, next, head, list){
for(x = pending->sigmask.__val[0], sig = 0; x; sig++, x >>= 1);
k = thread->sigcommon->action + sig - 1;
if(delflag ||
(sig != SIGCHLD &&
sig != SIGURG &&
sig != SIGCONT) ||
(k->sa.sa_handler != (void *)1 &&
k->sa.sa_handler != NULL)){
if(!(pending->sigmask.__val[0] & w)){
if(delflag)
list_del(&pending->list);
if (delflag) {
mcs_rwlock_writer_unlock(lock, &mcs_rw_node);
}
else {
mcs_rwlock_reader_unlock(lock, &mcs_rw_node);
}
return pending;
}
}
}
if (delflag) {
mcs_rwlock_writer_unlock(lock, &mcs_rw_node);
}
else {
mcs_rwlock_reader_unlock(lock, &mcs_rw_node);
}
if(lock == &thread->sigpendinglock)
return NULL;
lock = &thread->sigpendinglock;
head = &thread->sigpending;
}
return NULL;
}
struct sig_pending *
hassigpending(struct thread *thread)
{
if (list_empty(&thread->sigpending) &&
list_empty(&thread->sigcommon->sigpending)) {
return NULL;
}
return getsigpending(thread, 0);
}
int int
interrupt_from_user(void *regs0) interrupt_from_user(void *regs0)
{ {
@ -1129,175 +1015,6 @@ void save_syscall_return_value(int num, unsigned long rc)
return; return;
} }
/** \brief check arrived signals and processing
*
* @param rc return value of syscall
* @param regs0 context
* @param num syscall number (-1: Not called on exiting system call)
*/
void
check_signal(unsigned long rc, void *regs0, int num)
{
struct x86_user_context *regs = regs0;
struct thread *thread;
struct sig_pending *pending;
int irqstate;
if(clv == NULL)
return;
thread = cpu_local_var(current);
if(thread == NULL || thread == &cpu_local_var(idle)){
struct thread *t;
irqstate = cpu_disable_interrupt_save();
ihk_mc_spinlock_lock_noirq(&(cpu_local_var(runq_lock)));
list_for_each_entry(t, &(cpu_local_var(runq)), sched_list){
if(t == &cpu_local_var(idle))
continue;
if(t->status == PS_INTERRUPTIBLE &&
hassigpending(t)){
t->status = PS_RUNNING;
break;
}
}
ihk_mc_spinlock_unlock_noirq(&(cpu_local_var(runq_lock)));
cpu_restore_interrupt(irqstate);
goto out;
}
if(regs != NULL && !interrupt_from_user(regs)) {
goto out;
}
if (list_empty(&thread->sigpending) &&
list_empty(&thread->sigcommon->sigpending)) {
goto out;
}
for(;;){
pending = getsigpending(thread, 1);
if(!pending) {
dkprintf("check_signal,queue is empty\n");
goto out;
}
if (do_signal(rc, regs, thread, pending, num)) {
num = -1;
}
}
out:
return;
}
static int
check_sig_pending_thread(struct thread *thread)
{
int found = 0;
struct list_head *head;
mcs_rwlock_lock_t *lock;
struct mcs_rwlock_node_irqsave mcs_rw_node;
struct sig_pending *next;
struct sig_pending *pending;
__sigset_t w;
__sigset_t x;
int sig = 0;
struct k_sigaction *k;
struct cpu_local_var *v;
v = get_this_cpu_local_var();
w = thread->sigmask.__val[0];
lock = &thread->sigcommon->lock;
head = &thread->sigcommon->sigpending;
for (;;) {
mcs_rwlock_reader_lock(lock, &mcs_rw_node);
list_for_each_entry_safe(pending, next, head, list){
for (x = pending->sigmask.__val[0], sig = 0; x;
sig++, x >>= 1);
k = thread->sigcommon->action + sig - 1;
if ((sig != SIGCHLD &&
sig != SIGURG &&
sig != SIGCONT) ||
(k->sa.sa_handler != (void *)1 &&
k->sa.sa_handler != NULL)) {
if (!(pending->sigmask.__val[0] & w)) {
if (pending->interrupted == 0) {
pending->interrupted = 1;
found = 1;
if (sig != SIGCHLD &&
sig != SIGURG &&
sig != SIGCONT &&
!k->sa.sa_handler) {
found = 2;
break;
}
}
}
}
}
mcs_rwlock_reader_unlock(lock, &mcs_rw_node);
if (found == 2) {
break;
}
if (lock == &thread->sigpendinglock) {
break;
}
lock = &thread->sigpendinglock;
head = &thread->sigpending;
}
if (found == 2) {
ihk_mc_spinlock_unlock(&v->runq_lock, v->runq_irqstate);
terminate_mcexec(0, sig);
return 1;
}
else if (found == 1) {
ihk_mc_spinlock_unlock(&v->runq_lock, v->runq_irqstate);
interrupt_syscall(thread, 0);
return 1;
}
return 0;
}
void
check_sig_pending(void)
{
struct thread *thread;
struct cpu_local_var *v;
if (clv == NULL)
return;
v = get_this_cpu_local_var();
repeat:
v->runq_irqstate = ihk_mc_spinlock_lock(&v->runq_lock);
list_for_each_entry(thread, &(v->runq), sched_list) {
if (thread == NULL || thread == &cpu_local_var(idle)) {
continue;
}
if (thread->in_syscall_offload == 0) {
continue;
}
if (thread->proc->group_exit_status & 0x0000000100000000L) {
continue;
}
if (check_sig_pending_thread(thread))
goto repeat;
}
ihk_mc_spinlock_unlock(&v->runq_lock, v->runq_irqstate);
}
unsigned long unsigned long
do_kill(struct thread *thread, int pid, int tid, int sig, siginfo_t *info, do_kill(struct thread *thread, int pid, int tid, int sig, siginfo_t *info,
int ptracecont) int ptracecont)

View File

@ -91,6 +91,8 @@ struct program_image_section {
struct get_cpu_set_arg { struct get_cpu_set_arg {
int nr_processes; int nr_processes;
char *req_cpu_list; // Requested by user-space
int req_cpu_list_len; // Lenght of request string
int *process_rank; int *process_rank;
void *cpu_set; void *cpu_set;
size_t cpu_set_size; // Size in bytes size_t cpu_set_size; // Size in bytes

View File

@ -613,16 +613,88 @@ static long mcexec_get_cpuset(ihk_os_t os, unsigned long arg)
return -EINVAL; return -EINVAL;
} }
pe = &udp->part_exec;
mutex_lock(&pe->lock);
if (copy_from_user(&req, (void *)arg, sizeof(req))) { if (copy_from_user(&req, (void *)arg, sizeof(req))) {
printk("%s: error copying user request\n", __FUNCTION__); printk("%s: error copying user request\n", __FUNCTION__);
ret = -EINVAL; ret = -EINVAL;
goto put_and_unlock_out; goto put_out;
} }
/* User requested CPU mask? */
if (req.req_cpu_list && req.req_cpu_list_len) {
char *cpu_list = NULL;
cpu_list = kmalloc(req.req_cpu_list_len, GFP_KERNEL);
if (!cpu_list) {
printk("%s: error: allocating CPU list\n", __FUNCTION__);
ret = -ENOMEM;
goto put_out;
}
if (copy_from_user(cpu_list,
req.req_cpu_list, req.req_cpu_list_len)) {
printk("%s: error copying CPU list request\n", __FUNCTION__);
kfree(cpu_list);
ret = -EINVAL;
goto put_out;
}
cpus_used = kmalloc(sizeof(cpumask_t), GFP_KERNEL);
cpus_to_use = kmalloc(sizeof(cpumask_t), GFP_KERNEL);
if (!cpus_to_use || !cpus_used) {
printk("%s: error: allocating CPU mask\n", __FUNCTION__);
ret = -ENOMEM;
kfree(cpu_list);
goto put_out;
}
memset(cpus_used, 0, sizeof(cpumask_t));
memset(cpus_to_use, 0, sizeof(cpumask_t));
/* Parse CPU list */
if (cpulist_parse(cpu_list, cpus_to_use) < 0) {
printk("%s: invalid CPUs requested: %s\n",
__FUNCTION__, cpu_list);
ret = -EINVAL;
kfree(cpu_list);
goto put_out;
}
memcpy(cpus_used, cpus_to_use, sizeof(cpumask_t));
/* Copy mask to user-space */
if (copy_to_user(req.cpu_set, cpus_used,
(req.cpu_set_size < sizeof(cpumask_t) ?
req.cpu_set_size : sizeof(cpumask_t)))) {
printk("%s: error copying mask to user\n", __FUNCTION__);
ret = -EINVAL;
kfree(cpu_list);
goto put_out;
}
/* Copy IKC target core */
cpu = cpumask_next(-1, cpus_used);
if (copy_to_user(req.target_core, &cpu, sizeof(cpu))) {
printk("%s: error copying target core to user\n",
__FUNCTION__);
ret = -EINVAL;
kfree(cpu_list);
goto put_out;
}
/* Save in per-process structure */
memcpy(&ppd->cpu_set, cpus_used, sizeof(cpumask_t));
ppd->ikc_target_cpu = cpu;
printk("%s: %s -> target McKernel CPU: %d\n",
__func__, cpu_list, cpu);
ret = 0;
kfree(cpu_list);
goto put_out;
}
pe = &udp->part_exec;
mutex_lock(&pe->lock);
/* First process to enter CPU partitioning */ /* First process to enter CPU partitioning */
if (pe->nr_processes == -1) { if (pe->nr_processes == -1) {
pe->nr_processes = req.nr_processes; pe->nr_processes = req.nr_processes;
@ -997,11 +1069,14 @@ next_cpu:
ret = 0; ret = 0;
put_and_unlock_out: put_and_unlock_out:
mutex_unlock(&pe->lock);
put_out:
mcctrl_put_per_proc_data(ppd);
kfree(cpus_to_use); kfree(cpus_to_use);
kfree(cpus_used); kfree(cpus_used);
kfree(mcexec_cpu_set); kfree(mcexec_cpu_set);
mcctrl_put_per_proc_data(ppd);
mutex_unlock(&pe->lock);
return ret; return ret;
} }

View File

@ -539,7 +539,11 @@ retry_alloc:
#define USE_VM_INSERT_PFN 1 #define USE_VM_INSERT_PFN 1
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
#if defined(RHEL_RELEASE_CODE) && RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8, 2)
static vm_fault_t rus_vm_fault(struct vm_fault *vmf)
#else
static int rus_vm_fault(struct vm_fault *vmf) static int rus_vm_fault(struct vm_fault *vmf)
#endif
{ {
struct vm_area_struct *vma = vmf->vma; struct vm_area_struct *vma = vmf->vma;
#else #else

View File

@ -1322,7 +1322,8 @@ void init_sigaction(void)
master_tid = gettid(); master_tid = gettid();
for (i = 1; i <= 64; i++) { for (i = 1; i <= 64; i++) {
if (i != SIGKILL && i != SIGSTOP && i != SIGCHLD) { if (i != SIGKILL && i != SIGSTOP && i != SIGCHLD &&
i != SIGTSTP && i != SIGTTIN && i != SIGTTOU) {
struct sigaction act; struct sigaction act;
sigaction(i, NULL, &act); sigaction(i, NULL, &act);
@ -2211,6 +2212,64 @@ int main(int argc, char **argv)
pthread_spin_init(&overlay_fd_lock, 0); pthread_spin_init(&overlay_fd_lock, 0);
/* XXX: Fugaku: Fujitsu process placement fix */
if (getenv("FLIB_AFFINITY_ON_PROCESS")) {
char *cpu_s;
int flib_size;
char *flib_aff_orig, *flib_aff;
int cpu, off = 0;
flib_aff_orig = strdup(getenv("FLIB_AFFINITY_ON_PROCESS"));
if (!flib_aff_orig) {
fprintf(stderr, "error: dupping FLIB_AFFINITY_ON_PROCESS\n");
exit(EXIT_FAILURE);
}
flib_size = strlen(flib_aff_orig) * 2;
flib_aff = malloc(flib_size);
if (!flib_aff) {
fprintf(stderr, "error: allocating memory for "
"FLIB_AFFINITY_ON_PROCESS\n");
exit(EXIT_FAILURE);
}
memset(flib_aff, 0, flib_size);
cpu_s = strtok(flib_aff_orig, ",");
while (cpu_s) {
int ret;
/* "Shift" left by 12 CPUs */
cpu = atoi(cpu_s) - 12;
/* Prepend "," */
if (off > 0) {
ret = snprintf(flib_aff + off, flib_size - off, "%s", ",");
if (ret < 0) {
fprintf(stderr, "error: constructing "
"FLIB_AFFINITY_ON_PROCESS\n");
exit(EXIT_FAILURE);
}
off += ret;
}
ret = snprintf(flib_aff + off, flib_size - off, "%d", cpu);
if (ret < 0) {
fprintf(stderr, "error: constructing "
"FLIB_AFFINITY_ON_PROCESS\n");
exit(EXIT_FAILURE);
}
off += ret;
cpu_s = strtok(NULL, ",");
}
__dprintf("FLIB_AFFINITY_ON_PROCESS: %s -> %s\n",
getenv("FLIB_AFFINITY_ON_PROCESS"), flib_aff);
setenv("FLIB_AFFINITY_ON_PROCESS", flib_aff, 1);
}
ld_preload_init(); ld_preload_init();
#ifdef ADD_ENVS_OPTION #ifdef ADD_ENVS_OPTION
@ -2483,6 +2542,8 @@ int main(int argc, char **argv)
CPU_ZERO(&mcexec_cpu_set); CPU_ZERO(&mcexec_cpu_set);
cpu_set_arg.req_cpu_list = NULL;
cpu_set_arg.req_cpu_list_len = 0;
cpu_set_arg.cpu_set = (void *)&desc->cpu_set; cpu_set_arg.cpu_set = (void *)&desc->cpu_set;
cpu_set_arg.cpu_set_size = sizeof(desc->cpu_set); cpu_set_arg.cpu_set_size = sizeof(desc->cpu_set);
cpu_set_arg.nr_processes = nr_processes; cpu_set_arg.nr_processes = nr_processes;
@ -2493,6 +2554,16 @@ int main(int argc, char **argv)
cpu_set_arg.mcexec_cpu_set_size = sizeof(mcexec_cpu_set); cpu_set_arg.mcexec_cpu_set_size = sizeof(mcexec_cpu_set);
cpu_set_arg.ikc_mapped = &ikc_mapped; cpu_set_arg.ikc_mapped = &ikc_mapped;
/* Fugaku specific: Fujitsu CPU binding */
if (getenv("FLIB_AFFINITY_ON_PROCESS")) {
cpu_set_arg.req_cpu_list =
getenv("FLIB_AFFINITY_ON_PROCESS");
cpu_set_arg.req_cpu_list_len =
strlen(cpu_set_arg.req_cpu_list) + 1;
__dprintf("%s: requesting CPUs: %s\n",
__func__, cpu_set_arg.req_cpu_list);
}
if (ioctl(fd, MCEXEC_UP_GET_CPUSET, (void *)&cpu_set_arg) != 0) { if (ioctl(fd, MCEXEC_UP_GET_CPUSET, (void *)&cpu_set_arg) != 0) {
perror("getting CPU set for partitioned execution"); perror("getting CPU set for partitioned execution");
close(fd); close(fd);
@ -2501,6 +2572,12 @@ int main(int argc, char **argv)
desc->cpu = target_core; desc->cpu = target_core;
desc->process_rank = process_rank; desc->process_rank = process_rank;
/* Fugaku specific: Fujitsu node-local rank */
if (getenv("PLE_RANK_ON_NODE")) {
desc->process_rank = atoi(getenv("PLE_RANK_ON_NODE"));
__dprintf("%s: rank: %d, target CPU: %d\n",
__func__, desc->process_rank, desc->cpu);
}
/* Bind to CPU cores where the LWK process' IKC target maps to */ /* Bind to CPU cores where the LWK process' IKC target maps to */
if (ikc_mapped && !no_bind_ikc_map) { if (ikc_mapped && !no_bind_ikc_map) {

2
ihk

Submodule ihk updated: 1a6150c5bb...df12c9102c

View File

@ -139,7 +139,6 @@ static void hugefileobj_free(struct memobj *memobj)
struct memobj_ops hugefileobj_ops = { struct memobj_ops hugefileobj_ops = {
.free = hugefileobj_free, .free = hugefileobj_free,
.get_page = hugefileobj_get_page, .get_page = hugefileobj_get_page,
}; };
void hugefileobj_cleanup(void) void hugefileobj_cleanup(void)

View File

@ -72,4 +72,11 @@
#define MS_INVALIDATE 0x02 #define MS_INVALIDATE 0x02
#define MS_SYNC 0x04 #define MS_SYNC 0x04
/* include/uapi/linux/mman.h */
#define OVERCOMMIT_GUESS 0
#define OVERCOMMIT_ALWAYS 1
#define OVERCOMMIT_NEVER 2
extern int sysctl_overcommit_memory;
#endif /* HEADER_MMAN_H */ #endif /* HEADER_MMAN_H */

View File

@ -505,10 +505,12 @@ struct process {
// PS_STOPPED -----+ // PS_STOPPED -----+
// (PS_TRACED) // (PS_TRACED)
/* Store exit_status for a group of threads when stopped by SIGSTOP. /* Store exit_status for a group of threads when stopped by SIGSTOP. */
exit_status can't be used because values of exit_status of threads /* exit_status can't be used because values of exit_status of threads */
might divert while the threads are exiting by group_exit(). */ /* might divert while the threads are exiting by group_exit(). */
int group_exit_status; /* The upper 4 bytes of group_exit_status is the confirmation flag of */
/* exit status. The lower 4 bytes is the exit status. */
unsigned long group_exit_status;
/* Manage ptraced processes in the separate list to make it easy to /* Manage ptraced processes in the separate list to make it easy to
restore the orginal parent child relationship when restore the orginal parent child relationship when

View File

@ -11,6 +11,7 @@
#include <ihk/ihk_monitor.h> #include <ihk/ihk_monitor.h>
#include <ihk/debug.h> #include <ihk/debug.h>
#include <memory.h> #include <memory.h>
#include <mman.h>
#ifdef ENABLE_RUSAGE #ifdef ENABLE_RUSAGE
@ -56,6 +57,24 @@ rusage_total_memory_add(unsigned long size)
#endif #endif
} }
static inline unsigned long
rusage_get_total_memory()
{
return rusage.total_memory;
}
static inline unsigned long
rusage_get_free_memory()
{
return rusage.total_memory - rusage.total_memory_usage;
}
static inline unsigned long
rusage_get_usage_memory()
{
return rusage.total_memory_usage;
}
static inline void static inline void
rusage_rss_add(unsigned long size) rusage_rss_add(unsigned long size)
{ {
@ -293,6 +312,9 @@ rusage_check_overmap(size_t len, int pgshift)
{ {
int npages = 0, remain_pages = 0; int npages = 0, remain_pages = 0;
if (sysctl_overcommit_memory == OVERCOMMIT_ALWAYS)
return 0;
npages = (len + (1UL << pgshift) - 1) >> pgshift; npages = (len + (1UL << pgshift) - 1) >> pgshift;
remain_pages = (rusage.total_memory - rusage.total_memory_usage) remain_pages = (rusage.total_memory - rusage.total_memory_usage)
>> pgshift; >> pgshift;
@ -399,6 +421,24 @@ rusage_rss_add(unsigned long size)
{ {
} }
static inline unsigned long
rusage_get_total_memory()
{
return 0;
}
static inline unsigned long
rusage_get_free_memory()
{
return 0;
}
static inline unsigned long
rusage_get_usage_memory()
{
return 0;
}
static inline void static inline void
rusage_rss_sub(unsigned long size) rusage_rss_sub(unsigned long size)
{ {

View File

@ -443,6 +443,22 @@ struct rusage {
long ru_nivcsw; long ru_nivcsw;
}; };
struct sysinfo {
long uptime; /* Seconds since boot */
unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
unsigned long totalram; /* Total usable main memory size */
unsigned long freeram; /* Available memory size */
unsigned long sharedram; /* Amount of shared memory */
unsigned long bufferram; /* Memory used by buffers */
unsigned long totalswap; /* Total swap space size */
unsigned long freeswap; /* swap space still available */
unsigned short procs; /* Number of current processes */
unsigned long totalhigh; /* Total high memory size */
unsigned long freehigh; /* Available high memory size */
unsigned int mem_unit; /* Memory unit size in bytes */
char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding for libc5 */
};
extern void terminate(int, int); extern void terminate(int, int);
struct tod_data_s { struct tod_data_s {
@ -635,4 +651,6 @@ extern int (*linux_clock_gettime)(clockid_t clk_id, struct timespec *tp);
#define COREDUMP_TO_BE_WOKEN 2 #define COREDUMP_TO_BE_WOKEN 2
extern void terminate_host(int pid, struct thread *thread); extern void terminate_host(int pid, struct thread *thread);
struct sig_pending *getsigpending(struct thread *thread, int delflag);
int interrupt_from_user(void *regs0);
#endif #endif

View File

@ -62,6 +62,7 @@ extern int interrupt_from_user(void *);
struct tlb_flush_entry tlb_flush_vector[IHK_TLB_FLUSH_IRQ_VECTOR_SIZE]; struct tlb_flush_entry tlb_flush_vector[IHK_TLB_FLUSH_IRQ_VECTOR_SIZE];
int anon_on_demand = 0; int anon_on_demand = 0;
int sysctl_overcommit_memory = OVERCOMMIT_ALWAYS;
static struct ihk_mc_pa_ops *pa_ops; static struct ihk_mc_pa_ops *pa_ops;

View File

@ -2176,13 +2176,62 @@ static int do_page_fault_process_vm(struct process_vm *vm, void *fault_addr0, ui
{ {
int error; int error;
const uintptr_t fault_addr = (uintptr_t)fault_addr0; const uintptr_t fault_addr = (uintptr_t)fault_addr0;
struct vm_range *range; struct vm_range *range = NULL;
struct thread *thread = cpu_local_var(current); struct thread *thread = cpu_local_var(current);
int locked = 0; int locked = 0;
dkprintf("[%d]do_page_fault_process_vm(%p,%lx,%lx)\n", dkprintf("[%d]do_page_fault_process_vm(%p,%lx,%lx)\n",
ihk_mc_get_processor_id(), vm, fault_addr0, reason); ihk_mc_get_processor_id(), vm, fault_addr0, reason);
/* grow stack */
if (fault_addr >= thread->vm->region.stack_start &&
fault_addr < thread->vm->region.stack_end) {
range = lookup_process_memory_range(vm,
thread->vm->region.stack_end - 1,
thread->vm->region.stack_end);
if (range == NULL) {
error = -EFAULT;
ekprintf("%s: vm: %p, addr: %p, reason: %lx):"
"stack not found: %d\n",
__func__, vm, fault_addr0, reason, error);
goto out;
}
/* don't grow if replaced with hugetlbfs */
if (range->memobj) {
goto skip;
}
if (fault_addr >= range->start) {
goto skip;
}
if (thread->vm->is_memory_range_lock_taken == -1 ||
thread->vm->is_memory_range_lock_taken !=
ihk_mc_get_processor_id()) {
ihk_rwspinlock_write_lock_noirq(&vm->memory_range_lock);
locked = 1;
}
if (range->pgshift) {
range->start = fault_addr &
~((1UL << range->pgshift) - 1);
} else {
range->start = fault_addr & PAGE_MASK;
}
if (locked) {
ihk_rwspinlock_write_unlock_noirq(&vm->memory_range_lock);
locked = 0;
}
dkprintf("%s: addr: %lx, reason: %lx, range: %lx-%lx:"
"stack found\n",
__func__, (unsigned long)fault_addr, reason,
range->start, range->end);
}
skip:
if (thread->vm->is_memory_range_lock_taken == -1 || if (thread->vm->is_memory_range_lock_taken == -1 ||
thread->vm->is_memory_range_lock_taken != ihk_mc_get_processor_id()) { thread->vm->is_memory_range_lock_taken != ihk_mc_get_processor_id()) {
ihk_rwspinlock_read_lock_noirq(&vm->memory_range_lock); ihk_rwspinlock_read_lock_noirq(&vm->memory_range_lock);
@ -2197,14 +2246,17 @@ static int do_page_fault_process_vm(struct process_vm *vm, void *fault_addr0, ui
goto out; goto out;
} }
range = lookup_process_memory_range(vm, fault_addr, fault_addr+1); if (!range) {
range = lookup_process_memory_range(vm, fault_addr,
fault_addr+1);
if (range == NULL) { if (range == NULL) {
error = -EFAULT; error = -EFAULT;
dkprintf("do_page_fault_process_vm(): vm: %p, addr: %p, reason: %lx):" dkprintf("%s: vm: %p, addr: %p, reason: %lx):"
"out of range: %d\n", "out of range: %d\n",
vm, fault_addr0, reason, error); __func__, vm, fault_addr0, reason, error);
goto out; goto out;
} }
}
if (((range->flag & VR_PROT_MASK) == VR_PROT_NONE) if (((range->flag & VR_PROT_MASK) == VR_PROT_NONE)
|| (((reason & PF_WRITE) && !(reason & PF_PATCH)) || (((reason & PF_WRITE) && !(reason & PF_PATCH))
@ -2367,16 +2419,15 @@ int init_process_stack(struct thread *thread, struct program_load_desc *pn,
size = minsz; size = minsz;
} }
size = (size + USER_STACK_PREPAGE_SIZE - 1) & USER_STACK_PAGE_MASK; size = (size + USER_STACK_PREPAGE_SIZE - 1) & USER_STACK_PAGE_MASK;
dkprintf("%s: stack_premap: %lu, rlim_cur: %lu, minsz: %lu, size: %lu\n", dkprintf("%s: stack_premap: %lu, rlim_cur: %lu, minsz: %lu, size: %lu, maxsz: %lx\n",
__FUNCTION__, __func__, pn->stack_premap,
pn->stack_premap,
proc->rlimit[MCK_RLIMIT_STACK].rlim_cur, proc->rlimit[MCK_RLIMIT_STACK].rlim_cur,
minsz, size); minsz, size, maxsz);
start = (end - size) & USER_STACK_PAGE_MASK; start = (end - minsz) & USER_STACK_PAGE_MASK;
/* Apply user allocation policy to stacks */ /* Apply user allocation policy to stacks */
/* TODO: make threshold kernel or mcexec argument */ /* TODO: make threshold kernel or mcexec argument */
ap_flag = (size >= proc->mpol_threshold && ap_flag = (minsz >= proc->mpol_threshold &&
!(proc->mpol_flags & MPOL_NO_STACK)) ? IHK_MC_AP_USER : 0; !(proc->mpol_flags & MPOL_NO_STACK)) ? IHK_MC_AP_USER : 0;
dkprintf("%s: max size: %lu, mapped size: %lu %s\n", dkprintf("%s: max size: %lu, mapped size: %lu %s\n",
__FUNCTION__, size, minsz, __FUNCTION__, size, minsz,
@ -2508,7 +2559,7 @@ int init_process_stack(struct thread *thread, struct program_load_desc *pn,
ihk_mc_modify_user_context(thread->uctx, IHK_UCR_STACK_POINTER, ihk_mc_modify_user_context(thread->uctx, IHK_UCR_STACK_POINTER,
end + sizeof(unsigned long) * s_ind); end + sizeof(unsigned long) * s_ind);
thread->vm->region.stack_end = end; thread->vm->region.stack_end = end;
thread->vm->region.stack_start = start; thread->vm->region.stack_start = (end - size) & USER_STACK_PAGE_MASK;
return 0; return 0;
} }

View File

@ -120,7 +120,6 @@ extern int num_processors;
extern unsigned long ihk_mc_get_ns_per_tsc(void); extern unsigned long ihk_mc_get_ns_per_tsc(void);
extern int ptrace_detach(int pid, int data); extern int ptrace_detach(int pid, int data);
extern void debug_log(unsigned long); extern void debug_log(unsigned long);
extern int arch_clear_host_user_space();
extern long arch_ptrace(long request, int pid, long addr, long data); extern long arch_ptrace(long request, int pid, long addr, long data);
extern struct cpu_local_var *clv; extern struct cpu_local_var *clv;
@ -242,11 +241,6 @@ long do_syscall(struct syscall_request *req, int cpu)
unsigned long flags; unsigned long flags;
DECLARE_WAITQ_ENTRY(scd_wq_entry, cpu_local_var(current)); DECLARE_WAITQ_ENTRY(scd_wq_entry, cpu_local_var(current));
if (req->number == __NR_epoll_wait ||
req->number == __NR_epoll_pwait ||
req->number == __NR_ppoll)
goto schedule;
cpu_pause(); cpu_pause();
/* Spin if not preemptable */ /* Spin if not preemptable */
@ -275,7 +269,6 @@ long do_syscall(struct syscall_request *req, int cpu)
continue; continue;
} }
schedule:
flags = cpu_disable_interrupt_save(); flags = cpu_disable_interrupt_save();
/* Try to sleep until notified */ /* Try to sleep until notified */
@ -455,34 +448,59 @@ static int wait_stopped(struct thread *thread, struct process *child, struct thr
thread->proc->pid, child->pid, options); thread->proc->pid, child->pid, options);
int ret; int ret;
/* Copy exit_status created in do_signal */
int *exit_status;
if (c_thread) { if (c_thread) {
exit_status = &c_thread->exit_status;
}
else if (child->status & (PS_STOPPED | PS_DELAY_STOPPED)) {
exit_status = &child->group_exit_status;
}
else {
exit_status = &child->main_thread->exit_status;
}
/* Skip this process because exit_status has been reaped. */ /* Skip this process because exit_status has been reaped. */
if (!*exit_status) { if (!c_thread->exit_status) {
ret = 0; ret = 0;
goto out; goto out;
} }
/* TODO: define 0x7f in kernel/include/process.h */ /* TODO: define 0x7f in kernel/include/process.h */
if (status) { if (status) {
*status = (*exit_status << 8) | 0x7f; *status = (c_thread->exit_status << 8) | 0x7f;
} }
/* Reap exit_status. signal_flags is reaped on receiving signal /* Reap exit_status. signal_flags is reaped on receiving */
in do_kill(). */ /* signal in do_kill(). */
if(!(options & WNOWAIT)) { if (!(options & WNOWAIT)) {
*exit_status = 0; c_thread->exit_status = 0;
}
}
else if (child->status & (PS_STOPPED | PS_DELAY_STOPPED)) {
/* Skip this process because exit_status has been reaped. */
if (!child->group_exit_status) {
ret = 0;
goto out;
}
/* TODO: define 0x7f in kernel/include/process.h */
if (status) {
*status = (child->group_exit_status << 8) | 0x7f;
}
/* Reap exit_status. signal_flags is reaped on receiving */
/* signal in do_kill(). */
if (!(options & WNOWAIT)) {
child->group_exit_status = 0;
}
}
else {
/* Skip this process because exit_status has been reaped. */
if (!child->main_thread->exit_status) {
ret = 0;
goto out;
}
/* TODO: define 0x7f in kernel/include/process.h */
if (status) {
*status = (child->main_thread->exit_status << 8) | 0x7f;
}
/* Reap exit_status. signal_flags is reaped on receiving */
/* signal in do_kill(). */
if (!(options & WNOWAIT)) {
child->main_thread->exit_status = 0;
}
} }
dkprintf("wait_stopped,child->pid=%d,status=%08x\n", dkprintf("wait_stopped,child->pid=%d,status=%08x\n",
@ -2660,10 +2678,8 @@ static int do_execveat(ihk_mc_user_context_t *ctx, int dirfd,
} }
/* Clear host user space PTEs */ /* Clear host user space PTEs */
if (arch_clear_host_user_space()) { clear_host_pte(vm->region.user_start,
kprintf("execve(): ERROR: clearing PTEs in host process\n"); (vm->region.user_end - vm->region.user_start), 0);
panic("");
}
/* Request host to transfer ELF image */ /* Request host to transfer ELF image */
request.number = __NR_execve; request.number = __NR_execve;
@ -3224,7 +3240,6 @@ SYSCALL_DECLARE(kill)
return error; return error;
} }
// see linux-2.6.34.13/kernel/signal.c
SYSCALL_DECLARE(tgkill) SYSCALL_DECLARE(tgkill)
{ {
int tgid = ihk_mc_syscall_arg0(ctx); int tgid = ihk_mc_syscall_arg0(ctx);
@ -3233,16 +3248,15 @@ SYSCALL_DECLARE(tgkill)
struct thread *thread = cpu_local_var(current); struct thread *thread = cpu_local_var(current);
struct siginfo info; struct siginfo info;
if (tgid <= 0 || tid <= 0) {
return -EINVAL;
}
memset(&info, '\0', sizeof info); memset(&info, '\0', sizeof info);
info.si_signo = sig; info.si_signo = sig;
info.si_code = SI_TKILL; info.si_code = SI_TKILL;
info._sifields._kill.si_pid = thread->proc->pid; info._sifields._kill.si_pid = thread->proc->pid;
if(tid <= 0)
return -EINVAL;
if(tgid <= 0 && tgid != -1)
return -EINVAL;
return do_kill(thread, tgid, tid, sig, &info, 0); return do_kill(thread, tgid, tid, sig, &info, 0);
} }
@ -3517,9 +3531,15 @@ SYSCALL_DECLARE(setpgid)
/* Ignore the registration by start_thread() (in pthread_create.c) /* Ignore the registration by start_thread() (in pthread_create.c)
because McKernel doesn't unlock mutex-es held by the thread which has been killed. */ because McKernel doesn't unlock mutex-es held by the thread which has been killed. */
#define ROBUST_LIST_HEAD_SIZE 24
SYSCALL_DECLARE(set_robust_list) SYSCALL_DECLARE(set_robust_list)
{ {
// Palliative fix. wait for impl. size_t len = (size_t)ihk_mc_syscall_arg1(ctx);
if (len != ROBUST_LIST_HEAD_SIZE) {
return -EINVAL;
}
return 0; return 0;
} }
@ -5140,6 +5160,37 @@ SYSCALL_DECLARE(rt_sigsuspend)
return do_sigsuspend(thread, &wset); return do_sigsuspend(thread, &wset);
} }
SYSCALL_DECLARE(rt_sigaction)
{
int sig = ihk_mc_syscall_arg0(ctx);
const struct sigaction *act =
(const struct sigaction *)ihk_mc_syscall_arg1(ctx);
struct sigaction *oact = (struct sigaction *)ihk_mc_syscall_arg2(ctx);
size_t sigsetsize = ihk_mc_syscall_arg3(ctx);
struct k_sigaction new_sa, old_sa;
int rc;
if (sigsetsize != sizeof(sigset_t))
return -EINVAL;
if (act) {
if (copy_from_user(&new_sa.sa, act, sizeof(new_sa.sa))) {
goto fault;
}
}
rc = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL);
if (rc == 0 && oact) {
if (copy_to_user(oact, &old_sa.sa, sizeof(old_sa.sa))) {
goto fault;
}
}
return rc;
fault:
return -EFAULT;
}
SYSCALL_DECLARE(sigaltstack) SYSCALL_DECLARE(sigaltstack)
{ {
struct thread *thread = cpu_local_var(current); struct thread *thread = cpu_local_var(current);
@ -6544,71 +6595,162 @@ static int rlimits[] = {
#endif #endif
}; };
SYSCALL_DECLARE(setrlimit) static int do_prlimit64(int pid, int resource, struct rlimit *_new_limit,
struct rlimit *old_limit)
{ {
int rc; struct rlimit new_limit;
int resource = ihk_mc_syscall_arg0(ctx); int resource_found;
struct rlimit *rlm = (struct rlimit *)ihk_mc_syscall_arg1(ctx);
struct thread *thread = cpu_local_var(current);
int i; int i;
struct rlimit new_rlim;
int mcresource; int mcresource;
struct process *proc;
struct resource_set *rset = cpu_local_var(resource_set);
int hash;
struct process_hash *phash = rset->process_hash;
struct mcs_rwlock_node exist_lock;
struct mcs_rwlock_node update_lock;
unsigned long irqstate;
int found;
int ret;
ihk_mc_user_context_t ctx;
if (copy_from_user(&new_rlim, rlm, sizeof(*rlm))) { if (resource < 0 || resource >= RLIMIT_NLIMITS) {
return -EFAULT;
}
if (new_rlim.rlim_cur > new_rlim.rlim_max) {
return -EINVAL; return -EINVAL;
} }
switch(resource){ if (_new_limit) {
if (copy_from_user(&new_limit, _new_limit,
sizeof(struct rlimit))) {
return -EFAULT;
}
if (new_limit.rlim_cur > new_limit.rlim_max) {
return -EINVAL;
}
/* update Linux side value as well */
switch (resource) {
case RLIMIT_FSIZE: case RLIMIT_FSIZE:
case RLIMIT_NOFILE: case RLIMIT_NOFILE:
case RLIMIT_LOCKS: case RLIMIT_LOCKS:
case RLIMIT_MSGQUEUE: case RLIMIT_MSGQUEUE:
rc = syscall_generic_forwarding(__NR_setrlimit, ctx); ihk_mc_syscall_arg0(&ctx) = pid;
if(rc < 0) ihk_mc_syscall_arg1(&ctx) = resource;
return rc; ihk_mc_syscall_arg2(&ctx) =
(unsigned long)_new_limit;
ihk_mc_syscall_arg3(&ctx) =
(unsigned long)old_limit;
ret = syscall_generic_forwarding(__NR_prlimit64, &ctx);
if (ret < 0)
return ret;
break; break;
} }
}
for(i = 0; i < sizeof(rlimits) / sizeof(int); i += 2) /* translate resource */
if(rlimits[i] == resource){ resource_found = 0;
for (i = 0; i < sizeof(rlimits) / sizeof(int); i += 2) {
if (rlimits[i] == resource) {
mcresource = rlimits[i + 1]; mcresource = rlimits[i + 1];
resource_found = 1;
break; break;
} }
if(i >= sizeof(rlimits) / sizeof(int)){
return syscall_generic_forwarding(__NR_setrlimit, ctx);
} }
memcpy(thread->proc->rlimit + mcresource, &new_rlim, if (!resource_found) {
sizeof(new_rlim)); ihk_mc_syscall_arg0(&ctx) = pid;
ihk_mc_syscall_arg1(&ctx) = resource;
ihk_mc_syscall_arg2(&ctx) =
(unsigned long)_new_limit;
ihk_mc_syscall_arg3(&ctx) =
(unsigned long)old_limit;
return syscall_generic_forwarding(__NR_prlimit64, &ctx);
}
return 0; /* find process */
found = 0;
if (pid == 0) {
struct thread *thread = cpu_local_var(current);
pid = thread->proc->pid;
}
irqstate = cpu_disable_interrupt_save();
hash = process_hash(pid);
mcs_rwlock_reader_lock_noirq(&phash->lock[hash], &exist_lock);
list_for_each_entry(proc, &phash->list[hash], hash_list) {
if (proc->pid == pid) {
found = 1;
break;
}
}
if (!found) {
mcs_rwlock_reader_unlock_noirq(&phash->lock[hash], &exist_lock);
cpu_restore_interrupt(irqstate);
return -ESRCH;
}
if (_new_limit) {
mcs_rwlock_writer_lock_noirq(&proc->update_lock, &update_lock);
} else {
mcs_rwlock_reader_lock_noirq(&proc->update_lock, &update_lock);
}
if (old_limit) {
if (copy_to_user(old_limit, proc->rlimit + mcresource,
sizeof(struct rlimit))) {
ret = -EFAULT;
goto out;
}
}
if (_new_limit) {
memcpy(proc->rlimit + mcresource, &new_limit,
sizeof(struct rlimit));
}
ret = 0;
out:
if (_new_limit) {
mcs_rwlock_writer_unlock_noirq(&proc->update_lock,
&update_lock);
} else {
mcs_rwlock_reader_unlock_noirq(&proc->update_lock,
&update_lock);
}
mcs_rwlock_reader_unlock_noirq(&phash->lock[hash], &exist_lock);
cpu_restore_interrupt(irqstate);
return ret;
}
SYSCALL_DECLARE(setrlimit)
{
int resource = ihk_mc_syscall_arg0(ctx);
struct rlimit *new_limit = (struct rlimit *)ihk_mc_syscall_arg1(ctx);
return do_prlimit64(0, resource, new_limit, NULL);
} }
SYSCALL_DECLARE(getrlimit) SYSCALL_DECLARE(getrlimit)
{ {
int resource = ihk_mc_syscall_arg0(ctx); int resource = ihk_mc_syscall_arg0(ctx);
struct rlimit *rlm = (struct rlimit *)ihk_mc_syscall_arg1(ctx); struct rlimit *old_limit = (struct rlimit *)ihk_mc_syscall_arg1(ctx);
struct thread *thread = cpu_local_var(current);
int i;
int mcresource;
for(i = 0; i < sizeof(rlimits) / sizeof(int); i += 2) return do_prlimit64(0, resource, NULL, old_limit);
if(rlimits[i] == resource){ }
mcresource = rlimits[i + 1];
break;
}
if(i >= sizeof(rlimits) / sizeof(int)){
return syscall_generic_forwarding(__NR_getrlimit, ctx);
}
// TODO: check limit SYSCALL_DECLARE(prlimit64)
if(copy_to_user(rlm, thread->proc->rlimit + mcresource, sizeof(struct rlimit))) {
return -EFAULT; int pid = ihk_mc_syscall_arg0(ctx);
int resource = ihk_mc_syscall_arg1(ctx);
struct rlimit *new_limit = (struct rlimit *)ihk_mc_syscall_arg2(ctx);
struct rlimit *old_limit = (struct rlimit *)ihk_mc_syscall_arg3(ctx);
return 0; return do_prlimit64(pid, resource, new_limit, old_limit);
} }
SYSCALL_DECLARE(getrusage) SYSCALL_DECLARE(getrusage)
@ -6686,6 +6828,27 @@ SYSCALL_DECLARE(getrusage)
return 0; return 0;
} }
SYSCALL_DECLARE(sysinfo)
{
struct sysinfo *sysinfo = (struct sysinfo *)ihk_mc_syscall_arg0(ctx);
struct sysinfo __sysinfo;
int ret = 0;
memset(&__sysinfo, '\0', sizeof(struct sysinfo));
__sysinfo.totalram = rusage_get_total_memory();
__sysinfo.freeram = rusage_get_free_memory();
__sysinfo.mem_unit = 1; // always one unit for McKernel
if (copy_to_user(sysinfo, &__sysinfo, sizeof(struct sysinfo))) {
ret = -EFAULT;
goto out;
}
out:
return ret;
}
extern int ptrace_traceme(void); extern int ptrace_traceme(void);
extern void set_single_step(struct thread *thread); extern void set_single_step(struct thread *thread);
@ -10320,11 +10483,7 @@ long syscall(int num, ihk_mc_user_context_t *ctx)
} }
#endif // PROFILE_ENABLE #endif // PROFILE_ENABLE
/* Do not deschedule when returning from an event (e.g., MPI) */ if (smp_load_acquire(&v->flags) & CPU_FLAG_NEED_RESCHED) {
if (!(num == __NR_epoll_wait ||
num == __NR_epoll_pwait ||
num == __NR_ppoll) &&
smp_load_acquire(&v->flags) & CPU_FLAG_NEED_RESCHED) {
check_need_resched(); check_need_resched();
} }
@ -10345,3 +10504,275 @@ long syscall(int num, ihk_mc_user_context_t *ctx)
return l; return l;
} }
static int
check_sig_pending_thread(struct thread *thread)
{
int found = 0;
struct list_head *head;
mcs_rwlock_lock_t *lock;
struct mcs_rwlock_node_irqsave mcs_rw_node;
struct sig_pending *next;
struct sig_pending *pending;
__sigset_t w;
__sigset_t x;
int sig = 0;
struct k_sigaction *k;
struct cpu_local_var *v;
v = get_this_cpu_local_var();
w = thread->sigmask.__val[0];
lock = &thread->sigcommon->lock;
head = &thread->sigcommon->sigpending;
for (;;) {
mcs_rwlock_reader_lock(lock, &mcs_rw_node);
list_for_each_entry_safe(pending, next, head, list) {
for (x = pending->sigmask.__val[0], sig = 0; x;
sig++, x >>= 1) {
}
k = thread->sigcommon->action + sig - 1;
if ((sig != SIGCHLD &&
sig != SIGURG &&
sig != SIGCONT) ||
(k->sa.sa_handler != SIG_IGN &&
k->sa.sa_handler != NULL)) {
if (!(pending->sigmask.__val[0] & w)) {
if (pending->interrupted == 0) {
pending->interrupted = 1;
found = 1;
if (sig != SIGCHLD &&
sig != SIGURG &&
sig != SIGCONT &&
!k->sa.sa_handler) {
found = 2;
break;
}
}
}
}
}
mcs_rwlock_reader_unlock(lock, &mcs_rw_node);
if (found == 2) {
break;
}
if (lock == &thread->sigpendinglock) {
break;
}
lock = &thread->sigpendinglock;
head = &thread->sigpending;
}
if (found == 2) {
ihk_mc_spinlock_unlock(&v->runq_lock, v->runq_irqstate);
terminate_mcexec(0, sig);
return 1;
}
else if (found == 1) {
ihk_mc_spinlock_unlock(&v->runq_lock, v->runq_irqstate);
interrupt_syscall(thread, 0);
return 1;
}
return 0;
}
struct sig_pending *
getsigpending(struct thread *thread, int delflag)
{
struct list_head *head;
mcs_rwlock_lock_t *lock;
struct mcs_rwlock_node_irqsave mcs_rw_node;
struct sig_pending *next;
struct sig_pending *pending;
__sigset_t w;
__sigset_t x;
int sig;
struct k_sigaction *k;
w = thread->sigmask.__val[0];
lock = &thread->sigcommon->lock;
head = &thread->sigcommon->sigpending;
for (;;) {
if (delflag) {
mcs_rwlock_writer_lock(lock, &mcs_rw_node);
}
else {
mcs_rwlock_reader_lock(lock, &mcs_rw_node);
}
list_for_each_entry_safe(pending, next, head, list) {
for (x = pending->sigmask.__val[0], sig = 0; x;
sig++, x >>= 1) {
}
k = thread->sigcommon->action + sig - 1;
if (delflag ||
(sig != SIGCHLD &&
sig != SIGURG &&
sig != SIGCONT) ||
(k->sa.sa_handler != (void *)1 &&
k->sa.sa_handler != NULL)){
if (!(pending->sigmask.__val[0] & w)) {
if (delflag)
list_del(&pending->list);
if (delflag) {
mcs_rwlock_writer_unlock(
lock,
&mcs_rw_node);
}
else {
mcs_rwlock_reader_unlock(
lock,
&mcs_rw_node);
}
return pending;
}
}
}
if (delflag) {
mcs_rwlock_writer_unlock(lock, &mcs_rw_node);
}
else {
mcs_rwlock_reader_unlock(lock, &mcs_rw_node);
}
if (lock == &thread->sigpendinglock) {
return NULL;
}
lock = &thread->sigpendinglock;
head = &thread->sigpending;
}
return NULL;
}
struct sig_pending *
hassigpending(struct thread *thread)
{
if (list_empty(&thread->sigpending) &&
list_empty(&thread->sigcommon->sigpending)) {
return NULL;
}
return getsigpending(thread, 0);
}
void
check_sig_pending(void)
{
struct thread *thread;
struct cpu_local_var *v;
if (clv == NULL)
return;
v = get_this_cpu_local_var();
repeat:
v->runq_irqstate = ihk_mc_spinlock_lock(&v->runq_lock);
list_for_each_entry(thread, &(v->runq), sched_list) {
if (thread == NULL || thread == &cpu_local_var(idle)) {
continue;
}
if (thread->in_syscall_offload == 0) {
continue;
}
if (thread->proc->group_exit_status & 0x0000000100000000L) {
continue;
}
if (check_sig_pending_thread(thread))
goto repeat;
}
ihk_mc_spinlock_unlock(&v->runq_lock, v->runq_irqstate);
}
static void
__check_signal(unsigned long rc, void *regs0, int num, int irq_disabled)
{
ihk_mc_user_context_t *regs = regs0;
struct thread *thread;
struct sig_pending *pending;
int irqstate;
if (clv == NULL) {
return;
}
thread = cpu_local_var(current);
if (thread == NULL || thread->proc->pid == 0) {
struct thread *t;
irqstate = cpu_disable_interrupt_save();
ihk_mc_spinlock_lock_noirq(&(cpu_local_var(runq_lock)));
list_for_each_entry(t, &(cpu_local_var(runq)), sched_list) {
if (t->proc->pid <= 0) {
continue;
}
if (t->status == PS_INTERRUPTIBLE &&
hassigpending(t)) {
t->status = PS_RUNNING;
break;
}
}
ihk_mc_spinlock_unlock_noirq(&(cpu_local_var(runq_lock)));
cpu_restore_interrupt(irqstate);
goto out;
}
if (regs != NULL && !interrupt_from_user(regs)) {
goto out;
}
if (list_empty(&thread->sigpending) &&
list_empty(&thread->sigcommon->sigpending)) {
goto out;
}
for (;;) {
/* When this function called from check_signal_irq_disabled,
* return with interrupt invalid.
* This is to eliminate signal loss.
*/
if (irq_disabled == 1) {
irqstate = cpu_disable_interrupt_save();
}
pending = getsigpending(thread, 1);
if (!pending) {
dkprintf("check_signal,queue is empty\n");
goto out;
}
if (irq_disabled == 1) {
cpu_restore_interrupt(irqstate);
}
if (do_signal(rc, regs, thread, pending, num)) {
num = -1;
}
}
out:
return;
}
void
check_signal(unsigned long rc, void *regs0, int num)
{
__check_signal(rc, regs0, num, 0);
}
void
check_signal_irq_disabled(unsigned long rc, void *regs0, int num)
{
__check_signal(rc, regs0, num, 1);
}

56
test/issues/1377/C1377.sh Normal file
View File

@ -0,0 +1,56 @@
#!/bin/sh
USELTP=1
USEOSTEST=0
. ../../common.sh
################################################################################
if [ ! -f "$LTPBIN/dirtyc0w" ]; then
echo BAD environment: LTP is too old >&2
exit 1
fi
echo "*** C1377T01 start"
ng=0
ok=0
tp=dirtyc0w
for ((i=0; i<20; i++)); do
for ((j=0; j<50; j++)); do
sudo PATH=$PATH:$LTPBIN $MCEXEC $LTPBIN/$tp > $tp.txt 2>&1
wok=`grep PASS $tp.txt | wc -l`
wng=`grep FAIL $tp.txt | wc -l`
if [ $wng != 0 ]; then
echo -n '*'
ng=`expr $ng + 1`
elif [ $wok == 0 ]; then
echo -n '?'
else
echo -n '.'
ok=`expr $ok + 1`
fi
done
echo
done
if [ $ng != 0 ]; then
echo "*** C1377T01 FAILED ok: $ok, ng: $ng"
else
echo "*** C1377T01 PASS ok: $ok"
fi
for i in wait02:02 wait401:03 waitpid01:04 waitpid02:05 waitpid04:06 \
waitpid05:07 waitpid06:08 waitpid07:09 waitpid08:10 waitpid09:11 \
waitpid10:12 waitpid11:13 waitpid12:14 waitpid13:15; do
tp=`echo $i|sed 's/:.*//'`
id=`echo $i|sed 's/.*://'`
sudo PATH=$PATH:$LTPBIN $MCEXEC $LTPBIN/$tp 2>&1 | tee $tp.txt
ok=`grep PASS $tp.txt | wc -l`
ng=`grep FAIL $tp.txt | wc -l`
if [ $ng = 0 ]; then
echo "*** C1377T$id: $tp PASS ($ok)"
else
echo "*** C1377T$id: $tp FAIL (ok=$ok ng=$ng)"
fi
done

View File

@ -0,0 +1,179 @@
Script started on Tue 16 Jun 2020 02:42:48 PM JST
[shirasawa@apollo04 1377]$ make test
sh ./C1377.sh
mcstop+release.sh ... done
mcreboot.sh -c 2-31 -m 2G@0,2G@1 -O ... done
*** C1377T01 start
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
*** C1377T01 PASS ok: 1000
wait02 1 TPASS : wait(&status) returned 78343
*** C1377T02: wait02 PASS (1)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
wait401.c:55: PASS: waitpid() returned correct pid 78457
wait401.c:64: PASS: WIFEXITED() is set in status
wait401.c:69: PASS: WEXITSTATUS() == 0
Summary:
passed 3
failed 0
skipped 0
warnings 0
*** C1377T03: wait401 PASS (3)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid01.c:51: PASS: waitpid() returned correct pid 78571
waitpid01.c:60: PASS: WIFSIGNALED() set in status
waitpid01.c:68: PASS: WTERMSIG() == SIGALRM
Summary:
passed 3
failed 0
skipped 0
warnings 0
*** C1377T04: waitpid01 PASS (3)
waitpid02 1 TPASS : received expected pid
waitpid02 2 TPASS : received expected signal
waitpid02 3 TPASS : received expected exit value
*** C1377T05: waitpid02 PASS (3)
waitpid04 1 TPASS : condition 1 test passed
waitpid04 2 TPASS : condition 2 test passed
waitpid04 3 TPASS : condition 3 test passed
*** C1377T06: waitpid04 PASS (3)
waitpid05 1 TPASS : received expected pid.
waitpid05 2 TPASS : received expected exit number.
waitpid05 3 TPASS : received expected pid.
waitpid05 4 TPASS : received expected exit number.
waitpid05 5 TPASS : received expected pid.
waitpid05 6 TPASS : received expected exit number.
waitpid05 7 TPASS : received expected pid.
waitpid05 8 TPASS : received expected exit number.
waitpid05 9 TPASS : received expected pid.
waitpid05 10 TPASS : received expected exit number.
waitpid05 11 TPASS : received expected pid.
waitpid05 12 TPASS : received expected exit number.
waitpid05 13 TPASS : received expected pid.
waitpid05 14 TPASS : received expected exit number.
waitpid05 15 TPASS : received expected pid.
waitpid05 16 TPASS : received expected exit number.
waitpid05 17 TPASS : received expected pid.
waitpid05 18 TPASS : received expected exit number.
waitpid05 19 TPASS : received expected pid.
waitpid05 20 TPASS : received expected exit number.
waitpid05 21 TPASS : received expected pid.
waitpid05 22 TPASS : received expected exit number.
waitpid05 23 TPASS : received expected pid.
waitpid05 24 TPASS : received expected exit number.
*** C1377T07: waitpid05 PASS (24)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid06.c:54: PASS: Test PASSED
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1377T08: waitpid06 PASS (1)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid07.c:59: PASS: Test PASSED
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1377T09: waitpid07 PASS (1)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid_common.h:142: INFO: Sending SIGCONT to 80073
waitpid_common.h:142: INFO: Sending SIGCONT to 80105
waitpid_common.h:142: INFO: Sending SIGCONT to 80137
waitpid_common.h:142: INFO: Sending SIGCONT to 80169
waitpid_common.h:142: INFO: Sending SIGCONT to 80201
waitpid_common.h:142: INFO: Sending SIGCONT to 80233
waitpid_common.h:142: INFO: Sending SIGCONT to 80266
waitpid_common.h:142: INFO: Sending SIGCONT to 80298
waitpid08.c:62: PASS: Test PASSED
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1377T10: waitpid08 PASS (1)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid09.c:83: PASS: waitpid(pid, WNOHANG) = 0 for a running child
waitpid09.c:123: PASS: waitpid(pid, WNOHANG) = pid for an exited child
waitpid09.c:143: PASS: waitpid(-1, 0) = -1 with ECHILD if no children
waitpid09.c:162: PASS: waitpid(-1, WNOHANG) = -1 with ECHILD if no children
Summary:
passed 4
failed 0
skipped 0
warnings 0
*** C1377T11: waitpid09 PASS (4)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid10.c:62: PASS: Test PASSED
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1377T12: waitpid10 PASS (1)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid11.c:60: PASS: Test PASSED
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1377T13: waitpid11 PASS (1)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid12.c:70: PASS: Test PASSED
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1377T14: waitpid12 PASS (1)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid_common.h:142: INFO: Sending SIGCONT to 85038
waitpid_common.h:142: INFO: Sending SIGCONT to 85070
waitpid_common.h:142: INFO: Sending SIGCONT to 85102
waitpid_common.h:142: INFO: Sending SIGCONT to 85134
waitpid_common.h:142: INFO: Sending SIGCONT to 84910
waitpid_common.h:142: INFO: Sending SIGCONT to 84942
waitpid_common.h:142: INFO: Sending SIGCONT to 84974
waitpid_common.h:142: INFO: Sending SIGCONT to 85006
waitpid13.c:70: PASS: Test PASSED
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1377T15: waitpid13 PASS (1)
[shirasawa@apollo04 1377]$ exit
exit
Script done on Tue 16 Jun 2020 03:02:48 PM JST

View File

@ -0,0 +1,179 @@
Script started on Tue Jun 16 15:36:06 2020
bash-4.2$ make test
sh ./C1377.sh
mcstop+release.sh ... done
mcreboot.sh -c 1-7,9-15,17-23,25-31 -m 10G@0,10G@1 -r 1-7:0+9-15:8+17-23:16+25-31:24 ... done
*** C1377T01 start
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
*** C1377T01 PASS ok: 1000
wait02 1 TPASS : wait(&status) returned 32240
*** C1377T02: wait02 PASS (1)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
wait401.c:55: PASS: waitpid() returned correct pid 32347
wait401.c:64: PASS: WIFEXITED() is set in status
wait401.c:69: PASS: WEXITSTATUS() == 0
Summary:
passed 3
failed 0
skipped 0
warnings 0
*** C1377T03: wait401 PASS (3)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid01.c:51: PASS: waitpid() returned correct pid 32454
waitpid01.c:60: PASS: WIFSIGNALED() set in status
waitpid01.c:68: PASS: WTERMSIG() == SIGALRM
Summary:
passed 3
failed 0
skipped 0
warnings 0
*** C1377T04: waitpid01 PASS (3)
waitpid02 1 TPASS : received expected pid
waitpid02 2 TPASS : received expected signal
waitpid02 3 TPASS : received expected exit value
*** C1377T05: waitpid02 PASS (3)
waitpid04 1 TPASS : condition 1 test passed
waitpid04 2 TPASS : condition 2 test passed
waitpid04 3 TPASS : condition 3 test passed
*** C1377T06: waitpid04 PASS (3)
waitpid05 1 TPASS : received expected pid.
waitpid05 2 TPASS : received expected exit number.
waitpid05 3 TPASS : received expected pid.
waitpid05 4 TPASS : received expected exit number.
waitpid05 5 TPASS : received expected pid.
waitpid05 6 TPASS : received expected exit number.
waitpid05 7 TPASS : received expected pid.
waitpid05 8 TPASS : received expected exit number.
waitpid05 9 TPASS : received expected pid.
waitpid05 10 TPASS : received expected exit number.
waitpid05 11 TPASS : received expected pid.
waitpid05 12 TPASS : received expected exit number.
waitpid05 13 TPASS : received expected pid.
waitpid05 14 TPASS : received expected exit number.
waitpid05 15 TPASS : received expected pid.
waitpid05 16 TPASS : received expected exit number.
waitpid05 17 TPASS : received expected pid.
waitpid05 18 TPASS : received expected exit number.
waitpid05 19 TPASS : received expected pid.
waitpid05 20 TPASS : received expected exit number.
waitpid05 21 TPASS : received expected pid.
waitpid05 22 TPASS : received expected exit number.
waitpid05 23 TPASS : received expected pid.
waitpid05 24 TPASS : received expected exit number.
*** C1377T07: waitpid05 PASS (24)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid06.c:54: PASS: Test PASSED
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1377T08: waitpid06 PASS (1)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid07.c:59: PASS: Test PASSED
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1377T09: waitpid07 PASS (1)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid_common.h:142: INFO: Sending SIGCONT to 1524
waitpid_common.h:142: INFO: Sending SIGCONT to 1554
waitpid_common.h:142: INFO: Sending SIGCONT to 1584
waitpid_common.h:142: INFO: Sending SIGCONT to 1614
waitpid_common.h:142: INFO: Sending SIGCONT to 1644
waitpid_common.h:142: INFO: Sending SIGCONT to 1674
waitpid_common.h:142: INFO: Sending SIGCONT to 1704
waitpid_common.h:142: INFO: Sending SIGCONT to 1734
waitpid08.c:62: PASS: Test PASSED
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1377T10: waitpid08 PASS (1)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid09.c:83: PASS: waitpid(pid, WNOHANG) = 0 for a running child
waitpid09.c:123: PASS: waitpid(pid, WNOHANG) = pid for an exited child
waitpid09.c:143: PASS: waitpid(-1, 0) = -1 with ECHILD if no children
waitpid09.c:162: PASS: waitpid(-1, WNOHANG) = -1 with ECHILD if no children
Summary:
passed 4
failed 0
skipped 0
warnings 0
*** C1377T11: waitpid09 PASS (4)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid10.c:62: PASS: Test PASSED
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1377T12: waitpid10 PASS (1)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid11.c:60: PASS: Test PASSED
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1377T13: waitpid11 PASS (1)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid12.c:70: PASS: Test PASSED
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1377T14: waitpid12 PASS (1)
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
waitpid_common.h:142: INFO: Sending SIGCONT to 6219
waitpid_common.h:142: INFO: Sending SIGCONT to 6249
waitpid_common.h:142: INFO: Sending SIGCONT to 6279
waitpid_common.h:142: INFO: Sending SIGCONT to 6309
waitpid_common.h:142: INFO: Sending SIGCONT to 6099
waitpid_common.h:142: INFO: Sending SIGCONT to 6129
waitpid_common.h:142: INFO: Sending SIGCONT to 6159
waitpid_common.h:142: INFO: Sending SIGCONT to 6189
waitpid13.c:70: PASS: Test PASSED
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1377T15: waitpid13 PASS (1)
bash-4.2$ exit
exit
Script done on Tue Jun 16 15:55:52 2020

View File

@ -0,0 +1,9 @@
CC = gcc
all::
test:: all
sh ./C1377.sh
clean::
rm -f $(TARGET) *.o

38
test/issues/1377/README Normal file
View File

@ -0,0 +1,38 @@
【Issue#1377 動作確認】
□ テスト内容
1. Issue 指摘事項の再現確認
現象はタイミングに依存し、ARM64環境でdirtyc0wを繰り返し実行した際に、
数回〜数十回に1回程度発生する。
問題の発生はタイミングに依存するため、dirtyc0wを十分な回数繰り返し
実行し、問題が再発しないことを確認する。
C1377T01 dirtyc0wを1000回連続実行し、全てPASSすることを確認
2. LTP を用いて既存処理に影響しないことを確認
プロセスの終了ステータスを変更したため、修正が既存処理に影響しないことを
wait系システムコールのLTPを用いて確認する。
C1377T02 wait02: waitの基本機能の確認
C1377T03 wait401: wait4の基本機能の確認
C1377T04 waitpid01: waitpidの基本機能の確認
C1377T05 waitpid02: waitpidの基本機能の確認
C1377T06 waitpid04: waitpidの基本機能の確認
C1377T07 waitpid05: waitpidの基本機能の確認
C1377T08 waitpid06: waitpidの基本機能の確認
C1377T09 waitpid07: waitpidの基本機能の確認
C1377T10 waitpid08: waitpidの基本機能の確認
C1377T11 waitpid09: waitpidの基本機能の確認
C1377T12 waitpid10: waitpidの基本機能の確認
C1377T13 waitpid11: waitpidの基本機能の確認
C1377T14 waitpid12: waitpidの基本機能の確認
C1377T15 waitpid13: waitpidの基本機能の確認
□ 実行手順
$ make test
McKernelのインストール先や LTP の配置場所は、$HOME/.mck_test_config を
参照する。.mck_test_config は、McKernel をビルドした際に生成される
mck_test_config.sample ファイルを $HOME にコピーし、適宜編集すること。
□ 実行結果
C1377_x86_64.txt(x86_64実行結果)、C1377_arm64.txt(arm64実行結果)参照。
全ての項目が PASS していることを確認。

26
test/issues/1380/C1380.sh Executable file
View File

@ -0,0 +1,26 @@
#/bin/sh
USELTP=1
USEOSTEST=0
. ../../common.sh
issue="1380"
tid=01
for tp in tgkill03 tgkill01 tkill01 tkill02
do
tname=`printf "C${issue}T%02d" ${tid}`
echo "*** ${tname} start *******************************"
sudo $MCEXEC $LTPBIN/$tp 2>&1 | tee $tp.txt
ok=`grep PASS $tp.txt | wc -l`
ng=`grep FAIL $tp.txt | wc -l`
if [ $ng = 0 ]; then
echo "*** ${tname} PASSED ($ok)"
else
echo "*** ${tname} FAILED (ok=$ok ng=$ng)"
fi
let tid++
echo ""
done

11
test/issues/1380/Makefile Normal file
View File

@ -0,0 +1,11 @@
CFLAGS=-g
LDFLAGS=
TARGET=
all: $(TARGET)
test: all
./C1380.sh
clean:
rm -f $(TARGET) *.o *.txt

21
test/issues/1380/README Normal file
View File

@ -0,0 +1,21 @@
【Issue#1324 動作確認】
□ テスト内容
1. 以下のLTPを用いてIssueで報告された症状が発生しないことを確認
- tgkill03
3. 以下のLTPを用いて既存機能に影響が無いことを確認
- tgkill01
- tkill01
- tkill02
□ 実行手順
$ make test
McKernelのインストール先や、OSTEST, LTPの配置場所は、
$HOME/.mck_test_config を参照している
.mck_test_config は、McKernelをビルドした際に生成されるmck_test_config.sample ファイルを
$HOMEにコピーし、適宜編集する
□ 実行結果
x86_64_result.log aarch64_result.log 参照。
すべての項目をPASSしていることを確認。

View File

@ -0,0 +1,37 @@
*** C1380T01 start *******************************
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
tgkill03.c:92: PASS: Invalid tgid failed as expected: EINVAL
tgkill03.c:92: PASS: Invalid tid failed as expected: EINVAL
tgkill03.c:92: PASS: Invalid signal failed as expected: EINVAL
tgkill03.c:92: PASS: Defunct tid failed as expected: ESRCH
tgkill03.c:92: PASS: Defunct tgid failed as expected: ESRCH
tgkill03.c:99: PASS: Valid tgkill call succeeded
Summary:
passed 6
failed 0
skipped 0
warnings 0
*** C1380T01 PASSED (6)
*** C1380T02 start *******************************
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
tgkill01.c:99: PASS: SIGUSR1 delivered to correct threads
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1380T02 PASSED (1)
*** C1380T03 start *******************************
tkill01 1 TPASS : tkill call succeeded
tkill01 2 TPASS : tkill call succeeded
*** C1380T03 PASSED (2)
*** C1380T04 start *******************************
tkill02 1 TPASS : tkill(-1, SIGUSR1) failed as expected: TEST_ERRNO=EINVAL(22): Invalid argument
tkill02 2 TPASS : tkill(29822, SIGUSR1) failed as expected: TEST_ERRNO=ESRCH(3): No such process
*** C1380T04 PASSED (2)

View File

@ -0,0 +1,37 @@
*** C1380T01 start *******************************
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
tgkill03.c:92: PASS: Invalid tgid failed as expected: EINVAL
tgkill03.c:92: PASS: Invalid tid failed as expected: EINVAL
tgkill03.c:92: PASS: Invalid signal failed as expected: EINVAL
tgkill03.c:92: PASS: Defunct tid failed as expected: ESRCH
tgkill03.c:92: PASS: Defunct tgid failed as expected: ESRCH
tgkill03.c:99: PASS: Valid tgkill call succeeded
Summary:
passed 6
failed 0
skipped 0
warnings 0
*** C1380T01 PASSED (6)
*** C1380T02 start *******************************
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
tgkill01.c:99: PASS: SIGUSR1 delivered to correct threads
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1380T02 PASSED (1)
*** C1380T03 start *******************************
tkill01 1 TPASS : tkill call succeeded
tkill01 2 TPASS : tkill call succeeded
*** C1380T03 PASSED (2)
*** C1380T04 start *******************************
tkill02 1 TPASS : tkill(-1, SIGUSR1) failed as expected: TEST_ERRNO=EINVAL(22): Invalid argument
tkill02 2 TPASS : tkill(32768, SIGUSR1) failed as expected: TEST_ERRNO=ESRCH(3): No such process
*** C1380T04 PASSED (2)

43
test/issues/1389/C1389.sh Executable file
View File

@ -0,0 +1,43 @@
#/bin/sh
USELTP=1
USEOSTEST=0
BOOTPARAM="-c 1-7 -m 10G@0,10G@1 -O"
. ../../common.sh
issue="1389"
tid=01
for tsuf in "01" "02.sh"
do
tname=`printf "C${issue}T%02d" ${tid}`
echo "*** ${tname} start *******************************"
${MCEXEC} ./C1389T${tsuf}
if [ $? -eq 0 ]; then
echo "*** ${tname} PASSED ******************************"
else
echo "*** ${tname} FAILED ******************************"
fi
let tid++
echo ""
done
for tp in "mtest01 -p80" "mtest01 -p80 -w" "mem01"
do
tname=`printf "C${issue}T%02d" ${tid}`
echo "*** ${tname} start *******************************"
echo ${tp}
sudo $MCEXEC $LTPBIN/$tp 2>&1 | tee ${tname}.txt
ok=`grep PASS ${tname}.txt | wc -l`
ng=`grep FAIL ${tname}.txt | wc -l`
if [ $ng = 0 ]; then
echo "*** ${tname} PASSED ($ok)"
else
echo "*** ${tname} FAILED (ok=$ok ng=$ng)"
fi
let tid++
echo ""
done

View File

@ -0,0 +1,65 @@
#include <stdio.h>
#include <stdlib.h>
#include <linux/kernel.h>
#include <sys/sysinfo.h>
#include <errno.h>
int main(void)
{
struct sysinfo *info;
int ret = 0, rc = 0;
unsigned long assigned_mem = (20UL << 30);
unsigned long _totalram, _freeram;
unsigned int _mem_unit;
info = malloc(sizeof(struct sysinfo));
rc = sysinfo(info);
if (rc) {
perror("sysinfo fail: ");
ret = -1;
goto out;
}
_totalram = info->totalram;
_freeram = info->freeram;
_mem_unit = info->mem_unit;
// Check totalram
if (0.95 * assigned_mem < _totalram &&
_totalram < assigned_mem) {
printf("[OK] totalram: %ld\n", _totalram);
}
else {
printf("[NG] unexpected totalram: %ld\n", _totalram);
printf(" expected range: %ld - %ld\n",
(unsigned long)(0.95 * assigned_mem),
assigned_mem);
ret = -1;
goto out;
}
// Check freeram
if (0.95 * _totalram < _freeram &&
_freeram < _totalram) {
printf("[OK] freeram: %ld\n", _freeram);
}
else {
printf("[NG] unexpected freeram: %ld\n", _freeram);
ret = -1;
goto out;
}
// Check mem_unit
if (_mem_unit == 1) {
printf("[OK] mem_unit: %ld\n", _mem_unit);
}
else {
printf("[NG] unexpected mem_unit: %ld\n", _mem_unit);
ret = -1;
goto out;
}
free(info);
out:
return ret;
}

88
test/issues/1389/C1389T02.sh Executable file
View File

@ -0,0 +1,88 @@
#!/bin/sh
ASSIGNED_MEM=`echo '1024 * 1024 * 1024 * 20' | bc`
cat /proc/meminfo > ./cur_meminfo.txt
# Check MemTotal
MemTotalTxt=`cat ./cur_meminfo.txt | grep MemTotal | awk '{print $(NF-1)}'`
MemTotal=`echo "1024 * ${MemTotalTxt}" | bc`
lower_limit=`echo "${ASSIGNED_MEM} * 0.95" | bc`
lower_limit=${lower_limit%.*}
upper_limit=${ASSIGNED_MEM}
tgt=${MemTotal}
if [ ${tgt} -ge ${lower_limit} -a ${tgt} -lt ${upper_limit} ]; then
echo "[OK] MemTotal: ${tgt}"
else
echo "[NG] unexpected MemTotal: ${tgt}"
exit 1
fi
# Check MemFree
MemFreeTxt=`cat ./cur_meminfo.txt | grep MemFree | awk '{print $(NF-1)}'`
MemFree=`echo "1024 * ${MemFreeTxt}" | bc`
lower_limit=`echo "${MemTotal} * 0.95" | bc`
lower_limit=${lower_limit%.*}
upper_limit=${MemTotal}
tgt=${MemFree}
if [ ${tgt} -ge ${lower_limit} -a ${tgt} -lt ${upper_limit} ]; then
echo "[OK] MemFree: ${tgt}"
else
echo "[NG] unexpected MemFree: ${tgt}"
exit 1
fi
# Check SwapTotal
SwapTotalTxt=`cat ./cur_meminfo.txt | grep SwapTotal | awk '{print $(NF-1)}'`
SwapTotal=`echo "1024 * ${SwapTotalTxt}" | bc`
tgt=${SwapTotal}
if [ ${tgt} -eq 0 ]; then
echo "[OK] SwapTotal: ${tgt}"
else
echo "[NG] unexpected SwapTotal: ${tgt}"
exit 1
fi
# Check SwapFree
SwapFreeTxt=`cat ./cur_meminfo.txt | grep SwapFree | awk '{print $(NF-1)}'`
SwapFree=`echo "1024 * ${SwapFreeTxt}" | bc`
tgt=${SwapFree}
if [ ${tgt} -eq 0 ]; then
echo "[OK] SwapFree: ${tgt}"
else
echo "[NG] unexpected SwapFree: ${tgt}"
exit 1
fi
# Check CommitLimit
CommitLimitTxt=`cat ./cur_meminfo.txt | grep CommitLimit | awk '{print $(NF-1)}'`
CommitLimit=`echo "1024 * ${CommitLimitTxt}" | bc`
tgt=${CommitLimit}
if [ ${tgt} -eq ${MemFree} ]; then
echo "[OK] CommitLimit: ${tgt}"
else
echo "[NG] unexpected CommitLimit: ${tgt}"
exit 1
fi
# Check Committed_AS
Committed_ASTxt=`cat ./cur_meminfo.txt | grep Committed_AS | awk '{print $(NF-1)}'`
Committed_AS=`echo "1024 * ${Committed_ASTxt}" | bc`
tgt=${Committed_AS}
if [ ${tgt} -eq $((${MemTotal} - ${MemFree})) ]; then
echo "[OK] Committed_AS: ${tgt}"
else
echo "[NG] unexpected Committed_AS: ${tgt}"
exit 1
fi

11
test/issues/1389/Makefile Normal file
View File

@ -0,0 +1,11 @@
CFLAGS=-g
LDFLAGS=
TARGET=C1389T01
all: $(TARGET)
test: all
sh ./C1389.sh
clean:
rm -f $(TARGET) *.o *.txt

46
test/issues/1389/README Normal file
View File

@ -0,0 +1,46 @@
【Issue#1389 動作確認】
□ テスト内容
本Issueの対応で、sysinfo()と/proc/meminfo の下記項目においてMcKernelの情報を
返すようにした。
[sysinfo]
totalram : rusage_global の total_memory
freeram : rusage_global の total_memory - usage_memory
mem_unit : 常に1
[/proc/meminfo]
MemTotal : rusage_global の total_memory
MemFree : rusage_global の total_memory - usage_memory
SwapTotal : 常に0
SwapFree : 常に0
CommitLimit : rusage_global の total_memory - usage_memory
Committed_AS : rusage_global の usage_memory
1. 本Issueで対応したsysinfo() と /proc/meminfo の値が想定どおりとなっていることを確認
McKernelへのメモリ割り当てを 10G@0,10G@1 とした状態で下記プログラムを実行
C1389T01: sysinfo() で取得される値が下記のとおりであることを確認
totalram : 20GiB * 0.95 以上、20GiB 未満であること
freeram : totralram * 0.95 以上、totalram 未満であること
mem_unit : 1 であること
C1389T02: /proc/meminfo から取得される値が下記のとおりであることを確認
MemTotal : 20GiB * 0.95 以上、20GiB 未満であること
MemFree : MemTotal * 0.95 以上、MemTotal 未満であること
SwapTotal : 0 であること
SwapFree : 0 であること
CommitLimit : MemFreeと同値であること
Committed_AS : MemTotal - MemFree と同値であること
2. 本Issueで対応したsysinfo() の項目を利用する以下のLTPを実行し、PASSすることを確認
- mtest01 -p80
- mtest01 -p80 -w
- mem01
□ 実行手順
$ make test
McKernelのインストール先や、OSTEST, LTPの配置場所は、
$HOME/.mck_test_config を参照している
.mck_test_config は、McKernelをビルドした際に生成されるmck_test_config.sample ファイルを
$HOMEにコピーし、適宜編集する
□ 実行結果
x86_64_result.log aarch64_result.log 参照。
すべての項目をPASSしていることを確認。

View File

@ -0,0 +1,77 @@
sh ./C1389.sh
mcstop+release.sh ... done
mcreboot.sh -c 1-7 -m 10G@0,10G@1 -O ... done
*** C1389T01 start *******************************
[OK] totalram: 21472215040
[OK] freeram: 21461794816
[OK] mem_unit: 1
*** C1389T01 PASSED ******************************
*** C1389T02 start *******************************
[OK] MemTotal: 21472215040
[OK] MemFree: 21452750848
[OK] SwapTotal: 0
[OK] SwapFree: 0
[OK] CommitLimit: 21452750848
[OK] Committed_AS: 19464192
*** C1389T02 PASSED ******************************
*** C1389T03 start *******************************
mtest01 -p80
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
mtest01.c:134: INFO: Filling up 80% of free ram which is 16760729 kbytes
mtest01.c:149: INFO: ... child 50935 starting
mtest01.c:149: INFO: ... child 50944 starting
mtest01.c:149: INFO: ... child 50953 starting
mtest01.c:149: INFO: ... child 50962 starting
mtest01.c:149: INFO: ... child 50971 starting
mtest01.c:149: INFO: ... child 50980 starting
mtest01.c:169: INFO: ... [t=300] 1434451968 bytes allocated only in child 50980
mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 50935
mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 50944
mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 50953
mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 50962
mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 50971
mtest01.c:221: PASS: 16760729 kbytes allocated
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1389T03 PASSED (1)
*** C1389T04 start *******************************
mtest01 -p80 -w
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
mtest01.c:134: INFO: Filling up 80% of free ram which is 16759654 kbytes
mtest01.c:149: INFO: ... child 51017 starting
mtest01.c:149: INFO: ... child 51026 starting
mtest01.c:149: INFO: ... child 51035 starting
mtest01.c:149: INFO: ... child 51044 starting
mtest01.c:149: INFO: ... child 51053 starting
mtest01.c:149: INFO: ... child 51062 starting
mtest01.c:166: INFO: ... [t=300] 1433403392 bytes allocated and used in child 51062
mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 51017
mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 51026
mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 51035
mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 51044
mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 51053
mtest01.c:221: PASS: 16759654 kbytes allocated (and written to)
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1389T04 PASSED (1)
*** C1389T05 start *******************************
mem01
mem01 0 TINFO : Free Mem: 20465 Mb
mem01 0 TINFO : Free Swap: 0 Mb
mem01 0 TINFO : Total Free: 20465 Mb
mem01 0 TINFO : Total Tested: 3056 Mb
mem01 0 TINFO : touching 3056MB of malloc'ed memory (linear)
mem01 1 TPASS : malloc - alloc of 3056MB succeeded
*** C1389T05 PASSED (1)

View File

@ -0,0 +1,77 @@
sh ./C1389.sh
mcstop+release.sh ... done
mcreboot.sh -c 1-7 -m 10G@0,10G@1 -O ... done
*** C1389T01 start *******************************
[OK] totalram: 21463240704
[OK] freeram: 21459673088
[OK] mem_unit: 1
*** C1389T01 PASSED ******************************
*** C1389T02 start *******************************
[OK] MemTotal: 21463240704
[OK] MemFree: 21453983744
[OK] SwapTotal: 0
[OK] SwapFree: 0
[OK] CommitLimit: 21453983744
[OK] Committed_AS: 9256960
*** C1389T02 PASSED ******************************
*** C1389T03 start *******************************
mtest01 -p80
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
mtest01.c:134: INFO: Filling up 80% of free ram which is 16762396 kbytes
mtest01.c:149: INFO: ... child 20718 starting
mtest01.c:149: INFO: ... child 20727 starting
mtest01.c:149: INFO: ... child 20736 starting
mtest01.c:149: INFO: ... child 20745 starting
mtest01.c:149: INFO: ... child 20754 starting
mtest01.c:149: INFO: ... child 20763 starting
mtest01.c:169: INFO: ... [t=300] 1436549120 bytes allocated only in child 20763
mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 20718
mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 20727
mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 20736
mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 20745
mtest01.c:169: INFO: ... [t=299] 3145728000 bytes allocated only in child 20754
mtest01.c:221: PASS: 16762396 kbytes allocated
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1389T03 PASSED (1)
*** C1389T04 start *******************************
mtest01 -p80 -w
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
mtest01.c:134: INFO: Filling up 80% of free ram which is 16761132 kbytes
mtest01.c:149: INFO: ... child 20802 starting
mtest01.c:149: INFO: ... child 20811 starting
mtest01.c:149: INFO: ... child 20820 starting
mtest01.c:149: INFO: ... child 20829 starting
mtest01.c:149: INFO: ... child 20838 starting
mtest01.c:149: INFO: ... child 20847 starting
mtest01.c:166: INFO: ... [t=300] 1435500544 bytes allocated and used in child 20847
mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 20802
mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 20811
mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 20820
mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 20829
mtest01.c:166: INFO: ... [t=299] 3145728000 bytes allocated and used in child 20838
mtest01.c:221: PASS: 16761132 kbytes allocated (and written to)
Summary:
passed 1
failed 0
skipped 0
warnings 0
*** C1389T04 PASSED (1)
*** C1389T05 start *******************************
mem01
mem01 0 TINFO : Free Mem: 20463 Mb
mem01 0 TINFO : Free Swap: 0 Mb
mem01 0 TINFO : Total Free: 20463 Mb
mem01 0 TINFO : Total Tested: 3056 Mb
mem01 0 TINFO : touching 3056MB of malloc'ed memory (linear)
mem01 1 TPASS : malloc - alloc of 3056MB succeeded
*** C1389T05 PASSED (1)

41
test/issues/1399/C1399.sh Executable file
View File

@ -0,0 +1,41 @@
#/bin/sh
USELTP=1
USEOSTEST=0
. ../../common.sh
issue="1399"
tid=01
for tno in 01
do
tname=`printf "C${issue}T%02d" ${tid}`
echo "*** ${tname} start *******************************"
sudo ${MCEXEC} ./C1399T${tno}
if [ $? -eq 0 ]; then
echo "*** ${tname} PASSED ******************************"
else
echo "*** ${tname} FAILED ******************************"
fi
let tid++
echo ""
done
for tp in set_robust_list01 get_robust_list01
do
tname=`printf "C${issue}T%02d" ${tid}`
echo "*** ${tname} start *******************************"
sudo $MCEXEC $LTPBIN/$tp 2>&1 | tee $tp.txt
ok=`grep PASS $tp.txt | wc -l`
ng=`grep FAIL $tp.txt | wc -l`
if [ $ng = 0 ]; then
echo "*** ${tname} PASSED ($ok)"
else
echo "*** ${tname} FAILED (ok=$ok ng=$ng)"
fi
let tid++
echo ""
done

View File

@ -0,0 +1,36 @@
#include <stdio.h>
#include <unistd.h>
#include <linux/futex.h>
#include <syscall.h>
#include <errno.h>
int main(int argc, void *argv[])
{
struct robust_list_head rlh;
size_t len = sizeof(struct robust_list_head);
int rc = 0, ret = 0;
errno = 0;
rc = syscall(__NR_set_robust_list, &rlh, len + 1);
if (rc == -1 && errno == EINVAL) {
printf("[OK] invalid len (1 greater than correct): EINVAL\n");
} else {
printf("[NG] invalid len (1 greater than correct): Succeed\n");
ret = -1;
goto out;
}
errno = 0;
rc = syscall(__NR_set_robust_list, &rlh, len - 1);
if (rc == -1 && errno == EINVAL) {
printf("[OK] invalid len (1 less than correct): EINVAL\n");
} else {
printf("[NG] invalid len (1 less than correct): Succeed\n");
ret = -1;
goto out;
}
out:
return ret;
}

11
test/issues/1399/Makefile Normal file
View File

@ -0,0 +1,11 @@
CFLAGS=-g
LDFLAGS=
TARGET=C1399T01
all: $(TARGET)
test: all
./C1399.sh
clean:
rm -f $(TARGET) *.o *.txt

24
test/issues/1399/README Normal file
View File

@ -0,0 +1,24 @@
【Issue#1399 動作確認】
□ テスト内容
1. 下記のテストプログラムを実行し、症状が発生しないことを確認する
C1399T01:
1. struct robust_list_head のサイズよりも1大きい値をサイズとして指定して
set_robsut_list を呼び出し、EINVALで失敗することを確認
2. struct robust_list_head のサイズよりも1小さい値をサイズとして指定して
set_robsut_list を呼び出し、EINVALで失敗することを確認
2. 以下のLTPを用いて既存のrobust_list機能に影響が無いことを確認
- set_robst_list01
- get_robst_list01
□ 実行手順
$ make test
McKernelのインストール先や、OSTEST, LTPの配置場所は、
$HOME/.mck_test_config を参照している
.mck_test_config は、McKernelをビルドした際に生成されるmck_test_config.sample ファイルを
$HOMEにコピーし、適宜編集する
□ 実行結果
x86_64_result.log aarch64_result.log 参照。
すべての項目をPASSしていることを確認。

View File

@ -0,0 +1,18 @@
*** C1399T01 start *******************************
[OK] invalid len (1 greater than correct): EINVAL
[OK] invalid len (1 less than correct): EINVAL
*** C1399T01 PASSED ******************************
*** C1399T02 start *******************************
set_robust_list01 1 TPASS : set_robust_list: retval = -1 (expected -1), errno = 22 (expected 22)
set_robust_list01 2 TPASS : set_robust_list: retval = 0 (expected 0), errno = 0 (expected 0)
*** C1399T02 PASSED (2)
*** C1399T03 start *******************************
get_robust_list01 1 TPASS : get_robust_list failed as expected with EFAULT
get_robust_list01 2 TPASS : get_robust_list failed as expected with EFAULT
get_robust_list01 3 TPASS : get_robust_list failed as expected with ESRCH
get_robust_list01 4 TPASS : get_robust_list succeeded
get_robust_list01 5 TPASS : get_robust_list failed as expected with EPERM
*** C1399T03 PASSED (5)

View File

@ -0,0 +1,18 @@
*** C1399T01 start *******************************
[OK] invalid len (1 greater than correct): EINVAL
[OK] invalid len (1 less than correct): EINVAL
*** C1399T01 PASSED ******************************
*** C1399T02 start *******************************
set_robust_list01 1 TPASS : set_robust_list: retval = -1 (expected -1), errno = 22 (expected 22)
set_robust_list01 2 TPASS : set_robust_list: retval = 0 (expected 0), errno = 0 (expected 0)
*** C1399T02 PASSED (2)
*** C1399T03 start *******************************
get_robust_list01 1 TPASS : get_robust_list failed as expected with EFAULT
get_robust_list01 2 TPASS : get_robust_list failed as expected with EFAULT
get_robust_list01 3 TPASS : get_robust_list failed as expected with ESRCH
get_robust_list01 4 TPASS : get_robust_list succeeded
get_robust_list01 5 TPASS : get_robust_list failed as expected with EPERM
*** C1399T03 PASSED (5)

43
test/issues/1425/C1425.sh Executable file
View File

@ -0,0 +1,43 @@
#/bin/sh
USELTP=1
USEOSTEST=0
. ../../common.sh
issue="1425"
tid=01
STOPSIG_LIST="TSTP TTIN TTOU"
for signame in ${STOPSIG_LIST}
do
tname=`printf "C${issue}T%02d" ${tid}`
echo "*** ${tname} start *******************************"
sh ./check_stopsig.sh ${MCEXEC} ${signame}
if [ $? -eq 0 ]; then
echo "*** ${tname} PASSED ******************************"
else
echo "*** ${tname} FAILED ******************************"
fi
let tid++
echo ""
done
for tp in kill01 kill02 kill06 kill07 kill08 kill09 signal01 signal03 signal04 signal05
do
tname=`printf "C${issue}T%02d" ${tid}`
echo "*** ${tname} start *******************************"
sudo $MCEXEC $LTPBIN/$tp 2>&1 | tee $tp.txt
ok=`grep PASS $tp.txt | wc -l`
ng=`grep FAIL $tp.txt | wc -l`
if [ $ng = 0 ]; then
echo "*** ${tname} PASSED ($ok)"
else
echo "*** ${tname} FAILED (ok=$ok ng=$ng)"
fi
let tid++
echo ""
done

11
test/issues/1425/Makefile Normal file
View File

@ -0,0 +1,11 @@
CFLAGS=-g
LDFLAGS=
TARGET=
all: $(TARGET)
test: all
sh ./C1425.sh
clean:
rm -f $(TARGET) *.o *.txt

37
test/issues/1425/README Normal file
View File

@ -0,0 +1,37 @@
【Issue#1425 動作確認】
□ テスト内容
1. 本修正ではmcexecにてSIGTSTP, SIGTTIN, SIGTTOU を補足しないようにする
修正を実施した。
上記のシグナルのデフォルト動作はプロセスの停止である。
それぞれのシグナルについて、以下を確認する。
- 実行中のMcKernelプロセスに通知した際、通知先のプロセスが停止する
- 停止されたプロセスに対してSIGCONTを通知することで、プロセスが再開できる
C1425T01: SIGTSTP の動作を確認
C1425T02: SIGTTIN の動作を確認
C1425T03: SIGTTOU の動作を確認
2. 以下のLTPを用いて既存のsignal機能に影響が無いことを確認
- kill01
- kill02
- kill06
- kill07
- kill08
- kill09
- signal01
- signal03
- signal04
- signal05
□ 実行手順
・下記の手順でテストを実行する
$ make test
McKernelのインストール先や、OSTEST, LTPの配置場所は、
$HOME/.mck_test_config を参照している
.mck_test_config は、McKernelをビルドした際に生成されるmck_test_config.sample ファイルを
$HOMEにコピーし、適宜編集する
□ 実行結果
x86_64_result.log, aarch64_result.log 参照。
すべての項目をPASSしていることを確認。

View File

@ -0,0 +1,176 @@
*** C1425T01 start *******************************
** Exec sleep 3
** TargetPID: 52277
[OK] 52277 is running : S+
** SEND SIGTSTP to 52277
[OK] 52277 is stopped : T+
** Sleep 3 sec
[OK] 52277 is still stopped : T+
** SEND SIGCONT to 52277
** Wait pid: 52277
[OK] pid: 52277 is Done.
*** C1425T01 PASSED ******************************
*** C1425T02 start *******************************
** Exec sleep 3
** TargetPID: 52330
[OK] 52330 is running : SLl+
** SEND SIGTTIN to 52330
[OK] 52330 is stopped : TLl+
** Sleep 3 sec
[OK] 52330 is still stopped : TLl+
** SEND SIGCONT to 52330
** Wait pid: 52330
[OK] pid: 52330 is Done.
*** C1425T02 PASSED ******************************
*** C1425T03 start *******************************
** Exec sleep 3
** TargetPID: 52378
[OK] 52378 is running : SLl+
** SEND SIGTTOU to 52378
[OK] 52378 is stopped : TLl+
** Sleep 3 sec
[OK] 52378 is still stopped : TLl+
** SEND SIGCONT to 52378
** Wait pid: 52378
[OK] pid: 52378 is Done.
*** C1425T03 PASSED ******************************
*** C1425T04 start *******************************
kill01 1 TPASS : received expected signal 9
*** C1425T04 PASSED (1)
*** C1425T05 start *******************************
kill02 1 TPASS : The signal was sent to all processes in the process group.
kill02 2 TPASS : The signal was not sent to selective processes that were not in the process group.
*** C1425T05 PASSED (2)
*** C1425T06 start *******************************
kill06 1 TPASS : received expected signal 9
*** C1425T06 PASSED (1)
*** C1425T07 start *******************************
kill07 0 TINFO : received expected signal 9
kill07 1 TPASS : Did not catch signal as expected
*** C1425T07 PASSED (1)
*** C1425T08 start *******************************
kill08 1 TPASS : received expected signal 9
*** C1425T08 PASSED (1)
*** C1425T09 start *******************************
kill09 1 TPASS : kill(52839, SIGKILL) returned 0
*** C1425T09 PASSED (1)
*** C1425T10 start *******************************
signal01 1 TPASS : signal(SIGKILL, 0x1(SIG_IGN)) failed with EINVAL
signal01 0 TINFO : Child process returned TPASS
signal01 1 TPASS : signal(SIGKILL, (nil)(SIG_DFL)) failed with EINVAL
signal01 0 TINFO : Child process returned TPASS
signal01 1 TPASS : signal(SIGKILL, 0x403b20(catchsig())) failed with EINVAL
signal01 0 TINFO : Child process returned TPASS
signal01 1 TPASS : Child killed with SIGKILL
signal01 2 TPASS : Child killed with SIGKILL
signal01 3 TPASS : Child killed with SIGKILL
*** C1425T10 PASSED (9)
*** C1425T11 start *******************************
signal03 1 TPASS : signal03 call succeeded
signal03 2 TPASS : signal03 call succeeded
signal03 3 TPASS : signal03 call succeeded
signal03 4 TPASS : signal03 call succeeded
signal03 5 TPASS : signal03 call succeeded
signal03 6 TPASS : signal03 call succeeded
signal03 7 TPASS : signal03 call succeeded
signal03 8 TPASS : signal03 call succeeded
signal03 9 TPASS : signal03 call succeeded
signal03 10 TPASS : signal03 call succeeded
signal03 11 TPASS : signal03 call succeeded
signal03 12 TPASS : signal03 call succeeded
signal03 13 TPASS : signal03 call succeeded
signal03 14 TPASS : signal03 call succeeded
signal03 15 TPASS : signal03 call succeeded
signal03 16 TPASS : signal03 call succeeded
signal03 17 TPASS : signal03 call succeeded
signal03 18 TPASS : signal03 call succeeded
signal03 19 TPASS : signal03 call succeeded
signal03 20 TPASS : signal03 call succeeded
signal03 21 TPASS : signal03 call succeeded
signal03 22 TPASS : signal03 call succeeded
signal03 23 TPASS : signal03 call succeeded
signal03 24 TPASS : signal03 call succeeded
signal03 25 TPASS : signal03 call succeeded
signal03 26 TPASS : signal03 call succeeded
signal03 27 TPASS : signal03 call succeeded
signal03 28 TPASS : signal03 call succeeded
signal03 29 TPASS : signal03 call succeeded
signal03 30 TPASS : signal03 call succeeded
signal03 31 TPASS : signal03 call succeeded
*** C1425T11 PASSED (31)
*** C1425T12 start *******************************
signal04 1 TPASS : signal04 call succeeded received (nil).
signal04 2 TPASS : signal04 call succeeded received (nil).
signal04 3 TPASS : signal04 call succeeded received (nil).
signal04 4 TPASS : signal04 call succeeded received (nil).
signal04 5 TPASS : signal04 call succeeded received (nil).
signal04 6 TPASS : signal04 call succeeded received (nil).
signal04 7 TPASS : signal04 call succeeded received (nil).
signal04 8 TPASS : signal04 call succeeded received (nil).
signal04 9 TPASS : signal04 call succeeded received (nil).
signal04 10 TPASS : signal04 call succeeded received (nil).
signal04 11 TPASS : signal04 call succeeded received (nil).
signal04 12 TPASS : signal04 call succeeded received (nil).
signal04 13 TPASS : signal04 call succeeded received (nil).
signal04 14 TPASS : signal04 call succeeded received (nil).
signal04 15 TPASS : signal04 call succeeded received (nil).
signal04 16 TPASS : signal04 call succeeded received (nil).
signal04 17 TPASS : signal04 call succeeded received (nil).
signal04 18 TPASS : signal04 call succeeded received (nil).
signal04 19 TPASS : signal04 call succeeded received (nil).
signal04 20 TPASS : signal04 call succeeded received (nil).
signal04 21 TPASS : signal04 call succeeded received (nil).
signal04 22 TPASS : signal04 call succeeded received (nil).
signal04 23 TPASS : signal04 call succeeded received (nil).
signal04 24 TPASS : signal04 call succeeded received (nil).
signal04 25 TPASS : signal04 call succeeded received (nil).
signal04 26 TPASS : signal04 call succeeded received (nil).
signal04 27 TPASS : signal04 call succeeded received (nil).
signal04 28 TPASS : signal04 call succeeded received (nil).
*** C1425T12 PASSED (28)
*** C1425T13 start *******************************
signal05 1 TPASS : signal05 call succeeded
signal05 2 TPASS : signal05 call succeeded
signal05 3 TPASS : signal05 call succeeded
signal05 4 TPASS : signal05 call succeeded
signal05 5 TPASS : signal05 call succeeded
signal05 6 TPASS : signal05 call succeeded
signal05 7 TPASS : signal05 call succeeded
signal05 8 TPASS : signal05 call succeeded
signal05 9 TPASS : signal05 call succeeded
signal05 10 TPASS : signal05 call succeeded
signal05 11 TPASS : signal05 call succeeded
signal05 12 TPASS : signal05 call succeeded
signal05 13 TPASS : signal05 call succeeded
signal05 14 TPASS : signal05 call succeeded
signal05 15 TPASS : signal05 call succeeded
signal05 16 TPASS : signal05 call succeeded
signal05 17 TPASS : signal05 call succeeded
signal05 18 TPASS : signal05 call succeeded
signal05 19 TPASS : signal05 call succeeded
signal05 20 TPASS : signal05 call succeeded
signal05 21 TPASS : signal05 call succeeded
signal05 22 TPASS : signal05 call succeeded
signal05 23 TPASS : signal05 call succeeded
signal05 24 TPASS : signal05 call succeeded
signal05 25 TPASS : signal05 call succeeded
signal05 26 TPASS : signal05 call succeeded
signal05 27 TPASS : signal05 call succeeded
signal05 28 TPASS : signal05 call succeeded
signal05 29 TPASS : signal05 call succeeded
signal05 30 TPASS : signal05 call succeeded
signal05 31 TPASS : signal05 call succeeded
*** C1425T13 PASSED (31)

View File

@ -0,0 +1,55 @@
#!/bin/sh
rc=0
slptime=3
mcexec=$1
signame=$2
echo "** Exec sleep ${slptime}"
mcexec sleep ${slptime} &
tgtpid=$!
echo "** TargetPID: ${tgtpid}"
stat_1=`ps -o stat,pid -p ${tgtpid} | grep ${tgtpid} | cut -f1 -d ' '`
if [ `echo ${stat_1} | grep -e "^S" | wc -l` -eq 1 ]; then
echo "[OK] ${tgtpid} is running : ${stat_1}"
else
echo "[NG] ${tgtpid} is NOT running : ${stat_1}"
rc=1
fi
echo "** SEND SIG${signame} to ${tgtpid}"
kill -${signame} ${tgtpid}
sleep 1
stat_2=`ps -o stat,pid -p ${tgtpid} | grep ${tgtpid} | cut -f1 -d ' '`
if [ `echo ${stat_2} | grep -e "^T" | wc -l` -eq 1 ]; then
echo "[OK] ${tgtpid} is stopped : ${stat_2}"
else
echo "[NG] ${tgtpid} is NOT stopped : ${stat_2}"
rc=1
fi
echo "** Sleep ${slptime} sec"
sleep ${slptime}
stat_3=`ps -o stat,pid -p ${tgtpid} | grep ${tgtpid} | cut -f1 -d ' '`
if [ `echo ${stat_2} | grep -e "^T" | wc -l` -eq 1 ]; then
echo "[OK] ${tgtpid} is still stopped : ${stat_3}"
else
echo "[NG] ${tgtpid} is NOT stopped : ${stat_3}"
rc=1
fi
echo "** SEND SIGCONT to ${tgtpid}"
kill -CONT ${tgtpid}
echo "** Wait pid: ${tgtpid}"
wait ${tgtpid}
echo "[OK] pid: ${tgtpid} is Done."
exit ${rc}

View File

@ -0,0 +1,176 @@
*** C1425T01 start *******************************
** Exec sleep 3
** TargetPID: 5737
[OK] 5737 is running : S+
** SEND SIGTSTP to 5737
[OK] 5737 is stopped : TL+
** Sleep 3 sec
[OK] 5737 is still stopped : TL+
** SEND SIGCONT to 5737
** Wait pid: 5737
[OK] pid: 5737 is Done.
*** C1425T01 PASSED ******************************
*** C1425T02 start *******************************
** Exec sleep 3
** TargetPID: 5798
[OK] 5798 is running : SLl+
** SEND SIGTTIN to 5798
[OK] 5798 is stopped : TLl+
** Sleep 3 sec
[OK] 5798 is still stopped : TLl+
** SEND SIGCONT to 5798
** Wait pid: 5798
[OK] pid: 5798 is Done.
*** C1425T02 PASSED ******************************
*** C1425T03 start *******************************
** Exec sleep 3
** TargetPID: 5859
[OK] 5859 is running : SLl+
** SEND SIGTTOU to 5859
[OK] 5859 is stopped : TLl+
** Sleep 3 sec
[OK] 5859 is still stopped : TLl+
** SEND SIGCONT to 5859
** Wait pid: 5859
[OK] pid: 5859 is Done.
*** C1425T03 PASSED ******************************
*** C1425T04 start *******************************
kill01 1 TPASS : received expected signal 9
*** C1425T04 PASSED (1)
*** C1425T05 start *******************************
kill02 1 TPASS : The signal was sent to all processes in the process group.
kill02 2 TPASS : The signal was not sent to selective processes that were not in the process group.
*** C1425T05 PASSED (2)
*** C1425T06 start *******************************
kill06 1 TPASS : received expected signal 9
*** C1425T06 PASSED (1)
*** C1425T07 start *******************************
kill07 0 TINFO : received expected signal 9
kill07 1 TPASS : Did not catch signal as expected
*** C1425T07 PASSED (1)
*** C1425T08 start *******************************
kill08 1 TPASS : received expected signal 9
*** C1425T08 PASSED (1)
*** C1425T09 start *******************************
kill09 1 TPASS : kill(6713, SIGKILL) returned 0
*** C1425T09 PASSED (1)
*** C1425T10 start *******************************
signal01 1 TPASS : signal(SIGKILL, 0x1(SIG_IGN)) failed with EINVAL
signal01 0 TINFO : Child process returned TPASS
signal01 1 TPASS : signal(SIGKILL, (nil)(SIG_DFL)) failed with EINVAL
signal01 0 TINFO : Child process returned TPASS
signal01 1 TPASS : signal(SIGKILL, 0x403620(catchsig())) failed with EINVAL
signal01 0 TINFO : Child process returned TPASS
signal01 1 TPASS : Child killed with SIGKILL
signal01 2 TPASS : Child killed with SIGKILL
signal01 3 TPASS : Child killed with SIGKILL
*** C1425T10 PASSED (9)
*** C1425T11 start *******************************
signal03 1 TPASS : signal03 call succeeded
signal03 2 TPASS : signal03 call succeeded
signal03 3 TPASS : signal03 call succeeded
signal03 4 TPASS : signal03 call succeeded
signal03 5 TPASS : signal03 call succeeded
signal03 6 TPASS : signal03 call succeeded
signal03 7 TPASS : signal03 call succeeded
signal03 8 TPASS : signal03 call succeeded
signal03 9 TPASS : signal03 call succeeded
signal03 10 TPASS : signal03 call succeeded
signal03 11 TPASS : signal03 call succeeded
signal03 12 TPASS : signal03 call succeeded
signal03 13 TPASS : signal03 call succeeded
signal03 14 TPASS : signal03 call succeeded
signal03 15 TPASS : signal03 call succeeded
signal03 16 TPASS : signal03 call succeeded
signal03 17 TPASS : signal03 call succeeded
signal03 18 TPASS : signal03 call succeeded
signal03 19 TPASS : signal03 call succeeded
signal03 20 TPASS : signal03 call succeeded
signal03 21 TPASS : signal03 call succeeded
signal03 22 TPASS : signal03 call succeeded
signal03 23 TPASS : signal03 call succeeded
signal03 24 TPASS : signal03 call succeeded
signal03 25 TPASS : signal03 call succeeded
signal03 26 TPASS : signal03 call succeeded
signal03 27 TPASS : signal03 call succeeded
signal03 28 TPASS : signal03 call succeeded
signal03 29 TPASS : signal03 call succeeded
signal03 30 TPASS : signal03 call succeeded
signal03 31 TPASS : signal03 call succeeded
*** C1425T11 PASSED (31)
*** C1425T12 start *******************************
signal04 1 TPASS : signal04 call succeeded received (nil).
signal04 2 TPASS : signal04 call succeeded received (nil).
signal04 3 TPASS : signal04 call succeeded received (nil).
signal04 4 TPASS : signal04 call succeeded received (nil).
signal04 5 TPASS : signal04 call succeeded received (nil).
signal04 6 TPASS : signal04 call succeeded received (nil).
signal04 7 TPASS : signal04 call succeeded received (nil).
signal04 8 TPASS : signal04 call succeeded received (nil).
signal04 9 TPASS : signal04 call succeeded received (nil).
signal04 10 TPASS : signal04 call succeeded received (nil).
signal04 11 TPASS : signal04 call succeeded received (nil).
signal04 12 TPASS : signal04 call succeeded received (nil).
signal04 13 TPASS : signal04 call succeeded received (nil).
signal04 14 TPASS : signal04 call succeeded received (nil).
signal04 15 TPASS : signal04 call succeeded received (nil).
signal04 16 TPASS : signal04 call succeeded received (nil).
signal04 17 TPASS : signal04 call succeeded received (nil).
signal04 18 TPASS : signal04 call succeeded received (nil).
signal04 19 TPASS : signal04 call succeeded received (nil).
signal04 20 TPASS : signal04 call succeeded received (nil).
signal04 21 TPASS : signal04 call succeeded received (nil).
signal04 22 TPASS : signal04 call succeeded received (nil).
signal04 23 TPASS : signal04 call succeeded received (nil).
signal04 24 TPASS : signal04 call succeeded received (nil).
signal04 25 TPASS : signal04 call succeeded received (nil).
signal04 26 TPASS : signal04 call succeeded received (nil).
signal04 27 TPASS : signal04 call succeeded received (nil).
signal04 28 TPASS : signal04 call succeeded received (nil).
*** C1425T12 PASSED (28)
*** C1425T13 start *******************************
signal05 1 TPASS : signal05 call succeeded
signal05 2 TPASS : signal05 call succeeded
signal05 3 TPASS : signal05 call succeeded
signal05 4 TPASS : signal05 call succeeded
signal05 5 TPASS : signal05 call succeeded
signal05 6 TPASS : signal05 call succeeded
signal05 7 TPASS : signal05 call succeeded
signal05 8 TPASS : signal05 call succeeded
signal05 9 TPASS : signal05 call succeeded
signal05 10 TPASS : signal05 call succeeded
signal05 11 TPASS : signal05 call succeeded
signal05 12 TPASS : signal05 call succeeded
signal05 13 TPASS : signal05 call succeeded
signal05 14 TPASS : signal05 call succeeded
signal05 15 TPASS : signal05 call succeeded
signal05 16 TPASS : signal05 call succeeded
signal05 17 TPASS : signal05 call succeeded
signal05 18 TPASS : signal05 call succeeded
signal05 19 TPASS : signal05 call succeeded
signal05 20 TPASS : signal05 call succeeded
signal05 21 TPASS : signal05 call succeeded
signal05 22 TPASS : signal05 call succeeded
signal05 23 TPASS : signal05 call succeeded
signal05 24 TPASS : signal05 call succeeded
signal05 25 TPASS : signal05 call succeeded
signal05 26 TPASS : signal05 call succeeded
signal05 27 TPASS : signal05 call succeeded
signal05 28 TPASS : signal05 call succeeded
signal05 29 TPASS : signal05 call succeeded
signal05 30 TPASS : signal05 call succeeded
signal05 31 TPASS : signal05 call succeeded
*** C1425T13 PASSED (31)

63
test/issues/1457/C1457.py Normal file
View File

@ -0,0 +1,63 @@
#
# Test script for issue #1439
#
import os
import sys
import subprocess
def get_command_result(cmd):
results = subprocess.Popen(
cmd, stdout=subprocess.PIPE,
shell=True).stdout.readlines()
return [str(x).rstrip("\n") for x in results]
def enumerate_cpu(cpu_list):
allcpus = []
for ranged_cpu in cpu_list.split(','):
try:
cpu_begin, cpu_end = ranged_cpu.split('-')
except ValueError:
cpu_begin = cpu_end = ranged_cpu
for i in range(int(cpu_begin), int(cpu_end) + 1):
allcpus.append(i)
allcpus.sort()
return allcpus
def get_online_cpu():
online_file = open('/sys/devices/system/cpu/online', 'r')
return online_file.readlines()[0].strip()
def get_cpuinfo_processors():
processors = []
cpuinfo_file = open('/proc/cpuinfo', 'r')
for line in cpuinfo_file.readlines():
if line.startswith('processor'):
processor = int(line.strip().split()[-1])
processors.append(processor)
return processors
def main():
onlines = enumerate_cpu(get_online_cpu())
processors = get_cpuinfo_processors()
print '# of online cpus:', len(onlines)
print '# of cpuinfo processors:', len(processors)
if len(onlines) != len(processors):
print 'ERROR: # of processors is not equal to # of cpus'
print 'FAIL'
exit()
i = 0
for cpu in processors:
print i, 'processor:', cpu
if i != cpu:
print 'ERROR: processor number is not ordered'
print 'FAIL'
exit()
i = i + 1
print 'SUCCESS'
if __name__ == '__main__':
main()

7
test/issues/1457/C1457.sh Executable file
View File

@ -0,0 +1,7 @@
#!/bin/bash
. ${HOME}/.mck_test_config
export MCK_DIR
sudo ${MCK_DIR}/sbin/mcreboot.sh 1,3,5,7,9-12,50-58
${MCK_DIR}/bin/mcexec python C1457.py
sudo ${MCK_DIR}/sbin/mcstop+release.sh

View File

@ -0,0 +1,2 @@
test::
./C1457.shy

22
test/issues/1457/README Normal file
View File

@ -0,0 +1,22 @@
□ テスト内容
arm64環境における/proc/cpuinfoについて、以下を確かめる。
(1) "processor" フィールドが/sys/devices/system/cpu/onlineファイルが示す
CPUの数だけ存在すること。
(2) "processor" フィールドの値が0からはじまる連番であること。
□ 実行手順
(1) $HOME/.mck_test_configを、MCK_DIRがMcKernelのインストール先を指すように編集する
(2) 以下を実行する
$ make test
□ 確認方法
標準出力にSUCCESSが出力されること

View File

@ -0,0 +1,31 @@
# of online cpus: 28
# of cpuinfo processors: 28
0 processor: 0
1 processor: 1
2 processor: 2
3 processor: 3
4 processor: 4
5 processor: 5
6 processor: 6
7 processor: 7
8 processor: 8
9 processor: 9
10 processor: 10
11 processor: 11
12 processor: 12
13 processor: 13
14 processor: 14
15 processor: 15
16 processor: 16
17 processor: 17
18 processor: 18
19 processor: 19
20 processor: 20
21 processor: 21
22 processor: 22
23 processor: 23
24 processor: 24
25 processor: 25
26 processor: 26
27 processor: 27
SUCCESS