kernel: use MF_KCALL_RESUME instead of RTS_VMREQUEST for memcopy retry.
solves tracker item 499, submitted by Roman Ignatov.
This commit is contained in:
parent
9fd2d72ce8
commit
545054c608
2 changed files with 7 additions and 3 deletions
|
@ -570,6 +570,8 @@ PRIVATE void vm_suspend(struct proc *caller, const struct proc *target,
|
||||||
*/
|
*/
|
||||||
assert(!RTS_ISSET(caller, RTS_VMREQUEST));
|
assert(!RTS_ISSET(caller, RTS_VMREQUEST));
|
||||||
assert(!RTS_ISSET(target, RTS_VMREQUEST));
|
assert(!RTS_ISSET(target, RTS_VMREQUEST));
|
||||||
|
assert(!(caller->p_misc_flags & MF_KCALL_RESUME));
|
||||||
|
assert(!(target->p_misc_flags & MF_KCALL_RESUME));
|
||||||
|
|
||||||
RTS_SET(caller, RTS_VMREQUEST);
|
RTS_SET(caller, RTS_VMREQUEST);
|
||||||
|
|
||||||
|
@ -819,9 +821,8 @@ int vmcheck; /* if nonzero, can return VMSUSPEND */
|
||||||
if(vm_running) {
|
if(vm_running) {
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
if(caller && RTS_ISSET(caller, RTS_VMREQUEST)) {
|
if(caller && (caller->p_misc_flags & MF_KCALL_RESUME)) {
|
||||||
assert(caller->p_vmrequest.vmresult != VMSUSPEND);
|
assert(caller->p_vmrequest.vmresult != VMSUSPEND);
|
||||||
RTS_UNSET(caller, RTS_VMREQUEST);
|
|
||||||
if(caller->p_vmrequest.vmresult != OK) {
|
if(caller->p_vmrequest.vmresult != OK) {
|
||||||
return caller->p_vmrequest.vmresult;
|
return caller->p_vmrequest.vmresult;
|
||||||
}
|
}
|
||||||
|
|
|
@ -591,11 +591,14 @@ PUBLIC void kernel_call_resume(struct proc *caller)
|
||||||
caller->p_rts_flags, caller->p_misc_flags);
|
caller->p_rts_flags, caller->p_misc_flags);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* re-execute the kernel call, with MF_KCALL_RESUME still set so
|
||||||
|
* the call knows this is a retry.
|
||||||
|
*/
|
||||||
|
result = kernel_call_dispatch(caller, &caller->p_vmrequest.saved.reqmsg);
|
||||||
/*
|
/*
|
||||||
* we are resuming the kernel call so we have to remove this flag so it
|
* we are resuming the kernel call so we have to remove this flag so it
|
||||||
* can be set again
|
* can be set again
|
||||||
*/
|
*/
|
||||||
caller->p_misc_flags &= ~MF_KCALL_RESUME;
|
caller->p_misc_flags &= ~MF_KCALL_RESUME;
|
||||||
result = kernel_call_dispatch(caller, &caller->p_vmrequest.saved.reqmsg);
|
|
||||||
kernel_call_finish(caller, &caller->p_vmrequest.saved.reqmsg, result);
|
kernel_call_finish(caller, &caller->p_vmrequest.saved.reqmsg, result);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue