procfs: if memory_range_lock fails, process later
Change-Id: I3c5f24548455a63d8d5a4482f5081347f631885a Refs: #452
This commit is contained in:
committed by
Masamichi Takagi
parent
37605740a4
commit
ed21b6849d
@ -601,6 +601,20 @@ extern unsigned long do_kill(struct thread *, int, int, int, struct siginfo *, i
|
|||||||
extern void terminate_host(int pid);
|
extern void terminate_host(int pid);
|
||||||
extern void debug_log(long);
|
extern void debug_log(long);
|
||||||
|
|
||||||
|
void send_procfs_answer(struct ikc_scd_packet *packet, int err)
|
||||||
|
{
|
||||||
|
struct ikc_scd_packet pckt;
|
||||||
|
struct ihk_ikc_channel_desc *resp_channel = cpu_local_var(ikc2linux);
|
||||||
|
|
||||||
|
pckt.msg = SCD_MSG_PROCFS_ANSWER;
|
||||||
|
pckt.ref = packet->ref;
|
||||||
|
pckt.arg = packet->arg;
|
||||||
|
pckt.err = err;
|
||||||
|
pckt.reply = packet->reply;
|
||||||
|
pckt.pid = packet->pid;
|
||||||
|
syscall_channel_send(resp_channel, &pckt);
|
||||||
|
}
|
||||||
|
|
||||||
static int syscall_packet_handler(struct ihk_ikc_channel_desc *c,
|
static int syscall_packet_handler(struct ihk_ikc_channel_desc *c,
|
||||||
void *__packet, void *ihk_os)
|
void *__packet, void *ihk_os)
|
||||||
{
|
{
|
||||||
@ -745,13 +759,7 @@ out_remote_pf:
|
|||||||
|
|
||||||
case SCD_MSG_PROCFS_REQUEST:
|
case SCD_MSG_PROCFS_REQUEST:
|
||||||
case SCD_MSG_PROCFS_RELEASE:
|
case SCD_MSG_PROCFS_RELEASE:
|
||||||
pckt.msg = SCD_MSG_PROCFS_ANSWER;
|
process_procfs_request(packet);
|
||||||
pckt.ref = packet->ref;
|
|
||||||
pckt.arg = packet->arg;
|
|
||||||
pckt.err = process_procfs_request(packet);
|
|
||||||
pckt.reply = packet->reply;
|
|
||||||
pckt.pid = packet->pid;
|
|
||||||
syscall_channel_send(resp_channel, &pckt);
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@ -412,6 +412,7 @@ struct procfs_file {
|
|||||||
};
|
};
|
||||||
|
|
||||||
int process_procfs_request(struct ikc_scd_packet *rpacket);
|
int process_procfs_request(struct ikc_scd_packet *rpacket);
|
||||||
|
void send_procfs_answer(struct ikc_scd_packet *packet, int err);
|
||||||
|
|
||||||
#define RUSAGE_SELF 0
|
#define RUSAGE_SELF 0
|
||||||
#define RUSAGE_CHILDREN -1
|
#define RUSAGE_CHILDREN -1
|
||||||
|
|||||||
@ -38,6 +38,7 @@
|
|||||||
extern int snprintf(char *buf, size_t size, const char *fmt, ...);
|
extern int snprintf(char *buf, size_t size, const char *fmt, ...);
|
||||||
extern int sscanf(const char * buf, const char * fmt, ...);
|
extern int sscanf(const char * buf, const char * fmt, ...);
|
||||||
extern int scnprintf(char * buf, size_t size, const char *fmt, ...);
|
extern int scnprintf(char * buf, size_t size, const char *fmt, ...);
|
||||||
|
static int do_procfs_backlog(void *arg);
|
||||||
|
|
||||||
struct mckernel_procfs_buffer {
|
struct mckernel_procfs_buffer {
|
||||||
unsigned long next_pa;
|
unsigned long next_pa;
|
||||||
@ -148,12 +149,28 @@ procfs_delete_thread(struct thread *thread)
|
|||||||
procfs_thread_ctl(thread, SCD_MSG_PROCFS_TID_DELETE);
|
procfs_thread_ctl(thread, SCD_MSG_PROCFS_TID_DELETE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int procfs_backlog(struct process_vm *vm, struct ikc_scd_packet *rpacket)
|
||||||
|
{
|
||||||
|
void *arg;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (!(arg = kmalloc(sizeof(struct ikc_scd_packet), IHK_MC_AP_NOWAIT))) {
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
memcpy(arg, rpacket, sizeof(struct ikc_scd_packet));
|
||||||
|
if ((err = add_backlog(do_procfs_backlog, arg))) {
|
||||||
|
kfree(arg);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief The callback function for mckernel procfs files.
|
* \brief The callback function for mckernel procfs files.
|
||||||
*
|
*
|
||||||
* \param rarg returned argument
|
* \param rarg returned argument
|
||||||
*/
|
*/
|
||||||
int process_procfs_request(struct ikc_scd_packet *rpacket)
|
static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result)
|
||||||
{
|
{
|
||||||
unsigned long rarg = rpacket->arg;
|
unsigned long rarg = rpacket->arg;
|
||||||
unsigned long parg, pbuf;
|
unsigned long parg, pbuf;
|
||||||
@ -419,7 +436,17 @@ int process_procfs_request(struct ikc_scd_packet *rpacket)
|
|||||||
if (strcmp(p, "maps") == 0) {
|
if (strcmp(p, "maps") == 0) {
|
||||||
struct vm_range *range;
|
struct vm_range *range;
|
||||||
|
|
||||||
ihk_mc_spinlock_lock_noirq(&vm->memory_range_lock);
|
if (!ihk_mc_spinlock_trylock_noirq(&vm->memory_range_lock)) {
|
||||||
|
if (!result) {
|
||||||
|
if ((err = procfs_backlog(vm, rpacket))) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*result = -EAGAIN;
|
||||||
|
}
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
range = lookup_process_memory_range(vm, 0, -1);
|
range = lookup_process_memory_range(vm, 0, -1);
|
||||||
while (range) {
|
while (range) {
|
||||||
@ -455,14 +482,15 @@ int process_procfs_request(struct ikc_scd_packet *rpacket)
|
|||||||
|
|
||||||
if (ans < 0 || ans > count ||
|
if (ans < 0 || ans > count ||
|
||||||
buf_add(&buf_top, &buf_cur, buf, ans) < 0) {
|
buf_add(&buf_top, &buf_cur, buf, ans) < 0) {
|
||||||
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
|
ihk_mc_spinlock_unlock_noirq(
|
||||||
|
&vm->memory_range_lock);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
range = next_process_memory_range(vm, range);
|
range = next_process_memory_range(vm, range);
|
||||||
}
|
}
|
||||||
|
|
||||||
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
|
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
|
||||||
|
|
||||||
ans = 0;
|
ans = 0;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
@ -483,8 +511,18 @@ int process_procfs_request(struct ikc_scd_packet *rpacket)
|
|||||||
|
|
||||||
start = (offset / sizeof(uint64_t)) << PAGE_SHIFT;
|
start = (offset / sizeof(uint64_t)) << PAGE_SHIFT;
|
||||||
end = start + ((count / sizeof(uint64_t)) << PAGE_SHIFT);
|
end = start + ((count / sizeof(uint64_t)) << PAGE_SHIFT);
|
||||||
|
|
||||||
ihk_mc_spinlock_lock_noirq(&vm->memory_range_lock);
|
if (!ihk_mc_spinlock_trylock_noirq(&vm->memory_range_lock)) {
|
||||||
|
if (!result) {
|
||||||
|
if ((err = procfs_backlog(vm, rpacket))) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*result = -EAGAIN;
|
||||||
|
}
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
while (start < end) {
|
while (start < end) {
|
||||||
*_buf = ihk_mc_pt_virt_to_pagemap(proc->vm->address_space->page_table, start);
|
*_buf = ihk_mc_pt_virt_to_pagemap(proc->vm->address_space->page_table, start);
|
||||||
@ -495,7 +533,7 @@ int process_procfs_request(struct ikc_scd_packet *rpacket)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
|
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
|
||||||
|
|
||||||
dprintf("/proc/pagemap: 0x%lx - 0x%lx, count: %d\n",
|
dprintf("/proc/pagemap: 0x%lx - 0x%lx, count: %d\n",
|
||||||
start, end, count);
|
start, end, count);
|
||||||
|
|
||||||
@ -526,14 +564,24 @@ int process_procfs_request(struct ikc_scd_packet *rpacket)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
ihk_mc_spinlock_lock_noirq(&proc->vm->memory_range_lock);
|
if (!ihk_mc_spinlock_trylock_noirq(&vm->memory_range_lock)) {
|
||||||
|
if (!result) {
|
||||||
|
if ((err = procfs_backlog(vm, rpacket))) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*result = -EAGAIN;
|
||||||
|
}
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
range = lookup_process_memory_range(vm, 0, -1);
|
range = lookup_process_memory_range(vm, 0, -1);
|
||||||
while (range) {
|
while (range) {
|
||||||
if(range->flag & VR_LOCKED)
|
if(range->flag & VR_LOCKED)
|
||||||
lockedsize += range->end - range->start;
|
lockedsize += range->end - range->start;
|
||||||
range = next_process_memory_range(vm, range);
|
range = next_process_memory_range(vm, range);
|
||||||
}
|
}
|
||||||
ihk_mc_spinlock_unlock_noirq(&proc->vm->memory_range_lock);
|
ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);
|
||||||
|
|
||||||
cpu_bitmask = &bitmasks[bitmasks_offset];
|
cpu_bitmask = &bitmasks[bitmasks_offset];
|
||||||
bitmasks_offset += bitmap_scnprintf(cpu_bitmask,
|
bitmasks_offset += bitmap_scnprintf(cpu_bitmask,
|
||||||
@ -786,6 +834,9 @@ end:
|
|||||||
if (r->pbuf == PA_NULL && buf_top)
|
if (r->pbuf == PA_NULL && buf_top)
|
||||||
r->pbuf = virt_to_phys(buf_top);
|
r->pbuf = virt_to_phys(buf_top);
|
||||||
err:
|
err:
|
||||||
|
send_procfs_answer(rpacket, err);
|
||||||
|
|
||||||
|
out:
|
||||||
if (vbuf) {
|
if (vbuf) {
|
||||||
ihk_mc_unmap_virtual(vbuf, npages);
|
ihk_mc_unmap_virtual(vbuf, npages);
|
||||||
ihk_mc_unmap_memory(NULL, pbuf, r->count);
|
ihk_mc_unmap_memory(NULL, pbuf, r->count);
|
||||||
@ -807,3 +858,20 @@ err:
|
|||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int process_procfs_request(struct ikc_scd_packet *rpacket)
|
||||||
|
{
|
||||||
|
return _process_procfs_request(rpacket, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_procfs_backlog(void *arg)
|
||||||
|
{
|
||||||
|
struct ikc_scd_packet *rpacket = arg;
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
_process_procfs_request(rpacket, &result);
|
||||||
|
if (!result) {
|
||||||
|
kfree(arg);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|||||||
219
test/issues/452/C452.patch
Normal file
219
test/issues/452/C452.patch
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
diff --git a/arch/arm64/kernel/include/syscall_list.h b/arch/arm64/kernel/include/syscall_list.h
|
||||||
|
index 5dd6243..709231d 100644
|
||||||
|
--- a/arch/arm64/kernel/include/syscall_list.h
|
||||||
|
+++ b/arch/arm64/kernel/include/syscall_list.h
|
||||||
|
@@ -128,6 +128,8 @@ SYSCALL_HANDLED(731, util_indicate_clone)
|
||||||
|
SYSCALL_HANDLED(732, get_system)
|
||||||
|
SYSCALL_HANDLED(733, util_register_desc)
|
||||||
|
|
||||||
|
+SYSCALL_HANDLED(740, setkdebug)
|
||||||
|
+
|
||||||
|
/* McKernel Specific */
|
||||||
|
SYSCALL_HANDLED(801, swapout)
|
||||||
|
SYSCALL_HANDLED(802, linux_mlock)
|
||||||
|
diff --git a/arch/x86_64/kernel/include/syscall_list.h b/arch/x86_64/kernel/include/syscall_list.h
|
||||||
|
index 8ef9bd0..16361ea 100644
|
||||||
|
--- a/arch/x86_64/kernel/include/syscall_list.h
|
||||||
|
+++ b/arch/x86_64/kernel/include/syscall_list.h
|
||||||
|
@@ -170,6 +170,8 @@ SYSCALL_HANDLED(731, util_indicate_clone)
|
||||||
|
SYSCALL_HANDLED(732, get_system)
|
||||||
|
SYSCALL_HANDLED(733, util_register_desc)
|
||||||
|
|
||||||
|
+SYSCALL_HANDLED(740, setkdebug)
|
||||||
|
+
|
||||||
|
/* McKernel Specific */
|
||||||
|
SYSCALL_HANDLED(801, swapout)
|
||||||
|
SYSCALL_HANDLED(802, linux_mlock)
|
||||||
|
diff --git a/kernel/include/process.h b/kernel/include/process.h
|
||||||
|
index 32fb880..d45f734 100644
|
||||||
|
--- a/kernel/include/process.h
|
||||||
|
+++ b/kernel/include/process.h
|
||||||
|
@@ -575,6 +575,7 @@ struct process {
|
||||||
|
int process_rank; /* Rank in partition */
|
||||||
|
int coredump_barrier_count, coredump_barrier_count2;
|
||||||
|
mcs_rwlock_lock_t coredump_lock; // lock for coredump
|
||||||
|
+ int debug_flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
diff --git a/kernel/procfs.c b/kernel/procfs.c
|
||||||
|
index 277dbfe..ea78af3 100644
|
||||||
|
--- a/kernel/procfs.c
|
||||||
|
+++ b/kernel/procfs.c
|
||||||
|
@@ -445,6 +445,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result)
|
||||||
|
else {
|
||||||
|
*result = -EAGAIN;
|
||||||
|
}
|
||||||
|
+ kprintf("read /proc/*/maps %d\n", result? 1: 0);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -521,6 +522,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result)
|
||||||
|
else {
|
||||||
|
*result = -EAGAIN;
|
||||||
|
}
|
||||||
|
+ kprintf("read /proc/*/pagemap %d\n", result? 1: 0);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -573,6 +575,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result)
|
||||||
|
else {
|
||||||
|
*result = -EAGAIN;
|
||||||
|
}
|
||||||
|
+ kprintf("read /proc/*/status %d\n", result? 1: 0);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
range = lookup_process_memory_range(vm, 0, -1);
|
||||||
|
diff --git a/kernel/syscall.c b/kernel/syscall.c
|
||||||
|
index 7d4964e..6a9f3df 100644
|
||||||
|
--- a/kernel/syscall.c
|
||||||
|
+++ b/kernel/syscall.c
|
||||||
|
@@ -1651,6 +1651,18 @@ do_mmap(const uintptr_t addr0, const size_t len0, const int prot,
|
||||||
|
}
|
||||||
|
|
||||||
|
ihk_mc_spinlock_lock_noirq(&thread->vm->memory_range_lock);
|
||||||
|
+ if (thread->proc->debug_flags) {
|
||||||
|
+ // sleep 5 sec
|
||||||
|
+ unsigned long ts = rdtsc();
|
||||||
|
+ unsigned long nanosecs = 5000000000L;
|
||||||
|
+ unsigned long tscs = nanosecs * 1000 / ihk_mc_get_ns_per_tsc();
|
||||||
|
+
|
||||||
|
+ kprintf("kernel debug sleep 5sec...\n");
|
||||||
|
+ while (rdtsc() - ts < tscs) {
|
||||||
|
+ cpu_pause();
|
||||||
|
+ }
|
||||||
|
+ kprintf("kernel debug wake up\n");
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (flags & MAP_FIXED) {
|
||||||
|
/* clear specified address range */
|
||||||
|
@@ -9617,6 +9629,17 @@ SYSCALL_DECLARE(util_register_desc)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+SYSCALL_DECLARE(setkdebug)
|
||||||
|
+{
|
||||||
|
+ int flags = ihk_mc_syscall_arg0(ctx);
|
||||||
|
+ struct thread *mythread = cpu_local_var(current);
|
||||||
|
+ struct process *proc = mythread->proc;
|
||||||
|
+
|
||||||
|
+ kprintf("set kernel debug flag pid=%d val=%d\n", proc->pid, flags);
|
||||||
|
+ proc->debug_flags = flags;
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void
|
||||||
|
reset_cputime()
|
||||||
|
{
|
||||||
|
diff --git a/test/issues/452/C452.patch b/test/issues/452/C452.patch
|
||||||
|
index 4393b4e..e69de29 100644
|
||||||
|
--- a/test/issues/452/C452.patch
|
||||||
|
+++ b/test/issues/452/C452.patch
|
||||||
|
@@ -1,107 +0,0 @@
|
||||||
|
-diff --git a/arch/arm64/kernel/include/syscall_list.h b/arch/arm64/kernel/include/syscall_list.h
|
||||||
|
-index 5dd6243..709231d 100644
|
||||||
|
---- a/arch/arm64/kernel/include/syscall_list.h
|
||||||
|
-+++ b/arch/arm64/kernel/include/syscall_list.h
|
||||||
|
-@@ -128,6 +128,8 @@ SYSCALL_HANDLED(731, util_indicate_clone)
|
||||||
|
- SYSCALL_HANDLED(732, get_system)
|
||||||
|
- SYSCALL_HANDLED(733, util_register_desc)
|
||||||
|
-
|
||||||
|
-+SYSCALL_HANDLED(740, setkdebug)
|
||||||
|
-+
|
||||||
|
- /* McKernel Specific */
|
||||||
|
- SYSCALL_HANDLED(801, swapout)
|
||||||
|
- SYSCALL_HANDLED(802, linux_mlock)
|
||||||
|
-diff --git a/arch/x86_64/kernel/include/syscall_list.h b/arch/x86_64/kernel/include/syscall_list.h
|
||||||
|
-index 8ef9bd0..16361ea 100644
|
||||||
|
---- a/arch/x86_64/kernel/include/syscall_list.h
|
||||||
|
-+++ b/arch/x86_64/kernel/include/syscall_list.h
|
||||||
|
-@@ -170,6 +170,8 @@ SYSCALL_HANDLED(731, util_indicate_clone)
|
||||||
|
- SYSCALL_HANDLED(732, get_system)
|
||||||
|
- SYSCALL_HANDLED(733, util_register_desc)
|
||||||
|
-
|
||||||
|
-+SYSCALL_HANDLED(740, setkdebug)
|
||||||
|
-+
|
||||||
|
- /* McKernel Specific */
|
||||||
|
- SYSCALL_HANDLED(801, swapout)
|
||||||
|
- SYSCALL_HANDLED(802, linux_mlock)
|
||||||
|
-diff --git a/kernel/include/process.h b/kernel/include/process.h
|
||||||
|
-index 32fb880..d45f734 100644
|
||||||
|
---- a/kernel/include/process.h
|
||||||
|
-+++ b/kernel/include/process.h
|
||||||
|
-@@ -575,6 +575,7 @@ struct process {
|
||||||
|
- int process_rank; /* Rank in partition */
|
||||||
|
- int coredump_barrier_count, coredump_barrier_count2;
|
||||||
|
- mcs_rwlock_lock_t coredump_lock; // lock for coredump
|
||||||
|
-+ int debug_flags;
|
||||||
|
- };
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
-diff --git a/kernel/procfs.c b/kernel/procfs.c
|
||||||
|
-index 35d4778..615b7ac 100644
|
||||||
|
---- a/kernel/procfs.c
|
||||||
|
-+++ b/kernel/procfs.c
|
||||||
|
-@@ -446,6 +446,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result)
|
||||||
|
- else {
|
||||||
|
- *result = -EAGAIN;
|
||||||
|
- }
|
||||||
|
-+ kprintf("read /proc/*/maps %d\n", result? 1: 0);
|
||||||
|
- goto out;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
-@@ -522,6 +523,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result)
|
||||||
|
- else {
|
||||||
|
- *result = -EAGAIN;
|
||||||
|
- }
|
||||||
|
-+ kprintf("read /proc/*/pagemap %d\n", result? 1: 0);
|
||||||
|
- goto out;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
-@@ -574,6 +576,7 @@ static int _process_procfs_request(struct ikc_scd_packet *rpacket, int *result)
|
||||||
|
- else {
|
||||||
|
- *result = -EAGAIN;
|
||||||
|
- }
|
||||||
|
-+ kprintf("read /proc/*/status %d\n", result? 1: 0);
|
||||||
|
- goto out;
|
||||||
|
- }
|
||||||
|
- range = lookup_process_memory_range(vm, 0, -1);
|
||||||
|
-diff --git a/kernel/syscall.c b/kernel/syscall.c
|
||||||
|
-index 7d4964e..6a9f3df 100644
|
||||||
|
---- a/kernel/syscall.c
|
||||||
|
-+++ b/kernel/syscall.c
|
||||||
|
-@@ -1651,6 +1651,18 @@ do_mmap(const uintptr_t addr0, const size_t len0, const int prot,
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- ihk_mc_spinlock_lock_noirq(&thread->vm->memory_range_lock);
|
||||||
|
-+ if (thread->proc->debug_flags) {
|
||||||
|
-+ // sleep 5 sec
|
||||||
|
-+ unsigned long ts = rdtsc();
|
||||||
|
-+ unsigned long nanosecs = 5000000000L;
|
||||||
|
-+ unsigned long tscs = nanosecs * 1000 / ihk_mc_get_ns_per_tsc();
|
||||||
|
-+
|
||||||
|
-+ kprintf("kernel debug sleep 5sec...\n");
|
||||||
|
-+ while (rdtsc() - ts < tscs) {
|
||||||
|
-+ cpu_pause();
|
||||||
|
-+ }
|
||||||
|
-+ kprintf("kernel debug wake up\n");
|
||||||
|
-+ }
|
||||||
|
-
|
||||||
|
- if (flags & MAP_FIXED) {
|
||||||
|
- /* clear specified address range */
|
||||||
|
-@@ -9617,6 +9629,17 @@ SYSCALL_DECLARE(util_register_desc)
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
-+SYSCALL_DECLARE(setkdebug)
|
||||||
|
-+{
|
||||||
|
-+ int flags = ihk_mc_syscall_arg0(ctx);
|
||||||
|
-+ struct thread *mythread = cpu_local_var(current);
|
||||||
|
-+ struct process *proc = mythread->proc;
|
||||||
|
-+
|
||||||
|
-+ kprintf("set kernel debug flag pid=%d val=%d\n", proc->pid, flags);
|
||||||
|
-+ proc->debug_flags = flags;
|
||||||
|
-+ return 0;
|
||||||
|
-+}
|
||||||
|
-+
|
||||||
|
- void
|
||||||
|
- reset_cputime()
|
||||||
|
- {
|
||||||
25
test/issues/452/C452.sh
Normal file
25
test/issues/452/C452.sh
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
USELTP=1
|
||||||
|
USEOSTEST=0
|
||||||
|
|
||||||
|
. ../../common.sh
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
$MCEXEC ./C452T01
|
||||||
|
|
||||||
|
for i in mmap01:02 mmap02:03 mmap03:04 mmap04:05 mmap12:06 brk01:07 fork01:08 \
|
||||||
|
fork02:09 fork03:10 mremap04:11 mremap05:12 munmap01:13 shmat01:14 \
|
||||||
|
shmdt01:15 mlock01:16 mlock04:17 execve01:18 exit01:19 exit02:20 \
|
||||||
|
exit_group01:21 mprotect02:22 mprotect03:23 msync01:24 msync02:25 \
|
||||||
|
munlock01:26 remap_file_pages01:27 remap_file_pages01:28; 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 TPASS $tp.txt | wc -l`
|
||||||
|
ng=`grep TFAIL $tp.txt | wc -l`
|
||||||
|
if [ $ng = 0 ]; then
|
||||||
|
echo "*** C452T$id: $tp PASS ($ok)"
|
||||||
|
else
|
||||||
|
echo "*** C452T$id: $tp FAIL (ok=$ok ng=%ng)"
|
||||||
|
fi
|
||||||
|
done
|
||||||
40
test/issues/452/C452T01.c
Normal file
40
test/issues/452/C452T01.c
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
int st;
|
||||||
|
|
||||||
|
fprintf(stderr, "*** C452T01 test start\n");
|
||||||
|
fflush(stderr);
|
||||||
|
pid = fork();
|
||||||
|
if (pid == 0) {
|
||||||
|
char file[32];
|
||||||
|
|
||||||
|
sleep(1);
|
||||||
|
sprintf(file, "/proc/%d/maps", getppid());
|
||||||
|
execlp("cat", "cat", file, NULL);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
fflush(stdout);
|
||||||
|
if (syscall(740, 1) == -1) {
|
||||||
|
fprintf(stderr, "*** C452T01 FAIL no patched kernel\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
mmap(NULL, 4096, PROT_READ|PROT_WRITE,
|
||||||
|
MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
|
||||||
|
syscall(740, 0);
|
||||||
|
while (waitpid(pid, &st, 0) == -1 && errno == EINTR)
|
||||||
|
;
|
||||||
|
fprintf(stderr, "*** C452T01 PASS\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
@ -1,23 +1,26 @@
|
|||||||
Script started on Thu 26 Sep 2019 10:31:51 AM JST
|
Script started on 2019-11-15 06:32:44+00:00
|
||||||
|
bash-4.4$ uname -m
|
||||||
|
aarch64
|
||||||
|
bash-4.4$ make test
|
||||||
gcc -g -Wall -o C452T01 C452T01.c
|
gcc -g -Wall -o C452T01 C452T01.c
|
||||||
sh ./C452.sh
|
sh ./C452.sh
|
||||||
mcstop+release.sh ... done
|
mcstop+release.sh ... done
|
||||||
mcreboot.sh -c 1-6,29-34 -m 50G@0,50G@1 -r 1-6:0+29-34:28 -O ... done
|
mcreboot.sh -c 2-7,10-15 -m 2G@0 ... done
|
||||||
*** C452T01 test start
|
*** C452T01 test start
|
||||||
000000400000-000000410000 r-xs 0 0:0 0
|
000000400000-000000410000 r-xs 0 0:0 0
|
||||||
000000410000-000000420000 r--s 0 0:0 0
|
000000410000-000000420000 r--s 0 0:0 0
|
||||||
000000420000-000000430000 rw-s 0 0:0 0
|
000000420000-000000430000 rw-s 0 0:0 0
|
||||||
080000000000-080000020000 r-xs 0 0:0 0
|
080000000000-080000020000 r-xs 0 0:0 0
|
||||||
080000020000-080000030000 r--s 0 0:0 0
|
080000020000-080000030000 r--s 0 0:0 0
|
||||||
080000030000-080000040000 rw-s 0 0:0 0
|
080000030000-080000040000 rw-s 0 0:0 0
|
||||||
0ffffffe0000-100000000000 rw-p 0 0:0 0
|
0ffffffe0000-100000000000 rw-p 0 0:0 0
|
||||||
100000000000-100000010000 r--s 0 0:0 0 [vsyscall]
|
100000000000-100000010000 r--s 0 0:0 0 [vsyscall]
|
||||||
100000010000-100000020000 r-xs 0 0:0 0 [vdso]
|
100000010000-100000020000 r-xs 0 0:0 0 [vdso]
|
||||||
100000040000-1000001b0000 r-xp 0 0:0 0 /usr/lib64/libc-2.17.so
|
100000030000-100000190000 r-xp 0 0:0 0 /usr/lib64/libc-2.28.so
|
||||||
1000001b0000-1000001c0000 r--p 0 0:0 0 /usr/lib64/libc-2.17.so
|
100000190000-1000001a0000 r--p 0 0:0 0 /usr/lib64/libc-2.28.so
|
||||||
1000001c0000-1000001d0000 rw-p 0 0:0 0 /usr/lib64/libc-2.17.so
|
1000001a0000-1000001b0000 rw-p 0 0:0 0 /usr/lib64/libc-2.28.so
|
||||||
1000001d0000-1000001e0000 rw-p 0 0:0 0
|
1000001b0000-1000001c0000 rw-p 0 0:0 0
|
||||||
3fffff800000-400000000000 rw-p 0 0:0 0 [stack]
|
3fffff800000-400000000000 rw-p 0 0:0 0 [stack]
|
||||||
*** C452T01 PASS
|
*** C452T01 PASS
|
||||||
mmap01 1 TPASS : Functionality of mmap() successful
|
mmap01 1 TPASS : Functionality of mmap() successful
|
||||||
*** C452T02: mmap01 PASS (1)
|
*** C452T02: mmap01 PASS (1)
|
||||||
@ -27,33 +30,19 @@ mmap03 1 TPASS : mmap() functionality is correct
|
|||||||
*** C452T04: mmap03 PASS (1)
|
*** C452T04: mmap03 PASS (1)
|
||||||
mmap04 1 TPASS : Functionality of mmap() successful
|
mmap04 1 TPASS : Functionality of mmap() successful
|
||||||
*** C452T05: mmap04 PASS (1)
|
*** C452T05: mmap04 PASS (1)
|
||||||
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
|
mmap12 1 TPASS : Functionality of mmap() successful
|
||||||
mmap12.c:103: INFO: All pages are present
|
*** C452T06: mmap12 PASS (1)
|
||||||
mmap12.c:127: PASS: File mapped properly
|
brk01 1 TPASS : brk(543512330) returned 0, new size verified by sbrk
|
||||||
|
*** C452T07: brk01 PASS (1)
|
||||||
Summary:
|
fork01 1 TPASS : fork() returned 4922
|
||||||
passed 1
|
fork01 2 TPASS : child pid and fork() return agree: 4922
|
||||||
failed 0
|
|
||||||
skipped 0
|
|
||||||
warnings 0
|
|
||||||
*** C452T06: mmap12 PASS (0)
|
|
||||||
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
|
|
||||||
brk01.c:67: PASS: brk() works fine
|
|
||||||
|
|
||||||
Summary:
|
|
||||||
passed 1
|
|
||||||
failed 0
|
|
||||||
skipped 0
|
|
||||||
warnings 0
|
|
||||||
*** C452T07: brk01 PASS (0)
|
|
||||||
fork01 1 TPASS : fork() returned 9892
|
|
||||||
fork01 2 TPASS : child pid and fork() return agree: 9892
|
|
||||||
*** C452T08: fork01 PASS (2)
|
*** C452T08: fork01 PASS (2)
|
||||||
fork02 0 TINFO : Inside parent
|
fork02 0 TINFO : Inside parent
|
||||||
|
fork02 0 TINFO : Inside child
|
||||||
fork02 0 TINFO : exit status of wait 0
|
fork02 0 TINFO : exit status of wait 0
|
||||||
fork02 1 TPASS : test 1 PASSED
|
fork02 1 TPASS : test 1 PASSED
|
||||||
*** C452T09: fork02 PASS (1)
|
*** C452T09: fork02 PASS (1)
|
||||||
fork03 0 TINFO : process id in parent of child from fork : 9979
|
fork03 0 TINFO : process id in parent of child from fork : 5008
|
||||||
fork03 1 TPASS : test 1 PASSED
|
fork03 1 TPASS : test 1 PASSED
|
||||||
*** C452T10: fork03 PASS (1)
|
*** C452T10: fork03 PASS (1)
|
||||||
mremap04 1 TPASS : mremap() failed, 'MREMAP_MAYMOVE flag unset', errno 12
|
mremap04 1 TPASS : mremap() failed, 'MREMAP_MAYMOVE flag unset', errno 12
|
||||||
@ -68,18 +57,11 @@ mremap05 7 TPASS : mremap #2 value OK
|
|||||||
*** C452T12: mremap05 PASS (7)
|
*** C452T12: mremap05 PASS (7)
|
||||||
munmap01 1 TPASS : Functionality of munmap() successful
|
munmap01 1 TPASS : Functionality of munmap() successful
|
||||||
*** C452T13: munmap01 PASS (1)
|
*** C452T13: munmap01 PASS (1)
|
||||||
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
|
shmat01 1 TPASS : conditions and functionality are correct
|
||||||
shmat01.c:147: PASS: shmat() succeeded to attach NULL address
|
shmat01 2 TPASS : conditions and functionality are correct
|
||||||
shmat01.c:147: PASS: shmat() succeeded to attach aligned address
|
shmat01 3 TPASS : conditions and functionality are correct
|
||||||
shmat01.c:147: PASS: shmat() succeeded to attach unaligned address with SHM_RND
|
shmat01 4 TPASS : conditions and functionality are correct
|
||||||
shmat01.c:147: PASS: shmat() succeeded to attach aligned address with SHM_READONLY, and got SIGSEGV on write
|
*** C452T14: shmat01 PASS (4)
|
||||||
|
|
||||||
Summary:
|
|
||||||
passed 4
|
|
||||||
failed 0
|
|
||||||
skipped 0
|
|
||||||
warnings 0
|
|
||||||
*** C452T14: shmat01 PASS (0)
|
|
||||||
shmdt01 1 TPASS : shared memory detached correctly
|
shmdt01 1 TPASS : shared memory detached correctly
|
||||||
*** C452T15: shmdt01 PASS (1)
|
*** C452T15: shmdt01 PASS (1)
|
||||||
mlock01 1 TPASS : mlock passed
|
mlock01 1 TPASS : mlock passed
|
||||||
@ -87,29 +69,16 @@ mlock01 2 TPASS : mlock passed
|
|||||||
mlock01 3 TPASS : mlock passed
|
mlock01 3 TPASS : mlock passed
|
||||||
mlock01 4 TPASS : mlock passed
|
mlock01 4 TPASS : mlock passed
|
||||||
*** C452T16: mlock01 PASS (4)
|
*** C452T16: mlock01 PASS (4)
|
||||||
mlock04 0 TINFO : locked 40960 bytes from 0x1000001d0000
|
mlock04 0 TINFO : locked 40960 bytes from 0x1000001b0000
|
||||||
mlock04 1 TPASS : test succeeded.
|
mlock04 1 TPASS : test succeeded.
|
||||||
*** C452T17: mlock04 PASS (1)
|
*** C452T17: mlock04 PASS (1)
|
||||||
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
|
execl01_child 1 TPASS : execve01_child executed
|
||||||
execve01_child.c:46: PASS: execve01_child executed
|
execve01 0 TINFO : Child process returned TPASS
|
||||||
|
*** C452T18: execve01 PASS (2)
|
||||||
Summary:
|
|
||||||
passed 1
|
|
||||||
failed 0
|
|
||||||
skipped 0
|
|
||||||
warnings 0
|
|
||||||
*** C452T18: execve01 PASS (0)
|
|
||||||
exit01 1 TPASS : exit() test PASSED
|
exit01 1 TPASS : exit() test PASSED
|
||||||
*** C452T19: exit01 PASS (1)
|
*** C452T19: exit01 PASS (1)
|
||||||
tst_test.c:1096: INFO: Timeout per run is 0h 05m 00s
|
exit02 1 TPASS : exit() test PASSED
|
||||||
exit02.c:59: PASS: File written by child read back correctly
|
*** C452T20: exit02 PASS (1)
|
||||||
|
|
||||||
Summary:
|
|
||||||
passed 1
|
|
||||||
failed 0
|
|
||||||
skipped 0
|
|
||||||
warnings 0
|
|
||||||
*** C452T20: exit02 PASS (0)
|
|
||||||
exit_group01 1 TPASS : exit_group() succeeded
|
exit_group01 1 TPASS : exit_group() succeeded
|
||||||
*** C452T21: exit_group01 PASS (1)
|
*** C452T21: exit_group01 PASS (1)
|
||||||
mprotect02 1 TPASS : got SIGSEGV as expected
|
mprotect02 1 TPASS : got SIGSEGV as expected
|
||||||
@ -133,5 +102,7 @@ remap_file_pages01 2 TPASS : Non-Linear /tmp/ file OK
|
|||||||
remap_file_pages01 1 TPASS : Non-Linear shm file OK
|
remap_file_pages01 1 TPASS : Non-Linear shm file OK
|
||||||
remap_file_pages01 2 TPASS : Non-Linear /tmp/ file OK
|
remap_file_pages01 2 TPASS : Non-Linear /tmp/ file OK
|
||||||
*** C452T28: remap_file_pages01 PASS (2)
|
*** C452T28: remap_file_pages01 PASS (2)
|
||||||
|
bash-4.4$ exit
|
||||||
|
exit
|
||||||
|
|
||||||
Script done on Thu 26 Sep 2019 10:32:32 AM JST
|
Script done on 2019-11-15 06:33:24+00:00
|
||||||
|
|||||||
@ -1,8 +1,11 @@
|
|||||||
Script started on Wed Jul 3 13:39:36 2019
|
Script started on Fri Nov 15 15:35:46 2019
|
||||||
|
bash-4.2$ uname -m
|
||||||
|
x86_64
|
||||||
bash-4.2$ make test
|
bash-4.2$ make test
|
||||||
|
gcc -g -Wall -o C452T01 C452T01.c
|
||||||
sh ./C452.sh
|
sh ./C452.sh
|
||||||
mcstop+release.sh ... done
|
mcstop+release.sh ... done
|
||||||
mcreboot.sh -c 1-7,17-23,9-15,25-31 -m 10G@0,10G@1 ... 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
|
||||||
*** C452T01 test start
|
*** C452T01 test start
|
||||||
000000400000-000000401000 r-xs 0 0:0 0
|
000000400000-000000401000 r-xs 0 0:0 0
|
||||||
000000600000-000000601000 r--s 0 0:0 0
|
000000600000-000000601000 r--s 0 0:0 0
|
||||||
@ -10,17 +13,17 @@ mcreboot.sh -c 1-7,17-23,9-15,25-31 -m 10G@0,10G@1 ... done
|
|||||||
155555600000-155555622000 r-xs 0 0:0 0
|
155555600000-155555622000 r-xs 0 0:0 0
|
||||||
155555821000-155555822000 r--s 0 0:0 0
|
155555821000-155555822000 r--s 0 0:0 0
|
||||||
155555822000-155555824000 rw-s 0 0:0 0
|
155555822000-155555824000 rw-s 0 0:0 0
|
||||||
2aaaaa9f8000-2aaaaaa00000 rw-p 0 0:0 0
|
2aaaaa9fc000-2aaaaaa00000 rw-p 0 0:0 0
|
||||||
2aaaaaa00000-2aaaaaa02000 r-xs 0 0:0 0 [vdso]
|
2aaaaaa00000-2aaaaaa02000 r-xs 0 0:0 0 [vdso]
|
||||||
2aaaaaa02000-2aaaaaa03000 rw-p 0 0:0 0
|
2aaaaaa02000-2aaaaaa03000 rw-p 0 0:0 0
|
||||||
2aaaaaa1a000-2aaaaaa1b000 rw-p 0 0:0 0
|
2aaaaaa1b000-2aaaaaa1c000 rw-p 0 0:0 0
|
||||||
2aaaaaa1b000-2aaaaabde000 r-xp 0 0:0 0 /usr/lib64/libc-2.17.so
|
2aaaaaa1c000-2aaaaabdf000 r-xp 0 0:0 0 /usr/lib64/libc-2.17.so
|
||||||
2aaaaabde000-2aaaaaddd000 ---p 0 0:0 0 /usr/lib64/libc-2.17.so
|
2aaaaabdf000-2aaaaadde000 ---p 0 0:0 0 /usr/lib64/libc-2.17.so
|
||||||
2aaaaaddd000-2aaaaade1000 r--p 0 0:0 0 /usr/lib64/libc-2.17.so
|
2aaaaadde000-2aaaaade2000 r--p 0 0:0 0 /usr/lib64/libc-2.17.so
|
||||||
2aaaaade1000-2aaaaade3000 rw-p 0 0:0 0 /usr/lib64/libc-2.17.so
|
2aaaaade2000-2aaaaade4000 rw-p 0 0:0 0 /usr/lib64/libc-2.17.so
|
||||||
2aaaaade3000-2aaaaade8000 rw-p 0 0:0 0
|
2aaaaade4000-2aaaaade9000 rw-p 0 0:0 0
|
||||||
2aaaaade8000-2aaaaadea000 rw-p 0 0:0 0
|
2aaaaade9000-2aaaaadeb000 rw-p 0 0:0 0
|
||||||
2aaaaadea000-2aaaaadeb000 rw-p 0 0:0 0
|
2aaaaadeb000-2aaaaadec000 rw-p 0 0:0 0
|
||||||
547fff800000-548000000000 rw-p 0 0:0 0 [stack]
|
547fff800000-548000000000 rw-p 0 0:0 0 [stack]
|
||||||
*** C452T01 PASS
|
*** C452T01 PASS
|
||||||
mmap01 1 TPASS : Functionality of mmap() successful
|
mmap01 1 TPASS : Functionality of mmap() successful
|
||||||
@ -35,18 +38,75 @@ mmap12 1 TPASS : Functionality of mmap() successful
|
|||||||
*** C452T06: mmap12 PASS (1)
|
*** C452T06: mmap12 PASS (1)
|
||||||
brk01 1 TPASS : brk(8626060) returned 0, new size verified by sbrk
|
brk01 1 TPASS : brk(8626060) returned 0, new size verified by sbrk
|
||||||
*** C452T07: brk01 PASS (1)
|
*** C452T07: brk01 PASS (1)
|
||||||
fork01 1 TPASS : fork() returned 19074
|
fork01 1 TPASS : fork() returned 25081
|
||||||
fork01 2 TPASS : child pid and fork() return agree: 19074
|
fork01 2 TPASS : child pid and fork() return agree: 25081
|
||||||
*** C452T08: fork01 PASS (2)
|
*** C452T08: fork01 PASS (2)
|
||||||
fork02 0 TINFO : Inside parent
|
fork02 0 TINFO : Inside parent
|
||||||
fork02 0 TINFO : Inside child
|
fork02 0 TINFO : Inside child
|
||||||
fork02 0 TINFO : exit status of wait 0
|
fork02 0 TINFO : exit status of wait 0
|
||||||
fork02 1 TPASS : test 1 PASSED
|
fork02 1 TPASS : test 1 PASSED
|
||||||
*** C452T09: fork02 PASS (1)
|
*** C452T09: fork02 PASS (1)
|
||||||
fork03 0 TINFO : process id in parent of child from fork : 19223
|
fork03 0 TINFO : process id in parent of child from fork : 25231
|
||||||
fork03 1 TPASS : test 1 PASSED
|
fork03 1 TPASS : test 1 PASSED
|
||||||
*** C452T10: fork03 PASS (1)
|
*** C452T10: fork03 PASS (1)
|
||||||
|
mremap04 1 TPASS : mremap() failed, 'MREMAP_MAYMOVE flag unset', errno 12
|
||||||
|
*** C452T11: mremap04 PASS (1)
|
||||||
|
mremap05 1 TPASS : MREMAP_FIXED requires MREMAP_MAYMOVE
|
||||||
|
mremap05 2 TPASS : new_addr has to be page aligned
|
||||||
|
mremap05 3 TPASS : old/new area must not overlap
|
||||||
|
mremap05 4 TPASS : mremap #1
|
||||||
|
mremap05 5 TPASS : mremap #1 value OK
|
||||||
|
mremap05 6 TPASS : mremap #2
|
||||||
|
mremap05 7 TPASS : mremap #2 value OK
|
||||||
|
*** C452T12: mremap05 PASS (7)
|
||||||
|
munmap01 1 TPASS : Functionality of munmap() successful
|
||||||
|
*** C452T13: munmap01 PASS (1)
|
||||||
|
shmat01 1 TPASS : conditions and functionality are correct
|
||||||
|
shmat01 2 TPASS : conditions and functionality are correct
|
||||||
|
shmat01 3 TPASS : conditions and functionality are correct
|
||||||
|
shmat01 4 TPASS : conditions and functionality are correct
|
||||||
|
*** C452T14: shmat01 PASS (4)
|
||||||
|
shmdt01 1 TPASS : shared memory detached correctly
|
||||||
|
*** C452T15: shmdt01 PASS (1)
|
||||||
|
mlock01 1 TPASS : mlock passed
|
||||||
|
mlock01 2 TPASS : mlock passed
|
||||||
|
mlock01 3 TPASS : mlock passed
|
||||||
|
mlock01 4 TPASS : mlock passed
|
||||||
|
*** C452T16: mlock01 PASS (4)
|
||||||
|
mlock04 0 TINFO : locked 40960 bytes from 0x2aaaaadeb000
|
||||||
|
mlock04 1 TPASS : test succeeded.
|
||||||
|
*** C452T17: mlock04 PASS (1)
|
||||||
|
execl01_child 1 TPASS : execve01_child executed
|
||||||
|
execve01 0 TINFO : Child process returned TPASS
|
||||||
|
*** C452T18: execve01 PASS (2)
|
||||||
|
exit01 1 TPASS : exit() test PASSED
|
||||||
|
*** C452T19: exit01 PASS (1)
|
||||||
|
exit02 1 TPASS : exit() test PASSED
|
||||||
|
*** C452T20: exit02 PASS (1)
|
||||||
|
exit_group01 1 TPASS : exit_group() succeeded
|
||||||
|
*** C452T21: exit_group01 PASS (1)
|
||||||
|
mprotect02 1 TPASS : got SIGSEGV as expected
|
||||||
|
mprotect02 2 TPASS : didn't get SIGSEGV
|
||||||
|
*** C452T22: mprotect02 PASS (2)
|
||||||
|
mprotect03 0 TINFO : received signal: SIGSEGV
|
||||||
|
mprotect03 1 TPASS : SIGSEGV generated as expected
|
||||||
|
*** C452T23: mprotect03 PASS (1)
|
||||||
|
msync01 1 TPASS : Functionality of msync() successful
|
||||||
|
*** C452T24: msync01 PASS (1)
|
||||||
|
msync02 1 TPASS : Functionality of msync successful
|
||||||
|
*** C452T25: msync02 PASS (1)
|
||||||
|
munlock01 1 TPASS : test 0 passed length = 1
|
||||||
|
munlock01 2 TPASS : test 1 passed length = 1024
|
||||||
|
munlock01 3 TPASS : test 2 passed length = 1048576
|
||||||
|
munlock01 4 TPASS : test 3 passed length = 10485760
|
||||||
|
*** C452T26: munlock01 PASS (4)
|
||||||
|
remap_file_pages01 1 TPASS : Non-Linear shm file OK
|
||||||
|
remap_file_pages01 2 TPASS : Non-Linear /tmp/ file OK
|
||||||
|
*** C452T27: remap_file_pages01 PASS (2)
|
||||||
|
remap_file_pages01 1 TPASS : Non-Linear shm file OK
|
||||||
|
remap_file_pages01 2 TPASS : Non-Linear /tmp/ file OK
|
||||||
|
*** C452T28: remap_file_pages01 PASS (2)
|
||||||
bash-4.2$ exit
|
bash-4.2$ exit
|
||||||
exit
|
exit
|
||||||
|
|
||||||
Script done on Wed Jul 3 13:39:53 2019
|
Script done on Fri Nov 15 15:36:14 2019
|
||||||
|
|||||||
13
test/issues/452/Makefile
Normal file
13
test/issues/452/Makefile
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
CC = gcc
|
||||||
|
TARGET = C452T01
|
||||||
|
|
||||||
|
all:: $(TARGET)
|
||||||
|
|
||||||
|
C452T01: C452T01.c
|
||||||
|
$(CC) -g -Wall -o $@ $^
|
||||||
|
|
||||||
|
test:: all
|
||||||
|
sh ./C452.sh
|
||||||
|
|
||||||
|
clean::
|
||||||
|
rm -f $(TARGET) *.o
|
||||||
54
test/issues/452/README
Normal file
54
test/issues/452/README
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
【Issue#452 動作確認】
|
||||||
|
□ テスト内容
|
||||||
|
1. Issue 指摘事項の再現確認
|
||||||
|
以下のパッチ (C452.patch) を McKernel に適用し、意図的に memory_range_lock の
|
||||||
|
競合を起こすことでテストを容易にする。
|
||||||
|
- mmap処理のmemory_range_lock取得中にsleep可能とする
|
||||||
|
- mmap処理のmemory_range_lock取得中にsleepするかどうかを制御する
|
||||||
|
システムコールを追加する
|
||||||
|
このパッチ適用カーネルを使ってテストする。
|
||||||
|
|
||||||
|
C452T01 memory_range_lock 取得中に /proc/*/maps を参照し、PASS すること
|
||||||
|
|
||||||
|
2. LTP を用いて既存処理に影響しないことを確認
|
||||||
|
メモリ関連処理を変更したため、関連するシステムコールのテストを選定した。
|
||||||
|
C452T02 mmap01: mmap の基本機能の確認
|
||||||
|
C452T03 mmap02: mmap の基本機能の確認
|
||||||
|
C452T04 mmap03: mmap の基本機能の確認
|
||||||
|
C452T05 mmap04: mmap の基本機能の確認
|
||||||
|
C452T06 mmap12: mmap の基本機能の確認
|
||||||
|
C452T07 brk01: brk の基本機能の確認
|
||||||
|
C452T08 fork01: fork の基本機能の確認 (fork時メモリがコピーされる)
|
||||||
|
C452T09 fork02: fork の基本機能の確認
|
||||||
|
C452T10 fork03: fork の基本機能の確認
|
||||||
|
C452T11 mremap04: mremap の基本機能の確認
|
||||||
|
C452T12 mremap05: mremap の基本機能の確認
|
||||||
|
C452T13 munmap01: munmap の基本機能の確認
|
||||||
|
C452T14 shmat01: shmat の基本機能の確認
|
||||||
|
C452T15 shmdt01: shmdt の基本機能の確認
|
||||||
|
C452T16 mlock01: mlock の基本機能の確認
|
||||||
|
C452T17 mlock04: mlock の基本機能の確認
|
||||||
|
C452T18 execve01: execve の基本機能の確認 (exec時、メモリ解放がある)
|
||||||
|
C452T19 exit01: exit の基本機能の確認 (exit時、メモリ解放がある)
|
||||||
|
C452T20 exit02: exit の基本機能の確認 (exit時、メモリ解放がある)
|
||||||
|
C452T21 exit_group01: exit_group の基本機能の確認 (exit時、メモリ解放がある)
|
||||||
|
C452T22 mprotect02: mprotect の基本機能の確認
|
||||||
|
C452T23 mprotect03: mprotect の基本機能の確認
|
||||||
|
C452T24 msync01: msync の基本機能の確認
|
||||||
|
C452T25 msync02: msync の基本機能の確認
|
||||||
|
C452T26 munlock01: munlock の基本機能の確認
|
||||||
|
C452T27 remap_file_pages01: remap_file_pages の基本機能の確認
|
||||||
|
C452T28 remap_file_pages02: remap_file_pages の基本機能の確認
|
||||||
|
|
||||||
|
□ 実行手順
|
||||||
|
$ make test
|
||||||
|
|
||||||
|
McKernelのインストール先や LTP の配置場所は、$HOME/.mck_test_config を
|
||||||
|
参照する。.mck_test_config は、McKernel をビルドした際に生成される
|
||||||
|
mck_test_config.sample ファイルを $HOME にコピーし、適宜編集すること。
|
||||||
|
|
||||||
|
尚、テスト実行には C452.patch を適用した McKernel を使用すること。
|
||||||
|
|
||||||
|
□ 実行結果
|
||||||
|
C452_x86_64.txt(x86_64実行結果)、C452_arm64.txt(arm64実行結果)参照。
|
||||||
|
全ての項目が PASS していることを確認。
|
||||||
Reference in New Issue
Block a user