git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix file system racing and ext2 directory insertion (#58)
[lunaix-os.git]
/
lunaix-os
/
kernel
/
process
/
fork.c
diff --git
a/lunaix-os/kernel/process/fork.c
b/lunaix-os/kernel/process/fork.c
index 9518c1935421f2b9df5b0875126b7cc53b2eb09e..d68a8f830d3768553d66f97ef2599dabfcdf255b 100644
(file)
--- a/
lunaix-os/kernel/process/fork.c
+++ b/
lunaix-os/kernel/process/fork.c
@@
-1,7
+1,6
@@
#include <lunaix/mm/region.h>
#include <lunaix/mm/valloc.h>
#include <lunaix/mm/region.h>
#include <lunaix/mm/valloc.h>
-#include <lunaix/mm/vmm.h>
-#include <lunaix/mm/pmm.h>
+#include <lunaix/mm/page.h>
#include <lunaix/mm/mmap.h>
#include <lunaix/process.h>
#include <lunaix/spike.h>
#include <lunaix/mm/mmap.h>
#include <lunaix/process.h>
#include <lunaix/spike.h>
@@
-9,9
+8,10
@@
#include <lunaix/syscall.h>
#include <lunaix/syslog.h>
#include <lunaix/signal.h>
#include <lunaix/syscall.h>
#include <lunaix/syslog.h>
#include <lunaix/signal.h>
+#include <lunaix/kpreempt.h>
-#include <
sys
/abi.h>
-#include <
sys/m
m/mm_defs.h>
+#include <
asm
/abi.h>
+#include <
as
m/mm_defs.h>
#include <klibc/string.h>
#include <klibc/string.h>
@@
-31,8
+31,7
@@
region_maybe_cow(struct mm_region* region)
for (size_t i = start_pn; i <= end_pn; i++) {
pte_t* self = mkptep_pn(VMS_SELF, i);
pte_t* guest = mkptep_pn(VMS_MOUNT_1, i);
for (size_t i = start_pn; i <= end_pn; i++) {
pte_t* self = mkptep_pn(VMS_SELF, i);
pte_t* guest = mkptep_pn(VMS_MOUNT_1, i);
-
- cpu_flush_page(page_addr(ptep_pfn(self)));
+ ptr_t va = page_addr(ptep_pfn(self));
if ((attr & REGION_MODE_MASK) == REGION_RSHARED) {
set_pte(self, pte_mkwprotect(*self));
if ((attr & REGION_MODE_MASK) == REGION_RSHARED) {
set_pte(self, pte_mkwprotect(*self));
@@
-42,42
+41,37
@@
region_maybe_cow(struct mm_region* region)
set_pte(guest, null_pte);
}
}
set_pte(guest, null_pte);
}
}
-}
-static inline void
-__dup_fdtable(struct proc_info* pcb)
-{
- for (size_t i = 0; i < VFS_MAX_FD; i++) {
- struct v_fd* fd = __current->fdtable->fds[i];
- if (!fd)
- continue;
- vfs_dup_fd(fd, &pcb->fdtable->fds[i]);
- }
+ tlb_flush_vmr_all(region);
}
}
-
static void
__dup_kernel_stack(struct thread* thread, ptr_t vm_mnt)
{
static void
__dup_kernel_stack(struct thread* thread, ptr_t vm_mnt)
{
+ struct leaflet* leaflet;
+
ptr_t kstack_pn = pfn(current_thread->kstack);
ptr_t kstack_pn = pfn(current_thread->kstack);
- kstack_pn -= pfn(KSTACK_SIZE)
- 1
;
+ kstack_pn -= pfn(KSTACK_SIZE);
// copy the kernel stack
pte_t* src_ptep = mkptep_pn(VMS_SELF, kstack_pn);
pte_t* dest_ptep = mkptep_pn(vm_mnt, kstack_pn);
// copy the kernel stack
pte_t* src_ptep = mkptep_pn(VMS_SELF, kstack_pn);
pte_t* dest_ptep = mkptep_pn(vm_mnt, kstack_pn);
- for (size_t i = 0; i < pfn(KSTACK_SIZE); i++) {
+ for (size_t i = 0; i <
=
pfn(KSTACK_SIZE); i++) {
pte_t p = *src_ptep;
if (pte_isguardian(p)) {
set_pte(dest_ptep, guard_pte);
} else {
pte_t p = *src_ptep;
if (pte_isguardian(p)) {
set_pte(dest_ptep, guard_pte);
} else {
-
ptr_t ppa = vmm_dup_page(pte_paddr
(p));
-
set_pte(dest_ptep, pte_setpaddr(p, ppa)
);
+
leaflet = dup_leaflet(pte_leaflet
(p));
+
i += ptep_map_leaflet(dest_ptep, p, leaflet
);
}
src_ptep++;
dest_ptep++;
}
}
src_ptep++;
dest_ptep++;
}
+
+ struct proc_mm* mm = vmspace(thread->process);
+ tlb_flush_mm_range(mm, kstack_pn, leaf_count(KSTACK_SIZE));
}
/*
}
/*
@@
-101,7
+95,7
@@
dup_active_thread(ptr_t vm_mnt, struct proc_info* duped_pcb)
return NULL;
}
return NULL;
}
- th->
intr_ctx = current_thread->intr_ctx
;
+ th->
hstate = current_thread->hstate
;
th->kstack = current_thread->kstack;
signal_dup_context(&th->sigctx);
th->kstack = current_thread->kstack;
signal_dup_context(&th->sigctx);
@@
-144,6
+138,8
@@
done:
pid_t
dup_proc()
{
pid_t
dup_proc()
{
+ no_preemption();
+
struct proc_info* pcb = alloc_process();
if (!pcb) {
syscall_result(ENOMEM);
struct proc_info* pcb = alloc_process();
if (!pcb) {
syscall_result(ENOMEM);
@@
-164,12
+160,13
@@
dup_proc()
vfs_ref_dnode(pcb->cwd);
}
vfs_ref_dnode(pcb->cwd);
}
- __dup_fdtable(pcb);
+ fdtable_copy(pcb->fdtable, __current->fdtable);
+ uscope_copy(&pcb->uscope, current_user_scope());
struct proc_mm* mm = vmspace(pcb);
procvm_dupvms_mount(mm);
struct proc_mm* mm = vmspace(pcb);
procvm_dupvms_mount(mm);
- struct thread* main_thread = dup_active_thread(
VMS_MOUNT_1
, pcb);
+ struct thread* main_thread = dup_active_thread(
mm->vm_mnt
, pcb);
if (!main_thread) {
syscall_result(ENOMEM);
procvm_unmount(mm);
if (!main_thread) {
syscall_result(ENOMEM);
procvm_unmount(mm);