Merge branch 'master' of postpeta.pccluster.org:mckernel
This commit is contained in:
@@ -284,7 +284,7 @@ static long mcexec_send_signal(ihk_os_t os, struct signal_desc *sigparam)
|
||||
isp.pid = sig.pid;
|
||||
isp.arg = (long)sig.tid << 32 | (sig.sig & 0x00000000ffffffffL);
|
||||
|
||||
mcctrl_ikc_send(os, 0, &isp);
|
||||
mcctrl_ikc_send(os, sig.cpu, &isp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -405,6 +405,25 @@ static int rus_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||
pfn = phys >> PAGE_SHIFT;
|
||||
#if USE_VM_INSERT_PFN
|
||||
for (pix = 0; pix < (pgsize / PAGE_SIZE); ++pix) {
|
||||
struct page *page;
|
||||
|
||||
if (pfn_valid(pfn+pix)) {
|
||||
page = pfn_to_page(pfn+pix);
|
||||
if (!page_count(page)) {
|
||||
get_page(page);
|
||||
/*
|
||||
* TODO:
|
||||
* The pages which get_page() has been called with
|
||||
* should be recorded. Because these pages have to
|
||||
* be passed to put_page() before they are freed.
|
||||
*/
|
||||
}
|
||||
error = vm_insert_page(vma, rva+(pix*PAGE_SIZE), page);
|
||||
if (error) {
|
||||
printk("vm_insert_page: %d\n", error);
|
||||
}
|
||||
}
|
||||
else
|
||||
error = vm_insert_pfn(vma, rva+(pix*PAGE_SIZE), pfn+pix);
|
||||
if (error) {
|
||||
break;
|
||||
@@ -429,7 +448,7 @@ static struct vm_operations_struct rus_vmops = {
|
||||
|
||||
static int rus_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
vma->vm_flags |= VM_IO | VM_RESERVED | VM_DONTEXPAND | VM_PFNMAP;
|
||||
vma->vm_flags |= VM_RESERVED | VM_DONTEXPAND | VM_MIXEDMAP;
|
||||
vma->vm_ops = &rus_vmops;
|
||||
return 0;
|
||||
}
|
||||
@@ -1125,13 +1144,16 @@ out:
|
||||
return (IS_ERR_VALUE(map))? (int)map: 0;
|
||||
}
|
||||
|
||||
static void clear_pte_range(uintptr_t start, uintptr_t len)
|
||||
static int clear_pte_range(uintptr_t start, uintptr_t len)
|
||||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
struct vm_area_struct *vma;
|
||||
uintptr_t addr;
|
||||
uintptr_t end;
|
||||
int error;
|
||||
int ret;
|
||||
|
||||
ret = 0;
|
||||
down_read(&mm->mmap_sem);
|
||||
addr = start;
|
||||
while (addr < (start + len)) {
|
||||
@@ -1148,14 +1170,15 @@ static void clear_pte_range(uintptr_t start, uintptr_t len)
|
||||
end = vma->vm_end;
|
||||
}
|
||||
if (addr < end) {
|
||||
zap_vma_ptes(vma, addr, end-addr);
|
||||
dprintk("clear_pte_range() 0x%lx - 0x%lx OK\n",
|
||||
vma->vm_start, vma->vm_end);
|
||||
error = zap_vma_ptes(vma, addr, end-addr);
|
||||
if (ret == 0) {
|
||||
ret = error;
|
||||
}
|
||||
}
|
||||
addr = end;
|
||||
}
|
||||
up_read(&mm->mmap_sem);
|
||||
return;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1293,7 +1316,11 @@ int __do_in_kernel_syscall(ihk_os_t os, struct mcctrl_channel *c, struct syscall
|
||||
ppd->pid, ppd->rpgtable);
|
||||
}
|
||||
|
||||
clear_pte_range(sc->args[0], sc->args[1]);
|
||||
error = clear_pte_range(sc->args[0], sc->args[1]);
|
||||
if (error) {
|
||||
error = -ENOSYS;
|
||||
goto out;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user