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:
Ben Gras 2010-07-04 23:09:24 +00:00
parent 9fd2d72ce8
commit 545054c608
2 changed files with 7 additions and 3 deletions

View file

@ -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;
} }

View file

@ -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);
} }