Fix holding spinlocks for too long
This commit is contained in:
@ -43,16 +43,15 @@ int32_t SYSCALL3(sys_ioctl, ioh1, cmd1, optsptr1) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
spinlock_acquire(&PROCS.spinlock);
|
spinlock_acquire(&PROCS.spinlock);
|
||||||
|
|
||||||
Proc *proc = PROCS.current;
|
Proc *proc = PROCS.current;
|
||||||
|
spinlock_release(&PROCS.spinlock);
|
||||||
|
|
||||||
if (proc->vobjcnt < PROC_VFSHANDLES_MAX) {
|
if (proc->vobjcnt < PROC_VFSHANDLES_MAX) {
|
||||||
proc->vobjs[proc->vobjcnt++] = vobj;
|
proc->vobjs[proc->vobjcnt++] = vobj;
|
||||||
ret = proc->vobjcnt - 1;
|
ret = proc->vobjcnt - 1;
|
||||||
} else {
|
} else {
|
||||||
ret = E_NOMEMORY;
|
ret = E_NOMEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
spinlock_release(&PROCS.spinlock);
|
|
||||||
} break;
|
} break;
|
||||||
case IOCTL_CLOSEF: {
|
case IOCTL_CLOSEF: {
|
||||||
if (ioh >= PROC_VFSHANDLES_MAX) {
|
if (ioh >= PROC_VFSHANDLES_MAX) {
|
||||||
@ -62,9 +61,10 @@ int32_t SYSCALL3(sys_ioctl, ioh1, cmd1, optsptr1) {
|
|||||||
|
|
||||||
spinlock_acquire(&PROCS.spinlock);
|
spinlock_acquire(&PROCS.spinlock);
|
||||||
Proc *proc = PROCS.current;
|
Proc *proc = PROCS.current;
|
||||||
VfsObj *vobj = proc->vobjs[ioh];
|
|
||||||
spinlock_release(&PROCS.spinlock);
|
spinlock_release(&PROCS.spinlock);
|
||||||
|
|
||||||
|
VfsObj *vobj = proc->vobjs[ioh];
|
||||||
|
|
||||||
if (vobj == NULL) {
|
if (vobj == NULL) {
|
||||||
ret = E_INVALIDARGUMENT;
|
ret = E_INVALIDARGUMENT;
|
||||||
goto done;
|
goto done;
|
||||||
@ -101,9 +101,10 @@ int32_t SYSCALL3(sys_ioctl, ioh1, cmd1, optsptr1) {
|
|||||||
|
|
||||||
spinlock_acquire(&PROCS.spinlock);
|
spinlock_acquire(&PROCS.spinlock);
|
||||||
Proc *proc = PROCS.current;
|
Proc *proc = PROCS.current;
|
||||||
VfsObj *vobj = proc->vobjs[ioh];
|
|
||||||
spinlock_release(&PROCS.spinlock);
|
spinlock_release(&PROCS.spinlock);
|
||||||
|
|
||||||
|
VfsObj *vobj = proc->vobjs[ioh];
|
||||||
|
|
||||||
if (vobj == NULL) {
|
if (vobj == NULL) {
|
||||||
ret = E_INVALIDARGUMENT;
|
ret = E_INVALIDARGUMENT;
|
||||||
goto done;
|
goto done;
|
||||||
@ -131,9 +132,10 @@ int32_t SYSCALL3(sys_ioctl, ioh1, cmd1, optsptr1) {
|
|||||||
|
|
||||||
spinlock_acquire(&PROCS.spinlock);
|
spinlock_acquire(&PROCS.spinlock);
|
||||||
Proc *proc = PROCS.current;
|
Proc *proc = PROCS.current;
|
||||||
VfsObj *vobj = proc->vobjs[ioh];
|
|
||||||
spinlock_release(&PROCS.spinlock);
|
spinlock_release(&PROCS.spinlock);
|
||||||
|
|
||||||
|
VfsObj *vobj = proc->vobjs[ioh];
|
||||||
|
|
||||||
if (vobj == NULL) {
|
if (vobj == NULL) {
|
||||||
ret = E_INVALIDARGUMENT;
|
ret = E_INVALIDARGUMENT;
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -13,14 +13,14 @@ int32_t SYSCALL3(sys_processctl, pid1, cmd1, optsptr1) {
|
|||||||
uint64_t cmd = cmd1;
|
uint64_t cmd = cmd1;
|
||||||
int32_t ret = E_OK;
|
int32_t ret = E_OK;
|
||||||
|
|
||||||
spinlock_acquire(&PROCS.spinlock);
|
|
||||||
|
|
||||||
if (pid == PID_SELF_MAGIC) {
|
if (pid == PID_SELF_MAGIC) {
|
||||||
pid = PROCS.current->pid;
|
pid = PROCS.current->pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spinlock_acquire(&PROCS.spinlock);
|
||||||
Proc *proc = NULL;
|
Proc *proc = NULL;
|
||||||
LL_FINDPROP(PROCS.procs, proc, pid, pid);
|
LL_FINDPROP(PROCS.procs, proc, pid, pid);
|
||||||
|
spinlock_release(&PROCS.spinlock);
|
||||||
|
|
||||||
if (proc == NULL) {
|
if (proc == NULL) {
|
||||||
ret = E_INVALIDARGUMENT;
|
ret = E_INVALIDARGUMENT;
|
||||||
@ -31,15 +31,12 @@ int32_t SYSCALL3(sys_processctl, pid1, cmd1, optsptr1) {
|
|||||||
case PCTL_KILL: {
|
case PCTL_KILL: {
|
||||||
proc_kill(proc);
|
proc_kill(proc);
|
||||||
ret = E_DOSCHEDULING;
|
ret = E_DOSCHEDULING;
|
||||||
goto done;
|
|
||||||
} break;
|
} break;
|
||||||
default: {
|
default: {
|
||||||
ret = E_INVALIDARGUMENT;
|
ret = E_INVALIDARGUMENT;
|
||||||
goto done;
|
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
spinlock_release(&PROCS.spinlock);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user