diff --git a/kernel/include/page.h b/kernel/include/page.h index f5020d9b..617bdf2d 100644 --- a/kernel/include/page.h +++ b/kernel/include/page.h @@ -69,6 +69,4 @@ static inline int page_is_multi_mapped(struct page *page) /* Should we take page faults on ANONYMOUS mappings? */ extern int anon_on_demand; - -extern int xpmem_remote_on_demand; #endif diff --git a/kernel/include/process.h b/kernel/include/process.h index 4ed7647b..31bac2d9 100644 --- a/kernel/include/process.h +++ b/kernel/include/process.h @@ -830,9 +830,6 @@ struct vm_range *previous_process_memory_range( int extend_up_process_memory_range(struct process_vm *vm, struct vm_range *range, uintptr_t newend); -int page_fault_process_memory_range(struct process_vm *vm, - struct vm_range *range, - uintptr_t fault_addr, uint64_t reason); int page_fault_process_vm(struct process_vm *fault_vm, void *fault_addr, uint64_t reason); int remove_process_region(struct process_vm *vm, diff --git a/kernel/include/xpmem.h b/kernel/include/xpmem.h index 69228752..e0f87785 100644 --- a/kernel/include/xpmem.h +++ b/kernel/include/xpmem.h @@ -31,7 +31,7 @@ int xpmem_update_process_page_table(struct process_vm *vm, struct vm_range *vmr); struct xpmem_attachment { - ihk_rwspinlock_t at_lock; /* att lock */ + mcs_rwlock_lock_t at_lock; /* att lock */ unsigned long vaddr; /* starting address of seg attached */ unsigned long at_vaddr; /* address where seg is attached */ size_t at_size; /* size of seg attachment */ diff --git a/kernel/include/xpmem_private.h b/kernel/include/xpmem_private.h index cb292a36..dc2853ff 100644 --- a/kernel/include/xpmem_private.h +++ b/kernel/include/xpmem_private.h @@ -248,12 +248,11 @@ static void xpmem_clear_PTEs_of_att(struct xpmem_attachment *, unsigned long, static int xpmem_remap_pte(struct process_vm *, struct vm_range *, unsigned long, uint64_t, struct xpmem_segment *, unsigned long); -static int xpmem_ensure_valid_page(struct xpmem_segment *, unsigned long, - int); +static int xpmem_ensure_valid_page(struct xpmem_segment *, unsigned long); static pte_t * xpmem_vaddr_to_pte(struct process_vm *, unsigned long, size_t *pgsize); static int xpmem_pin_page(struct xpmem_thread_group *, struct thread *, - struct process_vm *, unsigned long, int); + struct process_vm *, unsigned long); static void xpmem_unpin_pages(struct xpmem_segment *, struct process_vm *, unsigned long, size_t); diff --git a/kernel/mem.c b/kernel/mem.c index 82ed14e8..97f9adc2 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -62,7 +62,6 @@ extern int interrupt_from_user(void *); struct tlb_flush_entry tlb_flush_vector[IHK_TLB_FLUSH_IRQ_VECTOR_SIZE]; int anon_on_demand = 0; -int xpmem_remote_on_demand; static struct ihk_mc_pa_ops *pa_ops; @@ -1955,11 +1954,6 @@ void mem_init(void) kprintf("Demand paging on ANONYMOUS mappings enabled.\n"); anon_on_demand = 1; } - - if (find_command_line("xpmem_remote_on_demand")) { - kprintf("Demand paging on XPMEM remote mappings enabled.\n"); - xpmem_remote_on_demand = 1; - } /* Init distance vectors */ numa_distances_init(); diff --git a/kernel/process.c b/kernel/process.c index 90df8479..27bdece3 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -1926,9 +1926,7 @@ out: return error; } -int page_fault_process_memory_range(struct process_vm *vm, - struct vm_range *range, - uintptr_t fault_addr, uint64_t reason) +static int page_fault_process_memory_range(struct process_vm *vm, struct vm_range *range, uintptr_t fault_addr, uint64_t reason) { int error; pte_t *ptep; diff --git a/kernel/xpmem.c b/kernel/xpmem.c index 7c27a2c9..fc437d3f 100644 --- a/kernel/xpmem.c +++ b/kernel/xpmem.c @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -424,6 +423,11 @@ static int xpmem_make( struct xpmem_thread_group *seg_tg; struct xpmem_segment *seg; struct mcs_rwlock_node_irqsave lock; + struct process_vm *vm = cpu_local_var(current)->vm; + int ret; + pte_t *seg_pte = NULL; + size_t pgsize = 0, seg_size = 0; + unsigned long pf_addr; XPMEM_DEBUG("call: vaddr=0x%lx, size=0x%lx, permit_type=%d, " "permit_value=0%04lo", @@ -448,13 +452,34 @@ static int xpmem_make( * multiple of pages in size. */ if (offset_in_page(vaddr) != 0 || - /* Special treatment of -1UL */ - (offset_in_page(size) != 0 && size != 0xffffffffffffffff)) { + /* Special treatment of -1UL */ + (offset_in_page(size) != 0 && size != 0xffffffffffffffff)) { xpmem_tg_deref(seg_tg); XPMEM_DEBUG("return: ret=%d", -EINVAL); return -EINVAL; } + /* Page-in segment area */ + pf_addr = vaddr; + while (pf_addr < vaddr + size) { + ret = page_fault_process_vm(vm, (void *)pf_addr, + PF_POPULATE | PF_WRITE | PF_USER); + if (ret) { + xpmem_tg_deref(seg_tg); + return -ENOENT; + } + seg_pte = xpmem_vaddr_to_pte(vm, pf_addr, &pgsize); + if (!seg_pte || pte_is_null(seg_pte)) { + xpmem_tg_deref(seg_tg); + return -ENOENT; + } + pf_addr += pgsize; + seg_size += pgsize; + } + if (seg_size > size) { + size = seg_size; + } + segid = xpmem_make_segid(seg_tg); if (segid < 0) { xpmem_tg_deref(seg_tg); @@ -1011,7 +1036,7 @@ static int xpmem_attach( struct xpmem_access_permit *ap; struct xpmem_segment *seg; struct xpmem_attachment *att; - unsigned long at_lock; + struct mcs_rwlock_node_irqsave at_lock; struct process_vm *vm = cpu_local_var(current)->vm; XPMEM_DEBUG("call: apid=0x%lx, offset=0x%lx, size=0x%lx, vaddr=0x%lx, " @@ -1077,7 +1102,7 @@ static int xpmem_attach( XPMEM_DEBUG("kmalloc(): att=0x%p", att); memset(att, 0, sizeof(struct xpmem_attachment)); - ihk_rwspinlock_init(&att->at_lock); + mcs_rwlock_init(&att->at_lock); att->vaddr = seg_vaddr; att->at_size = size; att->ap = ap; @@ -1087,7 +1112,7 @@ static int xpmem_attach( xpmem_att_not_destroyable(att); xpmem_att_ref(att); - at_lock = ihk_rwspinlock_write_lock(&att->at_lock); + mcs_rwlock_writer_lock(&att->at_lock, &at_lock); ihk_mc_spinlock_lock_noirq(&ap->lock); list_add_tail(&att->att_list, &ap->att_list); @@ -1129,10 +1154,7 @@ static int xpmem_attach( "flags=0x%lx, fd=%d, offset=0x%lx", vaddr, size, prot_flags, flags, mckfd->fd, offset); /* The new range is associated with shmobj because of - * MAP_ANONYMOUS && !MAP_PRIVATE && MAP_SHARED. Note that MAP_FIXED - * support prevents us from reusing segment vm_range when segment vm - * and attach vm is the same. - */ + MAP_ANONYMOUS && !MAP_PRIVATE && MAP_SHARED */ at_vaddr = do_mmap(vaddr, size, prot_flags, flags, mckfd->fd, offset, VR_XPMEM, att); if (IS_ERR((void *)(uintptr_t)at_vaddr)) { @@ -1152,7 +1174,7 @@ out_2: ihk_mc_spinlock_unlock_noirq(&ap->lock); xpmem_att_destroyable(att); } - ihk_rwspinlock_write_unlock(&att->at_lock, at_lock); + mcs_rwlock_writer_unlock(&att->at_lock, &at_lock); xpmem_att_deref(att); out_1: xpmem_ap_deref(ap); @@ -1171,7 +1193,7 @@ static int xpmem_detach( int ret; struct xpmem_access_permit *ap; struct xpmem_attachment *att; - unsigned long at_lock; + struct mcs_rwlock_node_irqsave at_lock; struct vm_range *range; struct process_vm *vm = cpu_local_var(current)->vm; @@ -1194,10 +1216,10 @@ static int xpmem_detach( xpmem_att_ref(att); - at_lock = ihk_rwspinlock_write_lock(&att->at_lock); + mcs_rwlock_writer_lock(&att->at_lock, &at_lock); if (att->flags & XPMEM_FLAG_DESTROYING) { - ihk_rwspinlock_write_unlock(&att->at_lock, at_lock); + mcs_rwlock_writer_unlock(&att->at_lock, &at_lock); ihk_rwspinlock_write_unlock_noirq(&vm->memory_range_lock); xpmem_att_deref(att); return 0; @@ -1210,7 +1232,7 @@ static int xpmem_detach( if (cpu_local_var(current)->proc->pid != ap->tg->tgid) { att->flags &= ~XPMEM_FLAG_DESTROYING; xpmem_ap_deref(ap); - ihk_rwspinlock_write_unlock(&att->at_lock, at_lock); + mcs_rwlock_writer_unlock(&att->at_lock, &at_lock); ihk_rwspinlock_write_unlock_noirq(&vm->memory_range_lock); xpmem_att_deref(att); return -EACCES; @@ -1222,7 +1244,7 @@ static int xpmem_detach( /* range->memobj is released in xpmem_vm_munmap() --> xpmem_remove_process_range() --> xpmem_free_process_memory_range() */ - ihk_rwspinlock_write_unlock(&att->at_lock, at_lock); + mcs_rwlock_writer_unlock(&att->at_lock, &at_lock); XPMEM_DEBUG("xpmem_vm_munmap(): start=0x%lx, len=0x%lx", range->start, att->at_size); @@ -1390,16 +1412,16 @@ static void xpmem_detach_att( int ret; struct vm_range *range; struct process_vm *vm; - unsigned long at_lock; + struct mcs_rwlock_node_irqsave at_lock; XPMEM_DEBUG("call: apid=0x%lx, att=0x%p", ap->apid, att); XPMEM_DEBUG("detaching att->vm=0x%p", (void *)att->vm); - at_lock = ihk_rwspinlock_write_lock(&att->at_lock); + mcs_rwlock_writer_lock(&att->at_lock, &at_lock); if (att->flags & XPMEM_FLAG_DESTROYING) { - ihk_rwspinlock_write_unlock(&att->at_lock, at_lock); + mcs_rwlock_writer_unlock(&att->at_lock, &at_lock); XPMEM_DEBUG("return: XPMEM_FLAG_DESTROYING"); return; } @@ -1415,7 +1437,7 @@ static void xpmem_detach_att( ihk_mc_spinlock_lock_noirq(&ap->lock); list_del_init(&att->att_list); ihk_mc_spinlock_unlock_noirq(&ap->lock); - ihk_rwspinlock_write_unlock(&att->at_lock, at_lock); + mcs_rwlock_writer_unlock(&att->at_lock, &at_lock); ihk_rwspinlock_read_unlock_noirq(&vm->memory_range_lock); xpmem_att_destroyable(att); XPMEM_DEBUG("return: range=%p"); @@ -1441,7 +1463,7 @@ static void xpmem_detach_att( list_del_init(&att->att_list); ihk_mc_spinlock_unlock_noirq(&ap->lock); - ihk_rwspinlock_write_unlock(&att->at_lock, at_lock); + mcs_rwlock_writer_unlock(&att->at_lock, &at_lock); XPMEM_DEBUG("xpmem_vm_munmap(): start=0x%lx, len=0x%lx", range->start, att->at_size); @@ -1549,13 +1571,13 @@ static void xpmem_clear_PTEs_of_att( unsigned long end) { int ret; - unsigned long at_lock; + struct mcs_rwlock_node_irqsave at_lock; XPMEM_DEBUG("call: att=0x%p, start=0x%lx, end=0x%lx", att, start, end); ihk_rwspinlock_read_lock_noirq(&att->vm->memory_range_lock); - at_lock = ihk_rwspinlock_write_lock(&att->at_lock); + mcs_rwlock_writer_lock(&att->at_lock, &at_lock); if (att->flags & XPMEM_FLAG_VALIDPTEs) { struct vm_range *range; @@ -1595,7 +1617,7 @@ static void xpmem_clear_PTEs_of_att( goto out; } - ihk_rwspinlock_write_unlock(&att->at_lock, at_lock); + mcs_rwlock_writer_unlock(&att->at_lock, &at_lock); XPMEM_DEBUG( "xpmem_vm_munmap(): start=0x%lx, len=0x%lx", @@ -1607,13 +1629,13 @@ static void xpmem_clear_PTEs_of_att( __FUNCTION__, ret); } - at_lock = ihk_rwspinlock_write_lock(&att->at_lock); + mcs_rwlock_writer_lock(&att->at_lock, &at_lock); if (offset_start == 0 && att->at_size == invalidate_len) att->flags &= ~XPMEM_FLAG_VALIDPTEs; } out: - ihk_rwspinlock_write_unlock(&att->at_lock, at_lock); + mcs_rwlock_writer_unlock(&att->at_lock, &at_lock); ihk_rwspinlock_read_unlock_noirq(&att->vm->memory_range_lock); XPMEM_DEBUG("return: "); @@ -1628,7 +1650,7 @@ int xpmem_remove_process_memory_range( u64 remaining_vaddr; struct xpmem_access_permit *ap; struct xpmem_attachment *att; - unsigned long at_lock; + struct mcs_rwlock_node_irqsave at_lock; XPMEM_DEBUG("call: vmr=0x%p, att=0x%p", vmr, vmr->private_data); @@ -1642,7 +1664,7 @@ int xpmem_remove_process_memory_range( xpmem_att_ref(att); - at_lock = ihk_rwspinlock_write_lock(&att->at_lock); + mcs_rwlock_writer_lock(&att->at_lock, &at_lock); if (att->flags & XPMEM_FLAG_DESTROYING) { XPMEM_DEBUG("already cleaned up"); @@ -1718,7 +1740,7 @@ int xpmem_remove_process_memory_range( */ out: - ihk_rwspinlock_write_unlock(&att->at_lock, at_lock); + mcs_rwlock_writer_unlock(&att->at_lock, &at_lock); xpmem_att_deref(att); @@ -1728,29 +1750,24 @@ out: } -static int _xpmem_fault_process_memory_range( +int xpmem_fault_process_memory_range( struct process_vm *vm, struct vm_range *vmr, unsigned long vaddr, - uint64_t reason, - int page_in_remote) + uint64_t reason) { int ret = 0; - unsigned long seg_vaddr; + unsigned long seg_vaddr = 0; + pte_t *pte = NULL; + pte_t *old_pte = NULL; struct xpmem_thread_group *ap_tg; struct xpmem_thread_group *seg_tg; struct xpmem_access_permit *ap; struct xpmem_attachment *att; struct xpmem_segment *seg; - pte_t *att_pte; - void *att_pgaddr; - size_t att_pgsize; - int att_p2align; - pte_t *seg_pte; - size_t seg_pgsize; - uintptr_t seg_phys; - uintptr_t seg_phys_plus_off; - enum ihk_mc_pt_attribute att_attr; + size_t pgsize; + struct mcs_rwlock_node_irqsave at_lock = { 0 }; + int att_locked = 0; XPMEM_DEBUG("call: vmr=0x%p, vaddr=0x%lx, reason=0x%lx", vmr, vaddr, reason); @@ -1783,144 +1800,67 @@ static int _xpmem_fault_process_memory_range( if ((seg->flags & XPMEM_FLAG_DESTROYING) || (seg_tg->flags & XPMEM_FLAG_DESTROYING)) { ret = -ENOENT; - goto out; + goto out_2; } + mcs_rwlock_writer_lock(&att->at_lock, &at_lock); + att_locked = 1; + if ((att->flags & XPMEM_FLAG_DESTROYING) || (ap_tg->flags & XPMEM_FLAG_DESTROYING) || (seg_tg->flags & XPMEM_FLAG_DESTROYING)) { - goto out; + goto out_2; } if (vaddr < att->at_vaddr || vaddr + 1 > att->at_vaddr + att->at_size) { - goto out; + goto out_2; } - /* page-in remote pages on page-fault or (on attach and - * xpmem_remote_on_demand isn't specified) - */ - seg_vaddr = att->vaddr + (vaddr - att->at_vaddr); + seg_vaddr = (att->vaddr & PAGE_MASK) + (vaddr - att->at_vaddr); XPMEM_DEBUG("vaddr=%lx, seg_vaddr=%lx", vaddr, seg_vaddr); - ret = xpmem_ensure_valid_page(seg, seg_vaddr, page_in_remote); + ret = xpmem_ensure_valid_page(seg, seg_vaddr); if (ret != 0) { - goto out; + goto out_2; } - if (is_remote_vm(seg_tg->vm)) { - ihk_rwspinlock_read_lock_noirq(&seg_tg->vm->memory_range_lock); - } - - seg_pte = xpmem_vaddr_to_pte(seg_tg->vm, seg_vaddr, &seg_pgsize); - - /* map only resident remote pages on attach and - * xpmem_remote_on_demand is specified - */ - if (!seg_pte || pte_is_null(seg_pte)) { - ret = page_in_remote ? -EFAULT : 0; - if (is_remote_vm(seg_tg->vm)) { - ihk_rwspinlock_read_unlock_noirq(&seg_tg->vm->memory_range_lock); - } - goto out; - } - - seg_phys = pte_get_phys(seg_pte); - /* clear lower bits of the contiguous-PTE tail entries */ - seg_phys_plus_off = (seg_phys & ~(seg_pgsize - 1)) | - (seg_vaddr & (seg_pgsize - 1)); - XPMEM_DEBUG("seg_vaddr: %lx, seg_phys: %lx, seg_phys_plus_off: %lx", - seg_vaddr, seg_phys, seg_phys_plus_off); - - if (is_remote_vm(seg_tg->vm)) { - ihk_rwspinlock_read_unlock_noirq(&seg_tg->vm->memory_range_lock); - } - - /* find largest page-size fitting vm range and segment page */ - att_pte = ihk_mc_pt_lookup_pte(vm->address_space->page_table, - (void *)vaddr, vmr->pgshift, &att_pgaddr, &att_pgsize, - &att_p2align); - - while ((unsigned long)att_pgaddr < vmr->start || - vmr->end < (uintptr_t)att_pgaddr + att_pgsize || - att_pgsize > seg_pgsize) { - att_pte = NULL; - ret = arch_get_smaller_page_size(NULL, att_pgsize, - &att_pgsize, &att_p2align); - if (ret) { - ekprintf("%s: arch_get_smaller_page_size failed: " - " range: %lx-%lx, pgsize: %lx, ret: %d\n", - __func__, vmr->start, vmr->end, att_pgsize, - ret); - goto out; - } - att_pgaddr = (void *)(vaddr & ~(att_pgsize - 1)); - } - - arch_adjust_allocate_page_size(vm->address_space->page_table, - vaddr, att_pte, &att_pgaddr, - &att_pgsize); - - XPMEM_DEBUG("att_pte=%p, att_pgaddr=0x%p, att_pgsize=%lu, " - "att_p2align=%d", - att_pte, att_pgaddr, att_pgsize, att_p2align); - - /* last arg is not used */ - att_attr = arch_vrflag_to_ptattr(vmr->flag, reason, NULL); - XPMEM_DEBUG("att_attr=0x%lx", att_attr); - - if (att_pte && !pte_is_null(att_pte)) { - unsigned long att_phys = pte_get_phys(att_pte); - unsigned long seg_phys_aligned = - seg_phys_plus_off & ~(att_pgsize - 1); - - if (att_phys != seg_phys_aligned) { - ret = -EFAULT; - ekprintf("%s: ERROR: pte mismatch: " - "0x%lx != 0x%lx\n", - __func__, att_phys, seg_phys_aligned); - } - - if (page_in_remote) { - ihk_atomic_dec(&seg->tg->n_pinned); - } - goto out; - } - - XPMEM_DEBUG("att_pgaddr: %lx, att_pgsize: %lx, " - "seg_vaddr: %lx, seg_pgsize: %lx, seg_phys: %lx\n", - att_pgaddr, att_pgsize, seg_vaddr, - seg_pgsize, seg_phys); - if (att_pte && !pgsize_is_contiguous(att_pgsize)) { - ret = ihk_mc_pt_set_pte(vm->address_space->page_table, - att_pte, att_pgsize, - seg_phys_plus_off, - att_attr); - if (ret) { - ret = -EFAULT; - ekprintf("%s: ERROR: ihk_mc_pt_set_pte() failed %d\n", - __func__, ret); - goto out; - } - } - else { - ret = ihk_mc_pt_set_range(vm->address_space->page_table, vm, - att_pgaddr, att_pgaddr + att_pgsize, - seg_phys_plus_off, - att_attr, vmr->pgshift, vmr, 1); - if (ret) { - ret = -EFAULT; - ekprintf("%s: ERROR: ihk_mc_pt_set_range() failed %d\n", - __func__, ret); - goto out; - } - } + pte = xpmem_vaddr_to_pte(seg_tg->vm, seg_vaddr, &pgsize); att->flags |= XPMEM_FLAG_VALIDPTEs; - flush_tlb_single(vaddr); -out: +out_2: xpmem_ap_deref(ap); xpmem_tg_deref(ap_tg); + + if (pte && !pte_is_null(pte)) { + old_pte = xpmem_vaddr_to_pte(cpu_local_var(current)->vm, vaddr, + &pgsize); + if (old_pte && !pte_is_null(old_pte)) { + if (*old_pte != *pte) { + ret = -EFAULT; + ekprintf("%s: ERROR: pte mismatch: " + "0x%lx != 0x%lx\n", + __FUNCTION__, *old_pte, *pte); + } + + ihk_atomic_dec(&seg->tg->n_pinned); + goto out_1; + } + + ret = xpmem_remap_pte(vm, vmr, vaddr, reason, seg, seg_vaddr); + if (ret) { + ekprintf("%s: ERROR: xpmem_remap_pte() failed %d\n", + __FUNCTION__, ret); + } + } + + flush_tlb_single(vaddr); + +out_1: + if (att_locked) { + mcs_rwlock_writer_unlock(&att->at_lock, &at_lock); + } + xpmem_tg_deref(seg_tg); xpmem_seg_deref(seg); xpmem_att_deref(att); @@ -1930,38 +1870,21 @@ out: return ret; } -int xpmem_fault_process_memory_range( - struct process_vm *vm, - struct vm_range *vmr, - unsigned long vaddr, - uint64_t reason) -{ - int ret; - unsigned long at_lock; - struct xpmem_attachment *att; - - att = (struct xpmem_attachment *)vmr->private_data; - if (att == NULL) { - return -EFAULT; - } - at_lock = ihk_rwspinlock_read_lock(&att->at_lock); - ret = _xpmem_fault_process_memory_range(vm, vmr, vaddr, reason, 1); - ihk_rwspinlock_read_unlock(&att->at_lock, at_lock); - return ret; -} - int xpmem_update_process_page_table( struct process_vm *vm, struct vm_range *vmr) { int ret = 0; - unsigned long vaddr; - pte_t *pte; - size_t pgsize; + unsigned long seg_vaddr = 0; + unsigned long vaddr = vmr->start; + pte_t *pte = NULL; + pte_t *seg_pte = NULL; struct xpmem_thread_group *ap_tg; struct xpmem_thread_group *seg_tg; struct xpmem_access_permit *ap; struct xpmem_attachment *att; struct xpmem_segment *seg; + size_t seg_pgsize; + size_t pgsize; XPMEM_DEBUG("call: vmr=0x%p", vmr); @@ -2005,29 +1928,44 @@ int xpmem_update_process_page_table( goto out_2; } - for (vaddr = vmr->start; vaddr < vmr->end; vaddr += pgsize) { - XPMEM_DEBUG("vmr: %lx-%lx, vaddr: %lx", - vmr->start, vmr->end, vaddr); - - ret = _xpmem_fault_process_memory_range(vm, vmr, vaddr, - 0, - !xpmem_remote_on_demand); - if (ret) { - ekprintf("%s: ERROR: " - "_xpmem_fault_process_memory_range() " - "failed %d\n", __func__, ret); + seg_vaddr = (att->vaddr & PAGE_MASK) + (vaddr - att->at_vaddr); + XPMEM_DEBUG("vaddr=%lx, seg_vaddr=%lx", vaddr, seg_vaddr); + while (vaddr < vmr->end) { + ret = xpmem_ensure_valid_page(seg, seg_vaddr); + if (ret != 0) { + goto out_2; } - pte = ihk_mc_pt_lookup_pte(vm->address_space->page_table, - (void *)vaddr, vmr->pgshift, - NULL, &pgsize, NULL); + seg_pte = xpmem_vaddr_to_pte(seg_tg->vm, seg_vaddr, + &seg_pgsize); - /* when segment page is not resident and - * xpmem_remote_on_demand is specified - */ - if (!pte || pte_is_null(pte)) { - pgsize = PAGE_SIZE; + if (seg_pte && !pte_is_null(seg_pte)) { + pte = xpmem_vaddr_to_pte(cpu_local_var(current)->vm, + vaddr, &pgsize); + if (pte && !pte_is_null(pte)) { + if (*seg_pte != *pte) { + ret = -EFAULT; + ekprintf("%s: ERROR: pte mismatch: " + "0x%lx != 0x%lx\n", + __func__, *seg_pte, *pte); + } + + ihk_atomic_dec(&seg->tg->n_pinned); + goto out_2; + } + + ret = xpmem_remap_pte(vm, vmr, vaddr, + 0, seg, seg_vaddr); + if (ret) { + ekprintf("%s: ERROR: xpmem_remap_pte() failed %d\n", + __func__, ret); + } } + flush_tlb_single(vaddr); + att->flags |= XPMEM_FLAG_VALIDPTEs; + + seg_vaddr += seg_pgsize; + vaddr += seg_pgsize; } out_2: @@ -2044,10 +1982,110 @@ out_1: return ret; } +static int xpmem_remap_pte( + struct process_vm *vm, + struct vm_range *vmr, + unsigned long vaddr, + uint64_t reason, + struct xpmem_segment *seg, + unsigned long seg_vaddr) +{ + int ret; + struct xpmem_thread_group *seg_tg = seg->tg; + struct vm_range *seg_vmr; + pte_t *seg_pte; + void *seg_pgaddr; + size_t seg_pgsize; + int seg_p2align; + uintptr_t seg_phys; + pte_t *att_pte; + void *att_pgaddr; + size_t att_pgsize; + int att_p2align; + enum ihk_mc_pt_attribute att_attr; + + XPMEM_DEBUG("call: vmr=0x%p, vaddr=0x%lx, reason=0x%lx, segid=0x%lx, " + "seg_vaddr=0x%lx", + vmr, vaddr, reason, seg->segid, seg_vaddr); + + if (is_remote_vm(seg_tg->vm)) { + ihk_rwspinlock_read_lock_noirq(&seg_tg->vm->memory_range_lock); + } + + seg_vmr = lookup_process_memory_range(seg_tg->vm, seg_vaddr, + seg_vaddr + 1); + + if (!seg_vmr) { + ret = -EFAULT; + ekprintf("%s: ERROR: lookup_process_memory_range() failed\n", + __FUNCTION__); + goto out; + } + + seg_pte = ihk_mc_pt_lookup_pte(seg_tg->vm->address_space->page_table, + (void *)seg_vaddr, seg_vmr->pgshift, &seg_pgaddr, &seg_pgsize, + &seg_p2align); + + if (!seg_pte) { + ret = -EFAULT; + ekprintf("%s: ERROR: ihk_mc_pt_lookup_pte() failed\n", + __FUNCTION__); + goto out; + } + XPMEM_DEBUG("seg_pte=0x%016lx, seg_pgaddr=0x%p, seg_pgsize=%lu, " + "seg_p2align=%d", + *seg_pte, seg_pgaddr, seg_pgsize, seg_p2align); + + seg_phys = pte_get_phys(seg_pte); + XPMEM_DEBUG("seg_phys=0x%lx", seg_phys); + + att_pte = ihk_mc_pt_lookup_pte(vm->address_space->page_table, + (void *)vaddr, vmr->pgshift, &att_pgaddr, &att_pgsize, + &att_p2align); + XPMEM_DEBUG("att_pte=%p, att_pgaddr=0x%p, att_pgsize=%lu, " + "att_p2align=%d", + att_pte, att_pgaddr, att_pgsize, att_p2align); + + att_attr = arch_vrflag_to_ptattr(vmr->flag, reason, att_pte); + XPMEM_DEBUG("att_attr=0x%lx", att_attr); + + if (att_pte && !pgsize_is_contiguous(seg_pgsize)) { + ret = ihk_mc_pt_set_pte(vm->address_space->page_table, att_pte, + seg_pgsize, seg_phys, att_attr); + if (ret) { + ret = -EFAULT; + ekprintf("%s: ERROR: ihk_mc_pt_set_pte() failed %d\n", + __func__, ret); + goto out; + } + } + else { + ret = ihk_mc_pt_set_range(vm->address_space->page_table, vm, + att_pgaddr, att_pgaddr + seg_pgsize, + seg_phys, att_attr, + pgsize_to_pgshift(seg_pgsize), vmr, 1); + if (ret) { + ret = -EFAULT; + ekprintf("%s: ERROR: ihk_mc_pt_set_range() failed %d\n", + __func__, ret); + goto out; + } + } + +out: + if (is_remote_vm(seg_tg->vm)) { + ihk_rwspinlock_read_unlock_noirq(&seg_tg->vm->memory_range_lock); + } + + XPMEM_DEBUG("return: ret=%d", ret); + + return ret; +} + + static int xpmem_ensure_valid_page( struct xpmem_segment *seg, - unsigned long vaddr, - int page_in) + unsigned long vaddr) { int ret; struct xpmem_thread_group *seg_tg = seg->tg; @@ -2057,8 +2095,7 @@ static int xpmem_ensure_valid_page( if (seg->flags & XPMEM_FLAG_DESTROYING) return -ENOENT; - ret = xpmem_pin_page(seg_tg, seg_tg->group_leader, seg_tg->vm, vaddr, - page_in); + ret = xpmem_pin_page(seg_tg, seg_tg->group_leader, seg_tg->vm, vaddr); XPMEM_DEBUG("return: ret=%d", ret); @@ -2104,8 +2141,7 @@ static int xpmem_pin_page( struct xpmem_thread_group *tg, struct thread *src_thread, struct process_vm *src_vm, - unsigned long vaddr, - int page_in) + unsigned long vaddr) { int ret = 0; struct vm_range *range; @@ -2129,21 +2165,6 @@ static int xpmem_pin_page( } ihk_atomic_inc(&tg->n_pinned); - - /* Page-in remote area */ - if (page_in) { - /* skip read lock for the case src_vm is local - * because write lock is taken in do_mmap. - */ - ret = page_fault_process_memory_range(src_vm, range, - vaddr, - PF_POPULATE | PF_WRITE | - PF_USER); - if (ret) { - goto out; - } - } - out: if (is_remote_vm(src_vm)) { ihk_rwspinlock_read_unlock_noirq(&src_vm->memory_range_lock); diff --git a/test/common.sh b/test/common.sh index de7b913a..50726239 100644 --- a/test/common.sh +++ b/test/common.sh @@ -107,7 +107,7 @@ fi mcstop() { echo -n "mcstop+release.sh ... " - "$SBIN/mcstop+release.sh" + sudo "$SBIN/mcstop+release.sh" echo "done" if lsmod | grep mcctrl > /dev/null 2>&1; then @@ -118,7 +118,7 @@ mcstop() { mcreboot() { echo -n "mcreboot.sh $BOOTPARAM ... " - "$SBIN/mcreboot.sh" $BOOTPARAM + sudo "$SBIN/mcreboot.sh" $BOOTPARAM echo "done" if ! lsmod | grep mcctrl > /dev/null 2>&1; then diff --git a/test/issues/1259/C1259.sh b/test/issues/1259/C1259.sh index 49c1730d..2f7c7366 100755 --- a/test/issues/1259/C1259.sh +++ b/test/issues/1259/C1259.sh @@ -39,8 +39,8 @@ do SEG_PGSIZE=`cat ${log_file} | awk '/OK/,/DONE/' | \ grep -o "large_page_allocation.*${SEG_ADDR}.*" | awk '{ print $5; }'` - XPMEM_ADDR=`grep xpmem_attachment_addr ${log_file} | awk '{ print $NF; }'` - XPMEM_PGSIZE=`grep -o "xpmem_page_attach.*${XPMEM_ADDR}.*" ${log_file} | awk '{ print $NF; }'` + XPMEM_ADDR=`grep xpmem_attachment_addr ${log_file} | awk '{ print $3; }'` + XPMEM_PGSIZE=`grep -o "xpmem_page_attach.*${XPMEM_ADDR}.*" ${log_file} | awk '{ print $5; }'` if [ "${SEG_PGSIZE}" = "${EXPECT_PGSIZE}" ]; then echo "** [ OK ] seg_addr ($SEG_ADDR) is allocated until xpmem_attach" @@ -81,24 +81,21 @@ do SEG_PGSIZE=`cat ${log_file} | awk '/OK/,/DONE/' | \ grep -o "large_page_allocation.*${SEG_ADDR}.*" | awk '{ print $5; }'` - XPMEM_ADDR=`grep xpmem_attachment_addr ${log_file} | awk '{ print $NF; }'` - XPMEM_PGSIZE=`grep -o "xpmem_page_attach.*${XPMEM_ADDR}.*" ${log_file} | awk '{ print $NF; }'` + XPMEM_ADDR=`grep xpmem_attachment_addr ${log_file} | awk '{ print $3; }'` + XPMEM_PGSIZE=`grep -o "xpmem_page_attach.*${XPMEM_ADDR}.*" ${log_file} | awk '{ print $5; }'` if [ "${SEG_PGSIZE}" = "${EXPECT_PGSIZE}" ]; then - printf "** [ OK ] " + echo "** [ OK ] seg_addr ($SEG_ADDR) is allocated until xpmem_attach" else - printf "** [ NG ] " + echo "** [ NG ] seg_addr ($SEG_ADDR) is NOT allocated until xpmem_attach" let ng++ fi - echo "size of 1st page of segment at ${SEG_ADDR}: ${SEG_PGSIZE}, expected: ${EXPECT_PGSIZE}" - if [ "${XPMEM_PGSIZE}" = "${EXPECT_PGSIZE}" ]; then - printf "** [ OK ] " + echo "** [ OK ] xpmem_addr ($XPMEM_ADDR) is allocated using large pages" else - printf "** [ NG ] " + echo "** [ NG ] xpmem_addr ($XPMEM_ADDR) is NOT allocated using large pages" let ng++ fi - echo "size of 1st page of attachment at ${XPMEM_ADDR}: ${XPMEM_PGSIZE}, expected: ${EXPECT_PGSIZE}" done if [ ${ng} -eq 0 ]; then echo "*** C${issue}T${tid}: PASSED" @@ -119,8 +116,8 @@ ${IHKOSCTL} 0 kmsg >> ${log_file} EXPECT_PGSIZE=`grep EXPECT_PAGE_SIZE ${log_file} | awk '{ print $2; }'` -XPMEM_ADDR=`grep xpmem_attachment_addr ${log_file} | awk '{ print $NF; }'` -XPMEM_PGSIZE=`grep -o "xpmem_page_attach.*${XPMEM_ADDR}.*" ${log_file} | awk '{ print $NF; }'` +XPMEM_ADDR=`grep xpmem_attachment_addr ${log_file} | awk '{ print $3; }'` +XPMEM_PGSIZE=`grep -o "xpmem_page_attach.*${XPMEM_ADDR}.*" ${log_file} | awk '{ print $5; }'` if [ "${XPMEM_PGSIZE}" = "${EXPECT_PGSIZE}" ]; then echo "** [ OK ] xpmem_addr ($XPMEM_ADDR) is allocated using small pages" @@ -143,13 +140,13 @@ pgshift=${PGSHIFT_LIST[0]} ${IHKOSCTL} 0 clear_kmsg log_file="./C${issue}T${tid}_${pgshift}.log" echo pageshift: ${pgshift} -${MCEXEC} ./multi_vmr_xpmem ${pgshift} 1 | tee ${log_file} +${MCEXEC} ./multi_vmr_xpmem ${pgshift} 1 > ${log_file} ${IHKOSCTL} 0 kmsg >> ${log_file} EXPECT_PGSIZE=`grep EXPECT_PAGE_SIZE ${log_file} | awk '{ print $2; }'` -XPMEM_ADDR=`grep xpmem_large ${log_file} | awk '{ print $NF; }'` -XPMEM_PGSIZE=`grep -o "xpmem_page_attach.*${XPMEM_ADDR}.*" ${log_file} | awk '{ print $NF; }'` +XPMEM_ADDR=`grep xpmem_large ${log_file} | awk '{ print $3; }'` +XPMEM_PGSIZE=`grep -o "xpmem_page_attach.*${XPMEM_ADDR}.*" ${log_file} | awk '{ print $5; }'` if [ "${XPMEM_PGSIZE}" = "${EXPECT_PGSIZE}" ]; then echo "** [ OK ] xpmem_addr ($XPMEM_ADDR) is allocated using large pages" @@ -170,7 +167,7 @@ echo "*** C${issue}T${tid} start *******************************" echo "** xpmem testsuite" cwd=`pwd` cd ${XPMEM_BUILD_DIR}/test -. ${cwd}/mc_run.sh +${cwd}/mc_run.sh cd ${cwd} # xpmem basic test diff --git a/test/issues/1259/huge_page_xpmem.c b/test/issues/1259/huge_page_xpmem.c index 19d467e8..45b4dd5d 100644 --- a/test/issues/1259/huge_page_xpmem.c +++ b/test/issues/1259/huge_page_xpmem.c @@ -113,7 +113,7 @@ int main(int argc, char **argv) addr.apid = apid; addr.offset = 0; - attach = xpmem_attach(addr, map_size, NULL); + attach = xpmem_attach(addr, pgsize * pgnum, NULL); CHKANDJUMP(attach == (void *)-1, EXIT_FAILURE, "xpmem_attach failed: %s\n", strerror(errno)); diff --git a/test/issues/1259/large_page.patch b/test/issues/1259/large_page.patch index f3df2f16..93862ccf 100644 --- a/test/issues/1259/large_page.patch +++ b/test/issues/1259/large_page.patch @@ -1,8 +1,8 @@ diff --git arch/arm64/kernel/memory.c arch/arm64/kernel/memory.c -index a84bc21..f329fcf 100644 +index a84bc21..7368ada 100644 --- arch/arm64/kernel/memory.c +++ arch/arm64/kernel/memory.c -@@ -2701,6 +2701,16 @@ int set_range_l1(void *args0, pte_t *ptep, uintptr_t base, uintptr_t start, +@@ -2701,6 +2701,13 @@ int set_range_l1(void *args0, pte_t *ptep, uintptr_t base, uintptr_t start, ptl1_set(ptep, pte); error = 0; @@ -11,15 +11,12 @@ index a84bc21..f329fcf 100644 + __page_offset(base, PTL1_CONT_SIZE) == 0) { + kprintf("%s: large_page_allocation, addr: %016lx, size: 0x%lx , phys: %lx\n", + __func__, base, PTL1_CONT_SIZE, phys); -+ if (args->range->private_data) -+ kprintf("%s: xpmem_page_attach, addr: %016lx, size: 0x%lx\n", -+ __func__, base, PTL1_CONT_SIZE); + } + // call memory_stat_rss_add() here because pgshift is resolved here if (!(args->attr[0] & PTE_CONT)) { if (rusage_memory_stat_add(args->range, phys, -@@ -2810,6 +2820,23 @@ retry: +@@ -2810,6 +2817,17 @@ retry: level); error = 0; @@ -28,57 +25,45 @@ index a84bc21..f329fcf 100644 + if (__page_offset(base, tbl.cont_pgsize) == 0) { + kprintf("%s: large_page_allocation, addr: %016lx, size: 0x%lx , phys: %lx\n", + __func__, base, tbl.cont_pgsize, phys); -+ if (args->range->private_data) -+ kprintf("%s: xpmem_page_attach, addr: %016lx, size: 0x%lx\n", -+ __func__, base, tbl.cont_pgsize); + } + } else { + kprintf("%s: large_page_allocation, addr: %016lx, size: 0x%lx , phys: %lx\n", + __func__, base, tbl.pgsize, phys); -+ if (args->range->private_data) -+ kprintf("%s: xpmem_page_attach, addr: %016lx, size: 0x%lx\n", -+ __func__, base, tbl.pgsize); + } + dkprintf("set_range_middle(%lx,%lx,%lx,%d):" "large page. %d %lx\n", base, start, end, level, error, *ptep); diff --git arch/x86_64/kernel/memory.c arch/x86_64/kernel/memory.c -index 6b34036..4ca3a1a 100644 +index df545e1..633e390 100644 --- arch/x86_64/kernel/memory.c +++ arch/x86_64/kernel/memory.c -@@ -1932,6 +1932,13 @@ retry: +@@ -1931,6 +1931,10 @@ retry: dkprintf("set_range_l2(%lx,%lx,%lx):" "2MiB page. %d %lx\n", base, start, end, error, *ptep); + + kprintf("%s: large_page_allocation, addr: %016lx, size: 0x%lx\n", + __func__, base, PTL2_SIZE); -+ if (args->range->private_data) -+ kprintf("%s: xpmem_page_attach, addr: %016lx, size: 0x%lx\n", -+ __func__, base, PTL2_SIZE); + // Call memory_stat_rss_add() here because pgshift is resolved here if (rusage_memory_stat_add(args->range, phys, PTL2_SIZE, PTL2_SIZE)) { dkprintf("%lx+,%s: calling memory_stat_rss_add(),base=%lx,phys=%lx,size=%ld,pgsize=%ld\n", phys, __FUNCTION__, base, phys, PTL2_SIZE, PTL2_SIZE); -@@ -2021,6 +2028,12 @@ retry: +@@ -2020,6 +2024,9 @@ retry: "1GiB page. %d %lx\n", base, start, end, error, *ptep); + kprintf("%s: large_page_allocation, addr: %016lx, size: 0x%lx\n", + __func__, base, PTL3_SIZE); -+ if (args->range->private_data) -+ kprintf("%s: xpmem_page_attach, addr: %016lx, size: 0x%lx\n", -+ __func__, base, PTL3_SIZE); + // Call memory_stat_rss_add() here because pgshift is resolved here if (rusage_memory_stat_add(args->range, phys, PTL3_SIZE, PTL3_SIZE)) { dkprintf("%lx+,%s: calling memory_stat_rss_add(),base=%lx,phys=%lx,size=%ld,pgsize=%ld\n", phys, __FUNCTION__, base, phys, PTL3_SIZE, PTL3_SIZE); diff --git kernel/process.c kernel/process.c -index 1624726..d867b4d 100644 +index 809f5e0..cba9e5a 100644 --- kernel/process.c +++ kernel/process.c -@@ -2138,6 +2138,12 @@ retry: +@@ -2059,6 +2059,12 @@ retry: } dkprintf("%s: attr=%x\n", __FUNCTION__, attr); @@ -92,10 +77,10 @@ index 1624726..d867b4d 100644 pgsize, phys, attr); if (error) { diff --git kernel/xpmem.c kernel/xpmem.c -index 9fedf26..a0a7990 100644 +index e1d0231..c9da711 100644 --- kernel/xpmem.c +++ kernel/xpmem.c -@@ -490,6 +490,7 @@ static int xpmem_make( +@@ -514,6 +514,7 @@ static int xpmem_make( *segid_p = segid; XPMEM_DEBUG("return: ret=%d, segid=0x%lx", 0, *segid_p); @@ -103,15 +88,12 @@ index 9fedf26..a0a7990 100644 return 0; } -@@ -1886,6 +1887,11 @@ static int _xpmem_fault_process_memory_range( - goto out; - } +@@ -1994,6 +1995,8 @@ int xpmem_update_process_page_table( + flush_tlb_single(vaddr); + att->flags |= XPMEM_FLAG_VALIDPTEs; -+ if (att_pgsize == PAGE_SIZE) { -+ kprintf("xpmem_page_attach, addr: %016lx, size: 0x%lx\n", -+ vaddr, att_pgsize); -+ } -+ - XPMEM_DEBUG("att_pgaddr: %lx, att_pgsize: %lx, " - "seg_vaddr: %lx, seg_pgsize: %lx, seg_phys: %lx\n", - att_pgaddr, att_pgsize, seg_vaddr, ++ kprintf("%s: xpmem_page_attach, addr: %016lx, size: 0x%lx\n", ++ __func__, vaddr, seg_pgsize); + seg_vaddr += seg_pgsize; + vaddr += seg_pgsize; + } diff --git a/test/issues/1259/mc_run.sh b/test/issues/1259/mc_run.sh index ed530f4e..07e9c954 100755 --- a/test/issues/1259/mc_run.sh +++ b/test/issues/1259/mc_run.sh @@ -10,6 +10,6 @@ done echo 0 > /tmp/xpmem.lock # Run the main test app -${MCEXEC} $PWD/xpmem_master +mcexec $PWD/xpmem_master exit 0 diff --git a/test/issues/1259/multi_vmr_xpmem.c b/test/issues/1259/multi_vmr_xpmem.c index 5f7d6220..0147152b 100644 --- a/test/issues/1259/multi_vmr_xpmem.c +++ b/test/issues/1259/multi_vmr_xpmem.c @@ -110,7 +110,6 @@ int main(int argc, char **argv) addr.apid = apid; addr.offset = 0; - printf("child: attaching...\n"); attach = xpmem_attach(addr, map_size + (extr_size * 2), NULL); CHKANDJUMP(attach == (void *)-1, EXIT_FAILURE, @@ -152,7 +151,6 @@ int main(int argc, char **argv) CHKANDJUMP(shm == (void *)-1, EXIT_FAILURE, "shmat failed: %s\n", strerror(errno)); - printf("parent: making...\n"); segid = xpmem_make(mem_1, map_size + (extr_size * 2), XPMEM_PERMIT_MODE, (void *)0666); CHKANDJUMP(segid == -1, EXIT_FAILURE, @@ -160,7 +158,6 @@ int main(int argc, char **argv) *(xpmem_segid_t *)shm = segid; - printf("parent: waiting...\n"); ret = waitpid(pid, &status, 0); printf("child exited\n"); CHKANDJUMP(ret == -1, EXIT_FAILURE, "waitpid failed\n"); diff --git a/test/issues/1473/CMakeLists.txt b/test/issues/1473/CMakeLists.txt deleted file mode 100644 index 4d4c486b..00000000 --- a/test/issues/1473/CMakeLists.txt +++ /dev/null @@ -1,164 +0,0 @@ -cmake_policy(SET CMP0005 NEW) - -# Options: -DWITH_XPMEM= -add_definitions(-DWITH_XPMEM=${WITH_XPMEM}) - -# Options: -DWITH_XPMEM= -add_definitions(-DWITH_XPMEM_BUILD=${WITH_XPMEM_BUILD}) - -# Options: -DWITH_MCK= -add_definitions(-DWITH_MCK=${WITH_MCK}) - -# Options: -DWITH_MCK_SRC= -add_definitions(-DWITH_MCK_SRC=${WITH_MCK_SRC}) - -# not used when integrated with autotest -# Options: -DWITH_MCK_BUILD= -add_definitions(-DWITH_MCK_BUILD=${WITH_MCK_BUILD}) - -# for autotest -if(NOT DEFINED CMAKE_INSTALL_PREFIX_SCRIPTS) - set(CMAKE_INSTALL_PREFIX_SCRIPTS ${CMAKE_INSTALL_PREFIX}/scripts) -endif() - -cmake_minimum_required(VERSION 2.0) - -project(xpmemtest C) - -# CPPFLAGS - -set(UNAME_R ${CMAKE_SYSTEM_VERSION} CACHE STRING "Kernel version to build against") -set(KERNEL_DIR "/lib/modules/${UNAME_R}/build" CACHE STRING "kernel build directory") -execute_process(COMMAND awk -F= "$1 == \"CONFIG_ARM64_64K_PAGES\" { print $2; exit; }" "${KERNEL_DIR}/.config" - OUTPUT_VARIABLE CONFIG_ARM64_64K_PAGES OUTPUT_STRIP_TRAILING_WHITESPACE) -if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") - if(CONFIG_ARM64_64K_PAGES STREQUAL "y") - set(PAGE_SIZE "65536") - else() - set(PAGE_SIZE "4096") - endif() -else() - set(PAGE_SIZE "4096") -endif() -message("PAGE_SIZE: ${PAGE_SIZE}") - -# CFLAGS -set(CFLAGS_WARNING "-Wall" "-Wextra" "-Wno-unused-parameter" "-Wno-sign-compare" "-Wno-unused-function" ${EXTRA_WARNINGS} CACHE STRING "Warning flags") -add_compile_options(-O2 -g ${CFLAGS_WARNING}) - -# -L, this must be done before adding dependants -link_directories("${WITH_XPMEM}/lib") - -# -Wl,--rpath=, this must be done before adding dependants -set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) - -foreach(target IN ITEMS - xpmem_make01 - xpmem_attach01 - xpmem_attach02 - ) - - # Add target - add_executable(${target} ${target}.c) - - # -D - target_compile_definitions(${target} - PRIVATE -DPAGE_SIZE=${PAGE_SIZE} - ) - - # -I - target_include_directories(${target} - PRIVATE "${WITH_XPMEM}/include" - ) - - # -l - target_link_libraries(${target} - PRIVATE xpmem - ) - - # String replacement and install - configure_file(${target}.sh.in xpmem-${target} @ONLY) - - # Install - install(TARGETS ${target} DESTINATION bin) - install(PROGRAMS ${CMAKE_BINARY_DIR}/xpmem-${target} DESTINATION ${CMAKE_INSTALL_PREFIX_SCRIPTS}) -endforeach() - -foreach(target IN ITEMS - xpmem_attach03 - ) - # String replacement and install - configure_file(${target}.sh.in xpmem-${target} @ONLY) - - # Install - install(PROGRAMS ${CMAKE_BINARY_DIR}/xpmem-${target} DESTINATION ${CMAKE_INSTALL_PREFIX_SCRIPTS}) -endforeach() - -foreach(target IN ITEMS - util - ) - # String replacement and install - configure_file(${target}.sh.in ${target}.sh @ONLY) - - # Install - install(PROGRAMS ${CMAKE_BINARY_DIR}/${target}.sh DESTINATION bin) -endforeach() - -foreach(target IN ITEMS - huge_page_xpmem - multi_vmr_xpmem - XTP_001 - XTP_002 - XTP_003 - XTP_004 - XTP_005 - XTP_006 - XTP_007 - XTP_008 - XTP_009 - XTP_010 - XTP_011 - ) - - # Add target - add_executable(${target} ${target}.c) - - # -D - target_compile_definitions(${target} - PRIVATE -DPAGE_SIZE=${PAGE_SIZE} - ) - - # -I - target_include_directories(${target} - PRIVATE "${WITH_XPMEM}/include" - ) - - # -l - target_link_libraries(${target} - PRIVATE xpmem - ) - - # Install - install(TARGETS ${target} DESTINATION bin) -endforeach() - -foreach(target IN ITEMS - common.sh - ) - configure_file(${target}.in ${target} @ONLY) - install(PROGRAMS ${CMAKE_BINARY_DIR}/${target} DESTINATION bin) -endforeach() - -foreach(target IN ITEMS - aarch64.conf - ) - install(FILES ${target} DESTINATION etc) -endforeach() - -# patches -foreach(target IN ITEMS - large_page.patch - ihk_kmsg_size.patch - ) - install(PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/${target} DESTINATION bin) -endforeach() diff --git a/test/issues/1473/README b/test/issues/1473/README deleted file mode 100644 index ec8d540e..00000000 --- a/test/issues/1473/README +++ /dev/null @@ -1,35 +0,0 @@ -【Issue#1473 動作確認】 -縮退確認のため、1259のテストも合わせて行うことを勧める。 - -□ テスト内容 -xpmem_make01: - サイズ-1でxpmem_makeした際にpage-inしないことを確認する -xpmem_attach01: - s < lの関係にあるページサイズサイズs、lについて、ページサイズ - s、サイズlの物理連続領域をxpmem_makeして、当該領域を - xpmem_attachした際にページサイズがsになることを確認する -xpmem_attach02: - s < lの関係にあるページサイズサイズs, lについて、ページサイズl、 - サイズl * 3のマップのうち最初のページの最後のサイズs * 3の部分、 - 次のページの全体、最後のページの最初のサイズs * 3の部分を束ねて - xpmem_makeして、xpmem_attachした際にページサイズがs,s,s,l,s,s,s - になるか、またぞれぞれのマップが期待する物理ページを指しているか - 確認する - -□ 実行手順 -1. McKernelをビルドした際に生成されるmck_test_config.sample ファイルを - $HOME/.mck_test_configとしてコピーし、パスを編集する。 - mcreboot.shのオプションは、-e 'xpmem_remote_on_demand anon_on_demand' - をつけた場合とつけない場合の両方を試すこと。 - -2. 以下の手順でビルドと実行を行う -$ cd -$ patch -p0 < test/issues/1473/large_page.patch -$ (build mckernel) -$ cd /test/issues -$ mkdir build && cd build -$ cmake ../1473 -DWITH_MCK=/work/mcktest/work/mck -DWITH_MCK_SRC=/work/mcktest/work/src/mckernel -DWITH_MCK_BUILD=/work/mcktest/xpmem/mckernel/build -DWITH_XPMEM=/work/mcktest/xpmem/xpmem/install -DWITH_XPMEM_BUILD=/work/mcktest/xpmem/xpmem/xpmem -DCMAKE_INSTALL_PREFIX=/work/mcktest/xpmem/install -DCMAKE_INSTALL_PREFIX_SCRIPTS=/work/mcktest/data/scripts -$ make install -$ /scripts/xpmem-xpmem_make01 -$ /scripts/xpmem-xpmem_attach01 -$ /scripts/xpmem-xpmem_attach02 diff --git a/test/issues/1473/XTP_001.c b/test/issues/1473/XTP_001.c deleted file mode 100644 index 167ef0b6..00000000 --- a/test/issues/1473/XTP_001.c +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "util.h" -#include "okng.h" - -int main(int argc, char **argv) -{ - void *mem, *attach; - int ret = 0; - xpmem_segid_t segid; - xpmem_apid_t apid; - struct xpmem_addr addr; - - printf("*** %s start ***\n", basename(argv[0])); - - mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | - MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); - INTERR(mem == NULL, "mmap failed\n"); - memset(mem, 0, SZ_MEM); - - segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); - OKNG(segid != -1, "segid: %lx\n", (unsigned long)segid); - - apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); - OKNG(apid != -1, "apid: %lx\n", (unsigned long)apid); - - addr.apid = apid; - addr.offset = 0; - attach = xpmem_attach(addr, SZ_MEM, NULL); - OKNG(attach != (void *)-1, "attach: %lx\n", (unsigned long)attach); - - ret = xpmem_detach(attach); - OKNG(ret != -1, "xpmem_detach\n"); - - ret = xpmem_remove(segid); - OKNG(ret != -1, "xpmem_remove\n"); - - printf("*** %s PASSED\n\n", basename(argv[0])); - return 0; - -out: - printf("*** %s FAILED\n\n", basename(argv[0])); - - return -1; -} diff --git a/test/issues/1473/XTP_002.c b/test/issues/1473/XTP_002.c deleted file mode 100644 index 8ba35b42..00000000 --- a/test/issues/1473/XTP_002.c +++ /dev/null @@ -1,76 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "util.h" -#include "okng.h" - -int main(int argc, char **argv) -{ - void *mem, *attach; - int ret = 0; - int status; - pid_t pid; - xpmem_segid_t segid; - xpmem_apid_t apid; - struct xpmem_addr addr; - - printf("*** %s start ***\n", basename(argv[0])); - - mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | - MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); - INTERR(mem == NULL, "mmap failed\n"); - memset(mem, 0, SZ_MEM); - - fflush(0); - pid = fork(); - INTERR(pid == -1, "fork failed\n"); - - if (pid == 0) { - /* Child process */ - INTERR(ret != 0, "xpmem_init in child\n"); - - segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, - (void *)0666); - OKNG(segid != -1, "child: xpmem_make\n"); - - apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); - OKNG(apid != -1, "child: xpmem_get\n"); - - addr.apid = apid; - addr.offset = 0; - attach = xpmem_attach(addr, SZ_MEM, NULL); - OKNG(attach != (void *)-1, "xpmem_attach in child\n"); - - ret = xpmem_detach(attach); - OKNG(ret != -1, "xpmem_detach in child\n"); - - ret = xpmem_remove(segid); - OKNG(ret != -1, "xpmem_remove in child\n"); - - fflush(0); - _exit(0); - } else { - /* Parent process */ - ret = waitpid(pid, &status, 0); - INTERR(ret == -1, "waitpid failed\n"); - } - - printf("*** %s PASSED\n\n", basename(argv[0])); - return 0; - -out: - printf("*** %s FAILED\n\n", basename(argv[0])); - - return -1; -} diff --git a/test/issues/1473/XTP_003.c b/test/issues/1473/XTP_003.c deleted file mode 100644 index a45e9ba0..00000000 --- a/test/issues/1473/XTP_003.c +++ /dev/null @@ -1,80 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "util.h" -#include "okng.h" - -int main(int argc, char **argv) -{ - void *mem, *attach; - int ret = 0; - int status; - pid_t pid; - xpmem_segid_t segid; - xpmem_apid_t apid; - struct xpmem_addr addr; - - printf("*** %s start ***\n", basename(argv[0])); - - mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | - MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); - INTERR(mem == NULL, "mmap failed\n"); - memset(mem, 0, SZ_MEM); - - INTERR(ret != 0, "xpmem_init failed\n"); - - segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); - OKNG(segid != -1, "xpmem_make failed\n"); - - fflush(0); - pid = fork(); - INTERR(pid == -1, "fork failed\n"); - - if (pid == 0) { - /* Child process */ - apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); - OKNG(apid != -1, "xpmem_get in child\n"); - - addr.apid = apid; - addr.offset = 0; - attach = xpmem_attach(addr, SZ_MEM, NULL); - OKNG(attach != (void *)-1, "xpmem_attach in child\n"); - - *((unsigned long *)attach) = TEST_VAL; - - ret = xpmem_detach(attach); - OKNG(ret != -1, "xpmem_detach in child\n"); - - fflush(0); - _exit(0); - } else { - /* Parent process */ - ret = waitpid(pid, &status, 0); - INTERR(ret == -1, "waitpid failed\n"); - - OKNG(*((unsigned long *)mem) == TEST_VAL, - "TEST_VAL found\n"); - - ret = xpmem_remove(segid); - OKNG(ret != -1, "xpmem_remove\n"); - } - - printf("*** %s PASSED\n\n", basename(argv[0])); - return 0; - -out: - printf("*** %s FAILED\n\n", basename(argv[0])); - - return -1; -} diff --git a/test/issues/1473/XTP_004.c b/test/issues/1473/XTP_004.c deleted file mode 100644 index 135f875f..00000000 --- a/test/issues/1473/XTP_004.c +++ /dev/null @@ -1,111 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "util.h" -#include "okng.h" - -#define BUFF_SIZE 1024 - -int main(int argc, char **argv) -{ - void *mem, *attach; - int ret = 0; - int status; - pid_t pid; - xpmem_segid_t segid; - xpmem_apid_t apid; - struct xpmem_addr addr; - key_t key = ftok(argv[0], 0); - int shmid; - - printf("*** %s start ***\n", basename(argv[0])); - - shmid = shmget(key, SZ_MEM, IPC_CREAT | 0660); - INTERR(shmid == -1, "shmget failed\n"); - - mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | - MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); - INTERR(mem == NULL, "mmap failed\n"); - memset(mem, 0, SZ_MEM); - - fflush(0); - pid = fork(); - INTERR(pid == -1, "fork failed\n"); - - if (pid == 0) { - /* Child process */ - void *shm = shmat(shmid, NULL, 0); - - INTERR(shm == (void *)-1, "shmat in child failed\n"); - - while ((segid = *(xpmem_segid_t *)shm) == 0) { - sched_yield(); - }; - - ret = shmdt(shm); - INTERR(ret == -1, "shmdt failed\n"); - - apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); - OKNG(apid != -1, "xpmem_get in child\n"); - - addr.apid = apid; - addr.offset = 0; - attach = xpmem_attach(addr, SZ_MEM, NULL); - OKNG(attach != (void *)-1, "xpmem_attach in child\n"); - - *((unsigned long *)attach) = TEST_VAL; - - ret = xpmem_detach(attach); - OKNG(ret != -1, "xpmem_detach in child\n"); - - fflush(0); - _exit(0); - } else { - /* Parent process */ - void *shm = shmat(shmid, NULL, 0); - struct shmid_ds buf; - - INTERR(shm == (void *)-1, "shmat in parent failed\n"); - - segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, - (void *)0666); - OKNG(segid != -1, "xpmem_make in parent\n"); - - *(xpmem_segid_t *)shm = segid; - - ret = waitpid(pid, &status, 0); - INTERR(ret == -1, "waitpid failed\n"); - - OKNG(*((unsigned long *)mem) == TEST_VAL, - "TEST_VAL found\n"); - - ret = shmctl(shmid, IPC_RMID, &buf); - INTERR(ret == -1, "shmctl failed\n"); - - ret = shmdt(shm); - INTERR(ret == -1, "shmdt failed\n"); - - ret = xpmem_remove(segid); - OKNG(ret != -1, "xpmem_remove in parent\n"); - } - - printf("*** %s PASSED\n\n", basename(argv[0])); - return 0; - -out: - printf("*** %s FAILED\n\n", basename(argv[0])); - - return -1; -} diff --git a/test/issues/1473/XTP_005.c b/test/issues/1473/XTP_005.c deleted file mode 100644 index ea509973..00000000 --- a/test/issues/1473/XTP_005.c +++ /dev/null @@ -1,77 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "util.h" -#include "okng.h" - -int main(int argc, char **argv) -{ - void *mem, *attach; - int ret = 0; - int status; - pid_t pid; - xpmem_segid_t segid; - xpmem_apid_t apid; - struct xpmem_addr addr; - - printf("*** %s start ***\n", basename(argv[0])); - - mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | - MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); - INTERR(mem == NULL, "mmap failed\n"); - memset(mem, 0, SZ_MEM); - - INTERR(ret != 0, "xpmem_init failed\n"); - - segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); - OKNG(segid != -1, "xpmem_make\n"); - - fflush(0); - pid = fork(); - INTERR(pid == -1, "fork failed\n"); - - if (pid == 0) { - /* Child process */ - apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); - OKNG(apid != -1, "xpmem_get in child\n"); - - addr.apid = apid; - addr.offset = 0; - attach = xpmem_attach(addr, SZ_MEM, NULL); - OKNG(attach != (void *)-1, "xpmem_attach in child\n"); - - *((unsigned long *)attach) = TEST_VAL; - - fflush(0); - _exit(0); - } else { - /* Parent process */ - ret = waitpid(pid, &status, 0); - INTERR(ret == -1, "waitpid failed\n"); - - OKNG(*((unsigned long *)mem) == TEST_VAL, - "TEST_VAL found\n"); - - ret = xpmem_remove(segid); - OKNG(ret != -1, "xpmem_remove in parent\n"); - } - - printf("*** %s PASSED\n\n", basename(argv[0])); - return 0; - -out: - printf("*** %s FAILED\n\n", basename(argv[0])); - - return -1; -} diff --git a/test/issues/1473/XTP_006.c b/test/issues/1473/XTP_006.c deleted file mode 100644 index bf919236..00000000 --- a/test/issues/1473/XTP_006.c +++ /dev/null @@ -1,62 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "util.h" -#include "okng.h" - -int main(int argc, char **argv) -{ - void *mem; - int ret = 0; - pid_t pid; - xpmem_segid_t segid; - xpmem_apid_t apid; - - printf("*** %s start ***\n", basename(argv[0])); - - mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | - MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); - INTERR(mem == NULL, "mmap failed\n"); - memset(mem, 0, SZ_MEM); - - INTERR(ret != 0, "xpmem_init failed\n"); - - segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); - OKNG(segid != -1, "xpmem_make\n"); - - fflush(0); - pid = fork(); - INTERR(pid == -1, "fork failed\n"); - - if (pid == 0) { - /* Child process */ - sleep(1); /* wait for parent process exit */ - apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); - OKNG(apid == -1, - "xpmem_get in child failed as expected because parent process exited already\n"); - fflush(0); - - } else { - /* Parent process */ - _exit(0); - } - - printf("*** %s PASSED\n\n", basename(argv[0])); - return 0; - -out: - printf("*** %s FAILED\n\n", basename(argv[0])); - - return -1; -} diff --git a/test/issues/1473/XTP_007.c b/test/issues/1473/XTP_007.c deleted file mode 100644 index cf99f1e6..00000000 --- a/test/issues/1473/XTP_007.c +++ /dev/null @@ -1,91 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "util.h" -#include "okng.h" - -#define BAD_ADDRESS ((void *)-1) - -int main(int argc, char **argv) -{ - void *mem, *attach; - int ret = 0; - int status; - pid_t pid; - xpmem_segid_t segid; - xpmem_apid_t apid; - struct xpmem_addr addr; - - printf("*** %s start ***\n", basename(argv[0])); - - mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | - MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); - INTERR(mem == NULL, "mmap failed\n"); - memset(mem, 0, SZ_MEM); - - INTERR(ret != 0, "xpmem_init failed\n"); - - segid = xpmem_make(BAD_ADDRESS, SZ_MEM, XPMEM_PERMIT_MODE, - (void *)0666); - OKNG(segid == -1, - "xpmem_make with invalid address failed as expected\n"); - - segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); - INTERR(segid == -1, "xpmem_make failed\n"); - - segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); - OKNG(segid != -1, "duplicated xpmem_make call succeeded as expected\n"); - - fflush(0); - pid = fork(); - INTERR(pid == -1, "fork failed\n"); - - if (pid == 0) { - /* Child process */ - apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); - INTERR(apid == -1, "xpmem_get in child failed\n"); - - addr.apid = apid; - addr.offset = 0; - attach = xpmem_attach(addr, SZ_MEM, NULL); - INTERR(attach == (void *)-1, - "xpmem_attach in child failed\n"); - - *((unsigned long *)attach) = TEST_VAL; - - ret = xpmem_detach(attach); - INTERR(ret == -1, "xpmem_detach in child failed\n"); - - fflush(0); - _exit(0); - } else { - /* Parent process */ - ret = waitpid(pid, &status, 0); - INTERR(ret == -1, "waitpid failed\n"); - - INTERR(*((unsigned long *)mem) != TEST_VAL, - "TEST_VAL not found\n"); - - ret = xpmem_remove(segid); - INTERR(ret == -1, "xpmem_remove failed\n"); - } - - printf("*** %s PASSED\n\n", basename(argv[0])); - return 0; - -out: - printf("*** %s FAILED\n\n", basename(argv[0])); - - return -1; -} diff --git a/test/issues/1473/XTP_008.c b/test/issues/1473/XTP_008.c deleted file mode 100644 index 4ca56a02..00000000 --- a/test/issues/1473/XTP_008.c +++ /dev/null @@ -1,91 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "util.h" -#include "okng.h" - -#define BAD_SEGID -1 - -int main(int argc, char **argv) -{ - void *mem, *attach; - int ret = 0; - int status; - pid_t pid; - xpmem_segid_t segid; - xpmem_apid_t apid; - struct xpmem_addr addr; - - printf("*** %s start ***\n", basename(argv[0])); - - mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | - MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); - INTERR(mem == NULL, "mmap failed\n"); - memset(mem, 0, SZ_MEM); - - INTERR(ret != 0, "xpmem_init failed\n"); - - segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); - INTERR(segid == -1, "xpmem_make failed\n"); - - fflush(0); - pid = fork(); - INTERR(pid == -1, "fork failed\n"); - - if (pid == 0) { - /* Child process */ - apid = xpmem_get(BAD_SEGID, XPMEM_RDWR, XPMEM_PERMIT_MODE, - NULL); - OKNG(apid == -1, - "xpmem_get with invalid segid failed as expected\n"); - - apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); - INTERR(apid == -1, "xpmem_get in child failed\n"); - - apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); - OKNG(apid != -1, - "duplicated xpmem_get succeeded as expected\n"); - - addr.apid = apid; - addr.offset = 0; - attach = xpmem_attach(addr, SZ_MEM, NULL); - INTERR(attach == (void *)-1, "xpmem_attach in child failed\n"); - - *((unsigned long *)attach) = TEST_VAL; - - ret = xpmem_detach(attach); - INTERR(ret == -1, "xpmem_detach in child failed\n"); - - fflush(0); - _exit(0); - } else { - /* Parent process */ - ret = waitpid(pid, &status, 0); - INTERR(ret == -1, "waitpid failed\n"); - - INTERR(*((unsigned long *)mem) != TEST_VAL, - "TEST_VAL not found\n"); - - ret = xpmem_remove(segid); - INTERR(ret == -1, "xpmem_remove failed\n"); - } - - printf("*** %s PASSED\n\n", basename(argv[0])); - return 0; - -out: - printf("*** %s FAILED\n\n", basename(argv[0])); - - return -1; -} diff --git a/test/issues/1473/XTP_009.c b/test/issues/1473/XTP_009.c deleted file mode 100644 index 40b569d0..00000000 --- a/test/issues/1473/XTP_009.c +++ /dev/null @@ -1,92 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "util.h" -#include "okng.h" - -int main(int argc, char **argv) -{ - void *mem, *attach; - int ret = 0; - int status; - pid_t pid; - xpmem_segid_t segid; - xpmem_apid_t apid; - struct xpmem_addr addr; - - printf("*** %s start ***\n", basename(argv[0])); - - mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | - MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); - INTERR(mem == NULL, "mmap failed\n"); - memset(mem, 0, SZ_MEM); - - INTERR(ret != 0, "xpmem_init failed\n"); - - segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); - INTERR(segid == -1, "xpmem_make failed\n"); - - fflush(0); - pid = fork(); - INTERR(pid == -1, "fork failed\n failed\n"); - - if (pid == 0) { - /* Child process */ - apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); - INTERR(apid == -1, "xpmem_get in child failed\n"); - - addr.apid = -1; - addr.offset = 0; - attach = xpmem_attach(addr, SZ_MEM, NULL); - OKNG(attach == (void *)-1, - "xpmem_attach with invalid apid failed as expected\n"); - - addr.apid = apid; - addr.offset = 0; - attach = xpmem_attach(addr, SZ_MEM, NULL); - INTERR(attach == (void *)-1, "xpmem_attach in child failed\n"); - - addr.apid = apid; - addr.offset = 0; - attach = xpmem_attach(addr, SZ_MEM, NULL); - OKNG(attach != (void *)-1, - "duplicated xpmem_attach call succeeded as expected\n"); - - *((unsigned long *)attach) = TEST_VAL; - - ret = xpmem_detach(attach); - INTERR(ret == -1, "xpmem_detach in child failed\n"); - - fflush(0); - _exit(0); - } else { - /* Parent process */ - ret = waitpid(pid, &status, 0); - INTERR(ret == -1, "waitpid failed\n"); - - INTERR(*((unsigned long *)mem) != TEST_VAL, - "TEST_VAL not found\n"); - - ret = xpmem_remove(segid); - INTERR(ret == -1, "xpmem_remove failed\n"); - } - - printf("*** %s PASSED\n\n", basename(argv[0])); - return 0; - -out: - printf("*** %s FAILED\n\n", basename(argv[0])); - - return -1; -} diff --git a/test/issues/1473/XTP_010.c b/test/issues/1473/XTP_010.c deleted file mode 100644 index af412f0f..00000000 --- a/test/issues/1473/XTP_010.c +++ /dev/null @@ -1,88 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "util.h" -#include "okng.h" - -#define BAD_ADDRESS ((void *) -1) - -int main(int argc, char **argv) -{ - void *mem, *attach; - int ret = 0; - int status; - pid_t pid; - xpmem_segid_t segid; - xpmem_apid_t apid; - struct xpmem_addr addr; - - printf("*** %s start ***\n", basename(argv[0])); - - mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | - MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); - INTERR(mem == NULL, "mmap failed\n"); - memset(mem, 0, SZ_MEM); - - segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); - INTERR(segid == -1, "xpmem_make failed\n"); - - fflush(0); - pid = fork(); - INTERR(pid == -1, "fork failed\n"); - - if (pid == 0) { - /* Child process */ - apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); - INTERR(apid == -1, "xpmem_get in child failed\n"); - - addr.apid = apid; - addr.offset = 0; - attach = xpmem_attach(addr, SZ_MEM, NULL); - INTERR(attach == (void *)-1, "xpmem_attach in child failed\n"); - - *((unsigned long *)attach) = TEST_VAL; - - ret = xpmem_detach(BAD_ADDRESS); - OKNG(ret != -1, - "xpmem_detach with invalid address succeeded as expected\n"); - - ret = xpmem_detach(attach); - INTERR(ret == -1, "xpmem_detach in child failed\n"); - - ret = xpmem_detach(attach); - OKNG(ret != -1, - "duplicated xpmem_detach succeeded as expected\n"); - - fflush(0); - _exit(0); - } else { - /* Parent process */ - ret = waitpid(pid, &status, 0); - INTERR(ret == -1, "waitpid failed\n"); - - INTERR(*((unsigned long *)mem) != TEST_VAL, - "TEST_VAL not found\n"); - - ret = xpmem_remove(segid); - INTERR(ret == -1, "xpmem_remove failed\n"); - } - - printf("*** %s PASSED\n\n", basename(argv[0])); - return 0; - -out: - printf("*** %s FAILED\n\n", basename(argv[0])); - - return -1; -} diff --git a/test/issues/1473/XTP_011.c b/test/issues/1473/XTP_011.c deleted file mode 100644 index ac232c58..00000000 --- a/test/issues/1473/XTP_011.c +++ /dev/null @@ -1,90 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "util.h" -#include "okng.h" - -#define BAD_SEGID -1 - -int main(int argc, char **argv) -{ - void *mem, *attach; - int ret = 0; - int status; - pid_t pid; - xpmem_segid_t segid; - xpmem_apid_t apid; - struct xpmem_addr addr; - - printf("*** %s start ***\n", basename(argv[0])); - - mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | - MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); - INTERR(mem == NULL, "mmap failed\n"); - memset(mem, 0, SZ_MEM); - - INTERR(ret != 0, "xpmem_init failed\n"); - - segid = xpmem_make(mem, SZ_MEM, XPMEM_PERMIT_MODE, (void *)0666); - INTERR(segid == -1, "xpmem_make failed\n"); - - fflush(0); - pid = fork(); - INTERR(pid == -1, "fork failed\n"); - - if (pid == 0) { - /* Child process */ - apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); - INTERR(apid == -1, "xpmem_get in child failed\n"); - - addr.apid = apid; - addr.offset = 0; - attach = xpmem_attach(addr, SZ_MEM, NULL); - INTERR(attach == (void *)-1, "xpmem_attach in child failed\n"); - - *((unsigned long *)attach) = TEST_VAL; - - ret = xpmem_detach(attach); - INTERR(ret == -1, "xpmem_detach in child failed\n"); - - fflush(0); - _exit(0); - } else { - /* Parent process */ - ret = waitpid(pid, &status, 0); - INTERR(ret == -1, "waitpid failed\n"); - - INTERR(*((unsigned long *)mem) != TEST_VAL, - "TEST_VAL not found\n"); - - ret = xpmem_remove(BAD_SEGID); - OKNG(ret == -1, - "xpmem_remove with invalid segid failed as expected\n"); - - ret = xpmem_remove(segid); - INTERR(ret == -1, "xpmem_remove failed\n"); - - ret = xpmem_remove(segid); - OKNG(ret == -1, - "duplicated xpmem_remove call failed as expected\n"); - } - - printf("*** %s PASSED\n\n", basename(argv[0])); - return 0; - -out: - printf("*** %s FAILED\n\n", basename(argv[0])); - - return -1; -} diff --git a/test/issues/1473/aarch64.conf b/test/issues/1473/aarch64.conf deleted file mode 100644 index e6b1d061..00000000 --- a/test/issues/1473/aarch64.conf +++ /dev/null @@ -1,3 +0,0 @@ -PGSHIFT_LIST="16 21 29" -PAGE_SIZE=65536 -PAGE_SHIFT=16 diff --git a/test/issues/1473/common.sh.in b/test/issues/1473/common.sh.in deleted file mode 100644 index f1482074..00000000 --- a/test/issues/1473/common.sh.in +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/sh - -# define WORKDIR expecting this script is on /data/scripts/ -SCRIPT_PATH=$(readlink -m "${BASH_SOURCE[0]}") -AUTOTEST_HOME="${SCRIPT_PATH%/*/*/*/*}" -if [[ -e ${AUTOTEST_HOME}/bin/config.sh ]]; then - . ${AUTOTEST_HOME}/bin/config.sh -else - WORKDIR=$(pwd) -fi - -arch=`uname -p` -if [ -f @CMAKE_INSTALL_PREFIX@/etc/${arch}.conf ]; then - . @CMAKE_INSTALL_PREFIX@/etc/${arch}.conf -else - echo "unknown arch: $1" - exit 1 -fi - diff --git a/test/issues/1473/huge_page_xpmem.c b/test/issues/1473/huge_page_xpmem.c deleted file mode 100644 index 02530f4c..00000000 --- a/test/issues/1473/huge_page_xpmem.c +++ /dev/null @@ -1,190 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "util.h" -#include "okng.h" - -#define DEBUG - -#define SHM_SIZE (1UL << 12) - -#define MAP_HUGE_SHIFT 26 -#define KEYWORD 0x12345678UL - -void usage(void) -{ - printf("Usage: huge_page_map: \n"); - printf("\tpgshift : pageshift of map area (Using MAP_HUGETLB)\n"); - printf("\t -1 means using small pagesize\n"); - printf("\tpgnum : number of page of map area\n"); - printf("\tpgoffset: offset of last page\n"); -} - - -void *mmap_flag(size_t mapsize, int page_shift) -{ - char *addr_mmap; - int flags = MAP_ANONYMOUS | MAP_PRIVATE; - - if (page_shift >= 0) { - /* mean use MAP_HUGETLB */ - flags |= MAP_HUGETLB | (page_shift << MAP_HUGE_SHIFT); - } - - addr_mmap = mmap(0, mapsize, - PROT_READ | PROT_WRITE, - flags, -1, 0); - - return addr_mmap; -} - -int main(int argc, char **argv) -{ - void *mem; - int ret = 0; - pid_t pid; - int status; - key_t key = ftok(argv[0], 0); - void *shm; - int shmid; - xpmem_segid_t segid; - struct shmid_ds shmctl_buf; - int pgshift, pgnum; - size_t pgsize, map_size, pgoffset; - - if (argc < 4) { - printf("Err: Too few arguments\n"); - usage(); - return -1; - } - - pgshift = atoi(argv[1]); - pgnum = atoi(argv[2]); - pgoffset = atol(argv[3]); - if (pgshift > 0) { - pgsize = (1UL << pgshift); - } else { - pgsize = getpagesize(); - } - - if (pgoffset > 0) { - map_size = (pgsize * (pgnum - 1)) + pgoffset; - } else { - map_size = pgsize * pgnum; - } - INFO("map_size: %lx\n", map_size); - - shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0660); - INTERR(shmid == -1, "shmget failed: %s\n", - strerror(errno)); - - printf("EXPECT_PAGE_SIZE: 0x%lx\n", pgsize); - fflush(stdout); - - pid = fork(); - INTERR(pid == -1, "fork failed\n"); - if (pid == 0) { - xpmem_apid_t apid; - struct xpmem_addr addr; - void *attach; - - shm = shmat(shmid, NULL, 0); - INTERR(shm == (void *)-1, - "shmat failed: %s\n", strerror(errno)); - - INFO("child: wait until segid is posted\n"); - while ((segid = *(xpmem_segid_t *)shm) == 0) { - sched_yield(); - }; - - INFO("child: segid: %lx\n", (unsigned long)segid); - - ret = shmdt(shm); - INTERR(ret == -1, "shmdt failed\n"); - - apid = xpmem_get(segid, XPMEM_RDWR, - XPMEM_PERMIT_MODE, NULL); - INTERR(apid == -1, "xpmem_get failed: %s\n", - strerror(errno)); - - addr.apid = apid; - addr.offset = 0; - attach = xpmem_attach(addr, map_size, NULL); - - INTERR(attach == (void *)-1, - "xpmem_attach failed: %s\n", strerror(errno)); - - printf("child: xpmem_attachment_addr: %lx\n", - (unsigned long)attach); - - *((unsigned long *)attach) = KEYWORD; - if (pgnum > 1 && pgshift > 0) { - *((unsigned long *)(attach + - (1UL << pgshift))) = KEYWORD; - } - *((unsigned long *)(attach + map_size - - sizeof(unsigned long *))) = KEYWORD; - - ret = xpmem_detach(attach); - INTERR(ret == -1, "xpmem_detach failed\n"); - - exit(0); - } else { - mem = mmap_flag(map_size, pgshift); - INTERR(mem == MAP_FAILED, "mmap failed\n"); - INFO("parent: anonymous_map_addr: %lx - %lx\n", - (unsigned long)mem, (unsigned long)(mem + map_size)); - - shm = shmat(shmid, NULL, 0); - - INTERR(shm == (void *)-1, - "shmat failed: %s\n", strerror(errno)); - - segid = xpmem_make(mem, map_size, XPMEM_PERMIT_MODE, - (void *)0666); - INTERR(segid == -1, - "xpmem_ioctl failed: %s\n", strerror(errno)); - - INFO("parent: posting segid of %lx\n", (unsigned long)segid); - *(xpmem_segid_t *)shm = segid; - - ret = waitpid(pid, &status, 0); - INTERR(ret == -1, "waitpid failed\n"); - - ret = shmctl(shmid, IPC_RMID, &shmctl_buf); - INTERR(ret == -1, "shmctl failed\n"); - - ret = shmdt(shm); - INTERR(ret == -1, "shmdt failed\n"); - - OKNG(*(unsigned long *)mem == KEYWORD, - "HEAD of xpmem area is shared\n"); - if (pgnum > 1 && pgshift > 0) { - OKNG(*((unsigned long *)(mem + - (1UL << pgshift))) == KEYWORD, - "MIDDLE of xpmem area is shared\n"); - } - OKNG(*((unsigned long *)(mem + map_size - - sizeof(unsigned long *))) == KEYWORD, - "TAIL of xpmem area is shared\n"); - printf("xpmem area is shared: OK\n"); - - ret = xpmem_remove(segid); - INTERR(ret == -1, "xpmem_remove failed\n"); - } - - ret = 0; - out: - return ret; -} diff --git a/test/issues/1473/ihk_kmsg_size.patch b/test/issues/1473/ihk_kmsg_size.patch deleted file mode 100644 index 17c210a2..00000000 --- a/test/issues/1473/ihk_kmsg_size.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git linux/include/ihk/ihk_debug.h linux/include/ihk/ihk_debug.h -index 9b53dd7..305a3a9 100644 ---- linux/include/ihk/ihk_debug.h -+++ linux/include/ihk/ihk_debug.h -@@ -8,7 +8,7 @@ - #ifndef IHK_DEBUG_H_INCLUDED - #define IHK_DEBUG_H_INCLUDED - --#define IHK_KMSG_SIZE 8192 -+#define IHK_KMSG_SIZE (4UL<<20) - #define IHK_KMSG_HIGH_WATER_MARK (IHK_KMSG_SIZE / 2) - #define IHK_KMSG_NOTIFY_DELAY 400 /* Unit is us, 400 us would avoid overloading fwrite of ihkmond */ - diff --git a/test/issues/1473/large_page.patch b/test/issues/1473/large_page.patch deleted file mode 100644 index f3df2f16..00000000 --- a/test/issues/1473/large_page.patch +++ /dev/null @@ -1,117 +0,0 @@ -diff --git arch/arm64/kernel/memory.c arch/arm64/kernel/memory.c -index a84bc21..f329fcf 100644 ---- arch/arm64/kernel/memory.c -+++ arch/arm64/kernel/memory.c -@@ -2701,6 +2701,16 @@ int set_range_l1(void *args0, pte_t *ptep, uintptr_t base, uintptr_t start, - ptl1_set(ptep, pte); - - error = 0; -+ -+ if (args->attr[0] & PTE_CONT && -+ __page_offset(base, PTL1_CONT_SIZE) == 0) { -+ kprintf("%s: large_page_allocation, addr: %016lx, size: 0x%lx , phys: %lx\n", -+ __func__, base, PTL1_CONT_SIZE, phys); -+ if (args->range->private_data) -+ kprintf("%s: xpmem_page_attach, addr: %016lx, size: 0x%lx\n", -+ __func__, base, PTL1_CONT_SIZE); -+ } -+ - // call memory_stat_rss_add() here because pgshift is resolved here - if (!(args->attr[0] & PTE_CONT)) { - if (rusage_memory_stat_add(args->range, phys, -@@ -2810,6 +2820,23 @@ retry: - level); - - error = 0; -+ -+ if (args->attr[level-1] & PTE_CONT) { -+ if (__page_offset(base, tbl.cont_pgsize) == 0) { -+ kprintf("%s: large_page_allocation, addr: %016lx, size: 0x%lx , phys: %lx\n", -+ __func__, base, tbl.cont_pgsize, phys); -+ if (args->range->private_data) -+ kprintf("%s: xpmem_page_attach, addr: %016lx, size: 0x%lx\n", -+ __func__, base, tbl.cont_pgsize); -+ } -+ } else { -+ kprintf("%s: large_page_allocation, addr: %016lx, size: 0x%lx , phys: %lx\n", -+ __func__, base, tbl.pgsize, phys); -+ if (args->range->private_data) -+ kprintf("%s: xpmem_page_attach, addr: %016lx, size: 0x%lx\n", -+ __func__, base, tbl.pgsize); -+ } -+ - dkprintf("set_range_middle(%lx,%lx,%lx,%d):" - "large page. %d %lx\n", - base, start, end, level, error, *ptep); -diff --git arch/x86_64/kernel/memory.c arch/x86_64/kernel/memory.c -index 6b34036..4ca3a1a 100644 ---- arch/x86_64/kernel/memory.c -+++ arch/x86_64/kernel/memory.c -@@ -1932,6 +1932,13 @@ retry: - dkprintf("set_range_l2(%lx,%lx,%lx):" - "2MiB page. %d %lx\n", - base, start, end, error, *ptep); -+ -+ kprintf("%s: large_page_allocation, addr: %016lx, size: 0x%lx\n", -+ __func__, base, PTL2_SIZE); -+ if (args->range->private_data) -+ kprintf("%s: xpmem_page_attach, addr: %016lx, size: 0x%lx\n", -+ __func__, base, PTL2_SIZE); -+ - // Call memory_stat_rss_add() here because pgshift is resolved here - if (rusage_memory_stat_add(args->range, phys, PTL2_SIZE, PTL2_SIZE)) { - dkprintf("%lx+,%s: calling memory_stat_rss_add(),base=%lx,phys=%lx,size=%ld,pgsize=%ld\n", phys, __FUNCTION__, base, phys, PTL2_SIZE, PTL2_SIZE); -@@ -2021,6 +2028,12 @@ retry: - "1GiB page. %d %lx\n", - base, start, end, error, *ptep); - -+ kprintf("%s: large_page_allocation, addr: %016lx, size: 0x%lx\n", -+ __func__, base, PTL3_SIZE); -+ if (args->range->private_data) -+ kprintf("%s: xpmem_page_attach, addr: %016lx, size: 0x%lx\n", -+ __func__, base, PTL3_SIZE); -+ - // Call memory_stat_rss_add() here because pgshift is resolved here - if (rusage_memory_stat_add(args->range, phys, PTL3_SIZE, PTL3_SIZE)) { - dkprintf("%lx+,%s: calling memory_stat_rss_add(),base=%lx,phys=%lx,size=%ld,pgsize=%ld\n", phys, __FUNCTION__, base, phys, PTL3_SIZE, PTL3_SIZE); -diff --git kernel/process.c kernel/process.c -index 1624726..d867b4d 100644 ---- kernel/process.c -+++ kernel/process.c -@@ -2138,6 +2138,12 @@ retry: - } - - dkprintf("%s: attr=%x\n", __FUNCTION__, attr); -+ -+ if (pgsize > PAGE_SIZE) { -+ kprintf("large_page_allocation, addr: %016lx, size: %d, phys: %lx\n", -+ pgaddr, pgsize, phys); -+ } -+ - error = ihk_mc_pt_set_pte(vm->address_space->page_table, ptep, - pgsize, phys, attr); - if (error) { -diff --git kernel/xpmem.c kernel/xpmem.c -index 9fedf26..a0a7990 100644 ---- kernel/xpmem.c -+++ kernel/xpmem.c -@@ -490,6 +490,7 @@ static int xpmem_make( - *segid_p = segid; - - XPMEM_DEBUG("return: ret=%d, segid=0x%lx", 0, *segid_p); -+ kprintf("%s: DONE\n", __func__); - - return 0; - } -@@ -1886,6 +1887,11 @@ static int _xpmem_fault_process_memory_range( - goto out; - } - -+ if (att_pgsize == PAGE_SIZE) { -+ kprintf("xpmem_page_attach, addr: %016lx, size: 0x%lx\n", -+ vaddr, att_pgsize); -+ } -+ - XPMEM_DEBUG("att_pgaddr: %lx, att_pgsize: %lx, " - "seg_vaddr: %lx, seg_pgsize: %lx, seg_phys: %lx\n", - att_pgaddr, att_pgsize, seg_vaddr, diff --git a/test/issues/1473/multi_vmr_xpmem.c b/test/issues/1473/multi_vmr_xpmem.c deleted file mode 100644 index 66438577..00000000 --- a/test/issues/1473/multi_vmr_xpmem.c +++ /dev/null @@ -1,199 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "util.h" -#include "okng.h" - -#define DEBUG - -#define SHM_SIZE (1UL << 12) - -#define MAP_HUGE_SHIFT 26 -#define KEYWORD 0x12345678UL - -void usage(void) -{ - printf("Usage: multi_vmr_xpmem: \n"); - printf("\tpgshift : pageshift of map area (Using MAP_HUGETLB)\n"); - printf("\t -1 means using small pagesize\n"); - printf("\tpgnum : number of page of map area\n"); -} - - -void *mmap_flag(size_t mapsize, int page_shift) -{ - char *addr_mmap; - int flags = MAP_ANONYMOUS | MAP_PRIVATE; - - if (page_shift >= 0) { - /* mean use MAP_HUGETLB */ - flags |= MAP_HUGETLB | (page_shift << MAP_HUGE_SHIFT); - } - - addr_mmap = mmap(0, mapsize * 2, - PROT_READ | PROT_WRITE, - flags, -1, 0); - - /* Make sure that area before addr_map is available to - * MAP_FIXED map - */ - return addr_mmap + mapsize; -} - -int main(int argc, char **argv) -{ - void *mem, *mem_1, *mem_2; - int ret = 0; - pid_t pid; - int status; - key_t key = ftok(argv[0], 10); - void *shm; - int shmid; - xpmem_segid_t segid; - struct shmid_ds shmctl_buf; - int pgshift, pgnum; - size_t extr_size, pgsize, map_size; - - if (argc < 3) { - printf("Err: Too few arguments\n"); - usage(); - return -1; - } - - pgshift = atoi(argv[1]); - pgnum = atoi(argv[2]); - extr_size = getpagesize() * 3; - if (pgshift > 0) { - pgsize = (1UL << pgshift); - } else { - pgsize = getpagesize(); - } - - map_size = pgsize * pgnum; - - shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0660); - INTERR(shmid == -1, "shmget failed: %s\n", - strerror(errno)); - - printf("EXPECT_PAGE_SIZE: 0x%lx\n", pgsize); - fflush(stdout); - - pid = fork(); - INTERR(pid == -1, "fork failed\n"); - if (pid == 0) { - xpmem_apid_t apid; - struct xpmem_addr addr; - void *attach; - - shm = shmat(shmid, NULL, 0); - INTERR(shm == (void *)-1, - "shmat failed: %s\n", strerror(errno)); - - INFO("child: wait until segid is posted\n"); - while ((segid = *(xpmem_segid_t *)shm) == 0) { - sched_yield(); - }; - - INFO("child: segid: %lx\n", (unsigned long)segid); - - ret = shmdt(shm); - INTERR(ret == -1, "shmdt failed\n"); - - apid = xpmem_get(segid, XPMEM_RDWR, - XPMEM_PERMIT_MODE, NULL); - INTERR(apid == -1, "xpmem_get failed: %s\n", - strerror(errno)); - - addr.apid = apid; - addr.offset = 0; - printf("child: attaching...\n"); - attach = xpmem_attach(addr, map_size + (extr_size * 2), NULL); - - INTERR(attach == (void *)-1, - "xpmem_attach failed: %s\n", strerror(errno)); - - printf("child: xpmem_attachment_addr: %lx - %lx\n", - (unsigned long)attach, - (unsigned long)(attach + map_size + (extr_size * 2))); - printf("child: xpmem_large: %lx\n", - (unsigned long)(attach + extr_size)); - - *((unsigned long *)attach) = KEYWORD; - *((unsigned long *)(attach + extr_size)) = KEYWORD; - *((unsigned long *)(attach + extr_size * 2 + map_size - - sizeof(unsigned long *))) = KEYWORD; - - ret = xpmem_detach(attach); - INTERR(ret == -1, "xpmem_detach failed\n"); - - exit(0); - } else { - mem = mmap_flag(map_size, pgshift); - INTERR(mem == MAP_FAILED, "mmap failed\n"); - mem_1 = mmap(mem - extr_size, extr_size, - PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, - -1, 0); - mem_2 = mmap(mem + map_size, extr_size, - PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, - -1, 0); - if ((mem_1 + extr_size != mem) || (mem_2 != mem + map_size)) { - printf("vm_range is NOT contignuous!!\n"); - exit(1); - } - INFO("parent: anonymous_map_addr: %lx - %lx\n", - (unsigned long)mem_1, - (unsigned long)(mem_2 + extr_size)); - - shm = shmat(shmid, NULL, 0); - - INTERR(shm == (void *)-1, - "shmat failed: %s\n", strerror(errno)); - - segid = xpmem_make(mem_1, map_size + (extr_size * 2), - XPMEM_PERMIT_MODE, (void *)0666); - INTERR(segid == -1, - "xpmem_ioctl failed: %s\n", strerror(errno)); - - INFO("parent: posting segid of %lx\n", (unsigned long)segid); - *(xpmem_segid_t *)shm = segid; - - ret = waitpid(pid, &status, 0); - printf("child exited\n"); - INTERR(ret == -1, "waitpid failed\n"); - - ret = shmctl(shmid, IPC_RMID, &shmctl_buf); - INTERR(ret == -1, "shmctl failed\n"); - - ret = shmdt(shm); - INTERR(ret == -1, "shmdt failed\n"); - - OKNG(*(unsigned long *)mem_1 == KEYWORD, - "HEAD of xpmem area is shared\n"); - OKNG(*(unsigned long *)mem == KEYWORD, - "MIDDLE of xpmem area is shared\n"); - OKNG(*((unsigned long *)(mem_2 + extr_size - - sizeof(unsigned long *))) == KEYWORD, - "TAIL of xpmem area is shared\n"); - printf("xpmem area is shared: OK\n"); - - ret = xpmem_remove(segid); - INTERR(ret == -1, "xpmem_remove failed\n"); - } - - ret = 0; - out: - return ret; -} diff --git a/test/issues/1473/okng.h b/test/issues/1473/okng.h deleted file mode 100644 index 27fdd697..00000000 --- a/test/issues/1473/okng.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef __OKNG_H_INCLUDED__ -#define __OKNG_H_INCLUDED__ - -#include - -#define _OKNG(verb, jump, cond, fmt, args...) do { \ - if (cond) { \ - if (verb) \ - printf("[ OK ] " fmt, ##args); \ - } else { \ - printf("[ NG ] " fmt, ##args); \ - if (jump) { \ - ret = 1; \ - goto out; \ - } \ - } \ -} while (0) - -#define OKNG(args...) _OKNG(1, 1, ##args) -#define INFO(fmt, args...) printf("[ INFO ] " fmt, ##args) -#define START(fmt, args...) printf("[ START] " fmt, ##args) -#define INTERR(cond, fmt, args...) do { \ - if (cond) { \ - char msg[4096]; \ - sprintf(msg, fmt, ##args); \ - printf("[INTERR] %s:%d %s", __FILE__, __LINE__, msg); \ - ret = 1; \ - goto out; \ - } \ -} while (0) - -#endif diff --git a/test/issues/1473/util.h b/test/issues/1473/util.h deleted file mode 100644 index 80ee28e6..00000000 --- a/test/issues/1473/util.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifdef __aarch64__ -#define LARGE_PAGE_SHIFT 21 -#elif defined(__x86_64__) -#define LARGE_PAGE_SHIFT 21 -#else -#error "Non-compliant architecture." -#endif - -#define MAP_HUGE_SHIFT 26 -#define SZ_MEM (2 * (1ULL << LARGE_PAGE_SHIFT)) -#define TEST_VAL 0x1129 diff --git a/test/issues/1473/util.sh.in b/test/issues/1473/util.sh.in deleted file mode 100644 index 05b8a828..00000000 --- a/test/issues/1473/util.sh.in +++ /dev/null @@ -1,122 +0,0 @@ -function patch_and_build() -{ - fn_mckernel=$1 - fn_ihk=$2 - - if [ "$fn_mckernel" != "" ]; then - pushd @WITH_MCK_SRC@ - patch -p0 < @CMAKE_INSTALL_PREFIX@/bin/${fn_mckernel}.patch - ret=$? - if [ $ret -ne 0 ]; then - echo "[INTERR] patch failed" - patch -p0 -R < @CMAKE_INSTALL_PREFIX@/bin/${fn_mckernel}.patch - return $ret - fi - popd - fi - - if [ "$fn_ihk" != "" ]; then - pushd @WITH_MCK_SRC@/ihk - patch -p0 < @CMAKE_INSTALL_PREFIX@/bin/${fn_ihk}.patch - ret=$? - if [ $ret -ne 0 ]; then - echo "[INTERR] patch failed" - patch -p0 -R < @CMAKE_INSTALL_PREFIX@/bin/${fn_ihk}.patch - return $ret - fi - popd - fi - - if [ -f ${AUTOTEST_HOME}/bin/config.sh ]; then - BUILDDIR=$WORKDIR/build/$(uname -r) - else - BUILDDIR=@WITH_MCK_BUILD@ - fi - - pushd $BUILDDIR - make -j install - popd - - if [ "$fn_mckernel" != "" ]; then - pushd @WITH_MCK_SRC@ - patch -R -p0 < @CMAKE_INSTALL_PREFIX@/bin/${fn_mckernel}.patch - popd - fi - - if [ "$fn_ihk" != "" ]; then - pushd @WITH_MCK_SRC@/ihk - patch -R -p0 < @CMAKE_INSTALL_PREFIX@/bin/${fn_ihk}.patch - popd - fi - - return 0 -} - -function detect_cpu_model() -{ - implementer=$(gawk '/CPU implementer/ { print $4; exit; }' /proc/cpuinfo) - arch=$(gawk '/CPU architecture/ { print $3; exit; }' /proc/cpuinfo) - var=$(gawk '/CPU variant/ { print $4; exit; }' /proc/cpuinfo) - part=$(gawk '/CPU part/ { print $4; exit; }' /proc/cpuinfo) - - if [[ "$implementer" == "0x46" ]] && [[ "$arch" == "8" ]] && - [[ "$var" == "0x1" ]] && [[ "$part" == "0x001" ]]; then - cpu_model="a64fx" - elif [[ "$implementer" == "0x43" ]] && [[ "$arch" == "8" ]] && - [[ "$var" == "0x1" ]] && [[ "$part" == "0x0a1" ]]; then - cpu_model="thunderx" - else - cpu_model="unknown" - fi -} - -function init_oom_killer() -{ - echo "[ INFO ] performing \"echo 0 > /proc/sys/vm/min_free_kbytes\"" - min_free_kbytes=$(cat /proc/sys/vm/min_free_kbytes) - sudo bash -c 'echo 0 > /proc/sys/vm/min_free_kbytes' -} - -function fini_oom_killer() -{ - echo "[ INFO ] performing \"echo $min_free_kbytes > /proc/sys/vm/min_free_kbytes\"" - sudo bash -c "echo $min_free_kbytes > /proc/sys/vm/min_free_kbytes" -} - -function check_dump() { - dump=$1 - interactive=$2 - - if [ $interactive -eq 1 ]; then - eclair_opt="-i" - else - eclair_opt= - fi - - expect -c " -set timeout 20 -spawn sudo @WITH_MCK@/bin/eclair -d ${dump} -k @WITH_MCK@/smp-arm64/kernel/mckernel.img -l $eclair_opt - -expect \"(eclair)\" -send \"set pagination 0\n\" - -expect \"(eclair)\" -send \"info threads\n\" - -expect \"(eclair)\" -send \"thread 3\n\" - -expect \"(eclair)\" -send \"bt\n\" - -expect \"(eclair)\" -send \"p/x _end\n\" - -expect \"(eclair)\" -send \"quit\n\" - -" > ${WORKDIR}/log - - awk -f @CMAKE_INSTALL_PREFIX@/bin/check_dump.awk ${WORKDIR}/log - ret=$? -} diff --git a/test/issues/1473/x86_64.conf b/test/issues/1473/x86_64.conf deleted file mode 100644 index 30168202..00000000 --- a/test/issues/1473/x86_64.conf +++ /dev/null @@ -1,3 +0,0 @@ -PGSHIFT_LIST=(21 30) -PAGE_SIZE=4096 -PAGE_SHIFT=12 diff --git a/test/issues/1473/xpmem_attach01.c b/test/issues/1473/xpmem_attach01.c deleted file mode 100644 index 3feb5804..00000000 --- a/test/issues/1473/xpmem_attach01.c +++ /dev/null @@ -1,143 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "okng.h" -#include "util.h" - -#define DEBUG - -#define MAP_HUGE_SHIFT 26 -#define MAGIC_HEAD 0x12345678UL -#define MAGIC_TAIL 0x9abcdef0UL - -int main(int argc, char **argv) -{ - int i; - void *mem; - int ret; - pid_t pid; - int status; - xpmem_segid_t segid; - int att_pgshift, seg_pgshift; - size_t att_pgsize, seg_pgsize; - - if (argc < 3) { - printf("Err: Too few arguments\n"); - printf("Usage: %s \n", - basename(argv[0])); - printf("\tpgshift : page-shift of attachment\n"); - printf("\tpgshift : page-shift of segment\n"); - return 1; - } - - seg_pgshift = atoi(argv[1]); - seg_pgsize = (1UL << seg_pgshift); - att_pgshift = atoi(argv[2]); - att_pgsize = (1UL << att_pgshift); - - INTERR(seg_pgsize > att_pgsize, - "seg_pgsize (%lx) > att_pgsize (%lx)\n", - seg_pgsize, att_pgsize); - - printf("parent: seg_pgsize: 0x%lx\n", seg_pgsize); - printf("parent: att_pgsize: 0x%lx\n", att_pgsize); - - mem = mmap(0, att_pgsize, - PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | - MAP_HUGETLB | (att_pgshift << MAP_HUGE_SHIFT), - -1, 0); - - INTERR(mem == MAP_FAILED, "mapping att_pgsize memory failed\n"); - printf("parent: anonymous_map_addr: %lx - %lx\n", - (unsigned long)mem, - (unsigned long)mem + att_pgsize); - - /* Create physically-contiguous maps with smaller page-size */ - for (i = 0; i < att_pgsize / seg_pgsize; i++) { - void *smaller; - void *addr = mem + i * seg_pgsize; - - smaller = mmap(addr, seg_pgsize, - PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, - -1, 0); - INTERR(smaller == MAP_FAILED, - "mapping seg_pgsize memory failed\n"); - - /* to distinguish from the large page at mem */ - if (i == 1) { - printf("parent: seg_addr: %lx\n", - (unsigned long)addr); - } - } - - segid = xpmem_make((void *)mem, - att_pgsize, XPMEM_PERMIT_MODE, (void *)0666); - INTERR(segid == -1, "xpmem_make: addr: %lx, size: %lx, error: %s\n", - (unsigned long)mem, att_pgsize, strerror(errno)); - - fflush(stdout); /* to prevent buffer from getting duplicated */ - - pid = fork(); - INTERR(pid == -1, "fork failed\n"); - - if (pid == 0) { - xpmem_apid_t apid; - struct xpmem_addr addr; - void *attach; - - apid = xpmem_get(segid, XPMEM_RDWR, - XPMEM_PERMIT_MODE, NULL); - OKNG(apid != -1, "apid: %lx\n", (unsigned long)apid); - - addr.apid = apid; - addr.offset = 0; - - INFO("child: attaching...\n"); - attach = xpmem_attach(addr, att_pgsize, NULL); - INTERR(attach == (void *)-1, - "xpmem_attach: size: %lx, error: %s\n", - att_pgsize, strerror(errno)); - - printf("child: att_addr: %lx\n", (unsigned long)attach); - - *((unsigned long *)attach) = MAGIC_HEAD; - *((unsigned long *)(attach + att_pgsize - - sizeof(unsigned long *))) = MAGIC_TAIL; - - ret = xpmem_detach(attach); - INTERR(ret == -1, "xpmem_detach failed\n"); - - exit(0); - } else { - INFO("parent: waiting...\n"); - ret = waitpid(pid, &status, 0); - INFO("parent: children found\n"); - INTERR(ret == -1, "waitpid failed\n"); - - OKNG(*(unsigned long *)mem == MAGIC_HEAD, - "HEAD of xpmem area is shared\n"); - OKNG(*((unsigned long *)(mem + att_pgsize - - sizeof(unsigned long *))) == - MAGIC_TAIL, "TAIL of xpmem area is shared\n"); - - ret = xpmem_remove(segid); - INTERR(ret == -1, "xpmem_remove failed\n"); - } - - ret = 0; - out: - return ret; -} diff --git a/test/issues/1473/xpmem_attach01.sh.in b/test/issues/1473/xpmem_attach01.sh.in deleted file mode 100644 index 815ede27..00000000 --- a/test/issues/1473/xpmem_attach01.sh.in +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/bash - -SCRIPT_PATH=$(readlink -m "${BASH_SOURCE[0]}") -SCRIPT_NAME="${SCRIPT_PATH##*/}" - -# prepare recorddir -. @CMAKE_INSTALL_PREFIX@/bin/common.sh -recorddir=$WORKDIR/output/$SCRIPT_NAME -[[ ! -d $recorddir ]] && mkdir -p $recorddir - -# define patch function -. @CMAKE_INSTALL_PREFIX@/bin/util.sh -patch_and_build large_page ihk_kmsg_size || exit 1 - -# boot patched McKernel -if [[ -e ${AUTOTEST_HOME}/bin/config.sh ]]; then - ${AUTOTEST_HOME}/bin/boot.sh reboot -else - . @WITH_MCK_SRC@/test/common.sh -fi - -sudo insmod @WITH_XPMEM@/lib/modules/`uname -r`/xpmem.ko -sudo chmod og+rw /dev/xpmem - -for seg_pgshift in $PGSHIFT_LIST; do - for att_pgshift in $PGSHIFT_LIST; do - if (( seg_pgshift < att_pgshift )); then - echo "seg_pgshift: $seg_pgshift, att_pgshift: $att_pgshift" - log_file=$recorddir/${SCRIPT_NAME%.sh}-${seg_pgshift}-${att_pgshift}.log - @WITH_MCK@/sbin/ihkosctl 0 clear_kmsg - @WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/xpmem_attach01 $seg_pgshift $att_pgshift | tee $log_file - @WITH_MCK@/sbin/ihkosctl 0 kmsg >> $log_file - - seg_addr=$(grep 'parent.*seg_addr' $log_file | awk '{ print $NF; }') - seg_pgsize=$(grep 'parent.*seg_pgsize' $log_file | awk '{ print $NF; }') - # note that showing DONE is done by the patch - seg_pgsize_kmsg=$(awk '!/DONE/{print $0} /DONE/{exit}' $log_file | grep -o "large_page_allocation.*${seg_addr}.*" | awk '{ print $5; }') - [[ "$seg_pgsize_kmsg" == "" ]] && seg_pgsize_kmsg=$PAGE_SIZE - - att_addr=$(grep 'child.*att_addr' $log_file | awk '{ print $NF; }') - att_pgsize_kmsg=$(grep -o "xpmem_page_attach.*${att_addr}.*" $log_file | awk '{ print $NF; }') - [[ "$att_pgsize_kmsg" == "" ]] && att_pgsize_kmsg=$PAGE_SIZE - - if (( seg_pgsize == seg_pgsize_kmsg )); then - printf "[ OK ] " - else - printf "[ NG ] " - let ng++ - fi - echo "page-size of $seg_addr: $seg_pgsize_kmsg, expected: $seg_pgsize" - - if (( att_pgsize_kmsg == seg_pgsize )); then - printf "[ OK ] " - else - printf "[ NG ] " - let ng++ - fi - echo "page-size of attachment at $att_addr: $att_pgsize_kmsg, expected: $seg_pgsize" - - fi - done -done - -sudo rmmod xpmem.ko - -exit $ng diff --git a/test/issues/1473/xpmem_attach02.c b/test/issues/1473/xpmem_attach02.c deleted file mode 100644 index 4e2f5f52..00000000 --- a/test/issues/1473/xpmem_attach02.c +++ /dev/null @@ -1,162 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "okng.h" -#include "util.h" - -#define DEBUG - -#define MAP_HUGE_SHIFT 26 -#define MAGIC_HEAD 0x12345678UL -#define MAGIC_MIDDLE 0x9abcdef0UL -#define MAGIC_TAIL 0x87654321UL - -int main(int argc, char **argv) -{ - int i; - int ret; - void *mem; - void *seg_addr; - size_t seg_size; - xpmem_segid_t segid; - pid_t pid; - int status; - int large_pgshift, small_pgshift; - size_t large_pgsize, small_pgsize; - - if (argc < 3) { - printf("Err: Too few arguments\n"); - printf("Usage: %s \n", - basename(argv[0])); - printf("\tpgshift : page-shift of head and tail part\n"); - printf("\tpgshift : page-shift of middle part\n"); - return 1; - } - - small_pgshift = atoi(argv[1]); - small_pgsize = (1UL << small_pgshift); - large_pgshift = atoi(argv[2]); - large_pgsize = (1UL << large_pgshift); - - INTERR(small_pgsize > large_pgsize, - "small_pgsize (%lx) > large_pgsize (%lx)\n", - small_pgsize, large_pgsize); - - printf("parent: small_pgsize: 0x%lx\n", small_pgsize); - printf("parent: large_pgsize: 0x%lx\n", large_pgsize); - - mem = mmap(0, 3 * large_pgsize, - PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | - MAP_HUGETLB | (large_pgshift << MAP_HUGE_SHIFT), - -1, 0); - - INTERR(mem == MAP_FAILED, "anonymous mmap failed\n"); - printf("parent: anonymous: addr: %lx, size: %lx\n", - (unsigned long)mem, 3 * large_pgsize); - - seg_addr = mem + large_pgsize - 3 * small_pgsize; - seg_size = 3 * small_pgsize + large_pgsize + 3 * small_pgsize; - segid = xpmem_make(seg_addr, seg_size, - XPMEM_PERMIT_MODE, (void *)0666); - INTERR(segid == -1, "xpmem_make: addr: %lx, size: %lx, error: %s\n", - (unsigned long)seg_addr, seg_size, strerror(errno)); - - fflush(stdout); /* to prevent buffer from getting duplicated */ - - pid = fork(); - INTERR(pid == -1, "fork failed\n"); - - if (pid == 0) { - xpmem_apid_t apid; - struct xpmem_addr xpmem_addr; - void *head_addr, *middle_addr, *tail_addr; - void *addr; - - apid = xpmem_get(segid, XPMEM_RDWR, - XPMEM_PERMIT_MODE, NULL); - OKNG(apid != -1, "apid: %lx\n", (unsigned long)apid); - - xpmem_addr.apid = apid; - xpmem_addr.offset = 0; - - INFO("child: attaching...\n"); - head_addr = xpmem_attach(xpmem_addr, seg_size, NULL); - INTERR(head_addr == (void *)-1, - "xpmem_attach: size: %lx, error: %s\n", - seg_size, strerror(errno)); - - printf("child: head_addr: %lx\n", (unsigned long)head_addr); - - middle_addr = head_addr + 3 * small_pgsize; - printf("child: middle_addr: %lx\n", (unsigned long)middle_addr); - - tail_addr = head_addr + 3 * small_pgsize + large_pgsize; - printf("child: tail_addr: %lx\n", (unsigned long)tail_addr); - - fflush(stdout); - - for (i = 0; i < 3; i++) { - addr = head_addr + i * small_pgsize; - *((unsigned long *)addr) = MAGIC_HEAD + i; - } - *((unsigned long *)middle_addr) = MAGIC_MIDDLE; - for (i = 0; i < 3; i++) { - addr = tail_addr + i * small_pgsize; - *((unsigned long *)addr) = MAGIC_TAIL + i; - } - - ret = xpmem_detach(head_addr); - INTERR(ret == -1, "xpmem_detach failed\n"); - - exit(0); - } else { - void *head_addr = seg_addr; - void *middle_addr = seg_addr + 3 * small_pgsize; - void *tail_addr = seg_addr + 3 * small_pgsize + large_pgsize; - void *addr; - - INFO("parent: waiting...\n"); - ret = waitpid(pid, &status, 0); - INFO("parent: children reaped\n"); - INTERR(ret == -1, "waitpid failed\n"); - - for (i = 0; i < 3; i++) { - addr = head_addr + i * small_pgsize; - OKNG(*((unsigned long *)addr) == MAGIC_HEAD + i, - "%lx: %lx, expected: %lx\n", - (unsigned long)addr, *((unsigned long *)addr), - MAGIC_HEAD + i); - } - OKNG(*((unsigned long *)middle_addr) == MAGIC_MIDDLE, - "%lx: %lx, expected: %lx\n", - (unsigned long)middle_addr, - *((unsigned long *)middle_addr), - MAGIC_MIDDLE); - for (i = 0; i < 3; i++) { - addr = tail_addr + i * small_pgsize; - OKNG(*((unsigned long *)addr) == MAGIC_TAIL + i, - "%lx: %lx, expected: %lx\n", - (unsigned long)addr, *((unsigned long *)addr), - MAGIC_TAIL + i); - } - - ret = xpmem_remove(segid); - INTERR(ret == -1, "xpmem_remove failed\n"); - } - - ret = 0; - out: - return ret; -} diff --git a/test/issues/1473/xpmem_attach02.sh.in b/test/issues/1473/xpmem_attach02.sh.in deleted file mode 100644 index b43c79d1..00000000 --- a/test/issues/1473/xpmem_attach02.sh.in +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/bash - -declare -A addr=() -declare -A pgsize_kmsg=() -declare -A pgsize_expected=() - -SCRIPT_PATH=$(readlink -m "${BASH_SOURCE[0]}") -SCRIPT_NAME="${SCRIPT_PATH##*/}" - -# prepare recorddir -. @CMAKE_INSTALL_PREFIX@/bin/common.sh -recorddir=$WORKDIR/output/$SCRIPT_NAME -[[ ! -d $recorddir ]] && mkdir -p $recorddir - -# define patch function -. @CMAKE_INSTALL_PREFIX@/bin/util.sh -patch_and_build large_page ihk_kmsg_size || exit 1 - -# boot patched McKernel -if [[ -e ${AUTOTEST_HOME}/bin/config.sh ]]; then - ${AUTOTEST_HOME}/bin/boot.sh reboot -else - . @WITH_MCK_SRC@/test/common.sh -fi - -sudo insmod @WITH_XPMEM@/lib/modules/`uname -r`/xpmem.ko -sudo chmod og+rw /dev/xpmem - -for small_pgshift in $PGSHIFT_LIST; do - for large_pgshift in $PGSHIFT_LIST; do - if (( small_pgshift < large_pgshift )); then - echo "small_pgshift: $small_pgshift, large_pgshift: $large_pgshift" - log_file=$recorddir/${SCRIPT_NAME%.sh}-${small_pgshift}-${large_pgshift}.log - @WITH_MCK@/sbin/ihkosctl 0 clear_kmsg - @WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/xpmem_attach02 $small_pgshift $large_pgshift | tee $log_file - @WITH_MCK@/sbin/ihkosctl 0 kmsg >> $log_file - - pgsize_expected[head]=$((1 << $small_pgshift)) - pgsize_expected[middle]=$((1 << $large_pgshift)) - pgsize_expected[tail]=$((1 << $small_pgshift)) - - for i in head middle tail; do - addr[$i]=$(grep "child.*${i}_addr" $log_file | awk '{ print $NF; }') - pgsize_kmsg[$i]=$(grep -o "xpmem_page_attach.*${addr[$i]}.*" $log_file | awk '{ print $NF; }') - [[ "${pgsize_kmsg[$i]}" == "" ]] && pgsize_kmsg[$i]=$PAGE_SIZE - - echo "pgsize_kmsg[$i]: ${pgsize_kmsg[$i]}, pgsize_expected[$i]: ${pgsize_expected[$i]}" - - if ((pgsize_kmsg[$i] == pgsize_expected[$i])); then - printf "[ OK ] " - else - printf "[ NG ] " - let ng++ - fi - echo "page-size of attachment at ${addr[$i]}: ${pgsize_kmsg[$i]}, expected: ${pgsize_expected[$i]}" - done - fi - done -done - -sudo rmmod xpmem.ko - -exit $ng diff --git a/test/issues/1473/xpmem_attach03.sh.in b/test/issues/1473/xpmem_attach03.sh.in deleted file mode 100644 index 82a8617b..00000000 --- a/test/issues/1473/xpmem_attach03.sh.in +++ /dev/null @@ -1,230 +0,0 @@ -#!/usr/bin/bash - -run() { - tid=05 - ng=0 - echo "*** C${issue}T${tid} start *******************************" - echo "** xpmem testsuite" - - pushd @WITH_XPMEM_BUILD@/test - - test -e /tmp/xpmem.share && rm -f /tmp/xpmem.share - test -e /tmp/xpmem.lock && rm -f /tmp/xpmem.lock - - # create TMP_SHARE_SIZE bytes defined in xpmem_test.h - for i in `seq 0 31` ; do - echo -n 0 >> /tmp/xpmem.share - done - echo 0 > /tmp/xpmem.lock - - # Run the main test app - @WITH_MCK@/bin/mcexec $PWD/xpmem_master - - popd - - - # xpmem basic test - @WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/XTP_001 - @WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/XTP_002 - @WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/XTP_003 - @WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/XTP_004 - @WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/XTP_005 - @WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/XTP_006 - sleep 3 - @WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/XTP_007 - @WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/XTP_008 - @WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/XTP_009 - @WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/XTP_010 - @WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/XTP_011 -} - -SCRIPT_PATH=$(readlink -m "${BASH_SOURCE[0]}") -SCRIPT_NAME="${SCRIPT_PATH##*/}" - -# prepare recorddir -. @CMAKE_INSTALL_PREFIX@/bin/common.sh -recorddir=$WORKDIR/output/$SCRIPT_NAME -[[ ! -d $recorddir ]] && mkdir -p $recorddir -recordfile=$WORKDIR/output/$SCRIPT_NAME.log - -# define patch function -. @CMAKE_INSTALL_PREFIX@/bin/util.sh -patch_and_build large_page ihk_kmsg_size || exit 1 - -# boot patched McKernel -if [[ -e ${AUTOTEST_HOME}/bin/config.sh ]]; then - ${AUTOTEST_HOME}/bin/boot.sh reboot -else - . @WITH_MCK_SRC@/test/common.sh -fi - -sudo insmod @WITH_XPMEM@/lib/modules/`uname -r`/xpmem.ko -sudo chmod og+rw /dev/xpmem - -sum_ng=0 - -issue=1259 -tid=01 -ng=0 -echo "*** C${issue}T${tid} start *******************************" -echo "** xpmem_attach to Huge mapped memory range" -echo "** end of range is aligned with Large page size" -for pgshift in $PGSHIFT_LIST; do - ((pgshift == $PAGE_SHIFT)) && continue - - @WITH_MCK@/sbin/ihkosctl 0 clear_kmsg - log_file=$recorddir/C${issue}T${tid}_${pgshift}.log - echo pageshift: ${pgshift} - @WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/huge_page_xpmem ${pgshift} 2 0 > ${log_file} - @WITH_MCK@/sbin/ihkosctl 0 kmsg >> ${log_file} - - EXPECT_PGSIZE=`grep EXPECT_PAGE_SIZE ${log_file} | awk '{ print $2; }'` - - SEG_ADDR=$(grep -o "anonymous_map_addr: [^ ]* " $log_file | awk '{ print $2; }') - SEG_PGSIZE=`cat ${log_file} | awk '/OK/,/DONE/' | \ -grep -o "large_page_allocation.*${SEG_ADDR}.*" | awk '{ print $5; }'` - - XPMEM_ADDR=`grep xpmem_attachment_addr ${log_file} | awk '{ print $NF; }'` - XPMEM_PGSIZE=`grep -o "xpmem_page_attach.*${XPMEM_ADDR}.*" ${log_file} | awk '{ print $NF; }'` - - if [ "${SEG_PGSIZE}" = "${EXPECT_PGSIZE}" ]; then - echo "** [ OK ] seg_addr ($SEG_ADDR) is allocated before xpmem_attach" - else - echo "** [ NG ] seg_addr ($SEG_ADDR) is not allocated before xpmem_attach" - let ng++ - fi - if [ "${XPMEM_PGSIZE}" = "${EXPECT_PGSIZE}" ]; then - echo "** [ OK ] xpmem_addr ($XPMEM_ADDR) is allocated using large pages" - else - echo "** [ NG ] xpmem_addr ($XPMEM_ADDR) is NOT allocated using large pages" - let ng++ - fi -done - -((sum_ng += ng)) - -if [ ${ng} -eq 0 ]; then - echo "*** C${issue}T${tid}: PASSED" -else - echo "*** C${issue}T${tid}: FAILED" -fi -echo "" - -tid=02 -ng=0 -echo "*** C${issue}T${tid} start *******************************" -echo "** xpmem_attach to Huge mapped memory range" -echo "** end of range is NOT aligned with Large page size" -for pgshift in $PGSHIFT_LIST; do - ((pgshift == $PAGE_SHIFT)) && continue - - @WITH_MCK@/sbin/ihkosctl 0 clear_kmsg - log_file=$recorddir/C${issue}T${tid}_${pgshift}.log - echo pageshift: ${pgshift} - @WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/huge_page_xpmem ${pgshift} 2 $PAGE_SIZE > ${log_file} - @WITH_MCK@/sbin/ihkosctl 0 kmsg >> ${log_file} - - EXPECT_PGSIZE=`grep EXPECT_PAGE_SIZE ${log_file} | awk '{ print $2; }'` - - SEG_ADDR=$(grep -o "anonymous_map_addr: [^ ]* " $log_file | awk '{ print $2; }') - SEG_PGSIZE=`cat ${log_file} | awk '/OK/,/DONE/' | \ -grep -o "large_page_allocation.*${SEG_ADDR}.*" | awk '{ print $5; }'` - - XPMEM_ADDR=`grep xpmem_attachment_addr ${log_file} | awk '{ print $NF; }'` - XPMEM_PGSIZE=`grep -o "xpmem_page_attach.*${XPMEM_ADDR}.*" ${log_file} | awk '{ print $NF; }'` - - if [ "${SEG_PGSIZE}" = "${EXPECT_PGSIZE}" ]; then - printf "** [ OK ] " - else - printf "** [ NG ] " - let ng++ - fi - echo "size of 1st page of segment at ${SEG_ADDR}: ${SEG_PGSIZE}, expected: ${EXPECT_PGSIZE}" - - if [ "${XPMEM_PGSIZE}" = "${EXPECT_PGSIZE}" ]; then - printf "** [ OK ] " - else - printf "** [ NG ] " - let ng++ - fi - echo "size of 1st page of attachment at ${XPMEM_ADDR}: ${XPMEM_PGSIZE}, expected: ${EXPECT_PGSIZE}" -done - -((sum_ng += ng)) - -if [ ${ng} -eq 0 ]; then - echo "*** C${issue}T${tid}: PASSED" -else - echo "*** C${issue}T${tid}: FAILED" -fi -echo "" - -tid=03 -ng=0 -echo "*** C${issue}T${tid} start *******************************" -echo "** xpmem_attach to small mapped memory range" -@WITH_MCK@/sbin/ihkosctl 0 clear_kmsg -log_file=$recorddir/C${issue}T${tid}.log -echo pageshift: small page -@WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/huge_page_xpmem -1 2 0 > ${log_file} -@WITH_MCK@/sbin/ihkosctl 0 kmsg >> ${log_file} - -EXPECT_PGSIZE=`grep EXPECT_PAGE_SIZE ${log_file} | awk '{ print $2; }'` - -XPMEM_ADDR=`grep xpmem_attachment_addr ${log_file} | awk '{ print $NF; }'` -XPMEM_PGSIZE=`grep -o "xpmem_page_attach.*${XPMEM_ADDR}.*" ${log_file} | awk '{ print $NF; }'` - -if [ "${XPMEM_PGSIZE}" = "${EXPECT_PGSIZE}" ]; then - echo "** [ OK ] xpmem_addr ($XPMEM_ADDR) is allocated using small pages" -else - echo "** [ NG ] xpmem_addr ($XPMEM_ADDR) is NOT allocated using small pages" - ((ng++)) -fi - -((sum_ng += ng)) - -if [ ${ng} -eq 0 ]; then - echo "*** C${issue}T${tid}: PASSED" -else - echo "*** C${issue}T${tid}: FAILED" -fi -echo "" - -tid=04 -ng=0 -echo "*** C${issue}T${tid} start *******************************" -echo "** xpmem_attach to multi pagesize range" -pgshift=$(echo $PGSHIFT_LIST | awk '{print $2}') -@WITH_MCK@/sbin/ihkosctl 0 clear_kmsg -log_file=$recorddir/C${issue}T${tid}_${pgshift}.log -echo pageshift: ${pgshift} -@WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/multi_vmr_xpmem ${pgshift} 1 | tee ${log_file} -@WITH_MCK@/sbin/ihkosctl 0 kmsg >> ${log_file} - -EXPECT_PGSIZE=`grep EXPECT_PAGE_SIZE ${log_file} | awk '{ print $2; }'` - -XPMEM_ADDR=`grep xpmem_large ${log_file} | awk '{ print $NF; }'` -XPMEM_PGSIZE=`grep -o "xpmem_page_attach.*${XPMEM_ADDR}.*" ${log_file} | awk '{ print $NF; }'` - -if [ "${XPMEM_PGSIZE}" = "${EXPECT_PGSIZE}" ]; then - echo "** [ OK ] xpmem_addr ($XPMEM_ADDR) is allocated using large pages" -else - echo "** [ NG ] xpmem_addr ($XPMEM_ADDR) is NOT allocated using large pages" - let ng++ -fi - -((sum_ng += ng)) - -if [ ${ng} -eq 0 ]; then - echo "*** C${issue}T${tid}: PASSED" -else - echo "*** C${issue}T${tid}: FAILED" -fi -echo "" - -run 2>&1 | tee $recordfile -grep -E '(FAIL| NG )' $recordfile && ((sum_ng++)) - -sudo rmmod xpmem.ko - -exit $sum_ng diff --git a/test/issues/1473/xpmem_make01.c b/test/issues/1473/xpmem_make01.c deleted file mode 100644 index 46a9b468..00000000 --- a/test/issues/1473/xpmem_make01.c +++ /dev/null @@ -1,79 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "util.h" -#include "okng.h" - -int main(int argc, char **argv) -{ - void *mem, *attach; - int ret; - int status; - pid_t pid; - xpmem_segid_t segid; - xpmem_apid_t apid; - struct xpmem_addr addr; - - START("xpmem_make size: -1\n"); - - mem = mmap(0, SZ_MEM, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | - MAP_HUGETLB | (LARGE_PAGE_SHIFT << MAP_HUGE_SHIFT), -1, 0); - INTERR(mem == MAP_FAILED, "mmap failed\n"); - memset(mem, 0, SZ_MEM); - - segid = xpmem_make(0, -1, XPMEM_PERMIT_MODE, (void *)0666); - OKNG(segid != -1, "xpmem_make returned %lx\n", (unsigned long)segid); - - fflush(0); - pid = fork(); - INTERR(pid == -1, "fork failed\n"); - - if (pid == 0) { - /* Child process */ - apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); - OKNG(apid != -1, "child: xpmem_get returned %lx\n", - (unsigned long)apid); - - addr.apid = apid; - addr.offset = (unsigned long)mem; - attach = xpmem_attach(addr, SZ_MEM, NULL); - OKNG(attach != (void *)-1, "child: xpmem_attach returned %lx\n", - (unsigned long)attach); - - *((unsigned long *)attach) = TEST_VAL; - - ret = xpmem_detach(attach); - OKNG(ret != -1, "child: xpmem_detach returned %d\n", - ret); - - fflush(0); - _exit(0); - } else { - /* Parent process */ - ret = waitpid(pid, &status, 0); - INTERR(ret == -1, "waitpid failed\n"); - - OKNG(*((unsigned long *)mem) == TEST_VAL, - "parent: TEST_VAL found\n"); - - ret = xpmem_remove(segid); - OKNG(ret != -1, "parent: xpmem_remove returned %d\n", - errno); - } - - return 0; - -out: - return 1; -} diff --git a/test/issues/1473/xpmem_make01.sh.in b/test/issues/1473/xpmem_make01.sh.in deleted file mode 100644 index 9edbc856..00000000 --- a/test/issues/1473/xpmem_make01.sh.in +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/bash - -. @CMAKE_INSTALL_PREFIX@/bin/common.sh - -@WITH_MCK@/bin/mcexec @CMAKE_INSTALL_PREFIX@/bin/xpmem_make01 -ret=$? - -exit $ret