sim: handle the case when there're not enough HW thread contexts
authorTuan Ta <qtt2@cornell.edu>
Mon, 2 Apr 2018 20:22:50 +0000 (16:22 -0400)
committerTuan Ta <qtt2@cornell.edu>
Fri, 8 Feb 2019 15:25:30 +0000 (15:25 +0000)
In SE mode, since there's no OS scheduler, the number of active SW
threads is limited by the number of HW thread contexts. Previously, if
there is no spare HW thread context, the simulator just fails and stops.
Instead, this patch returns EAGAIN error code from a clone syscall if
there's no available HW thread context. Then it's up to the simulated
program to handle the error.

Linux man page reference:
http://man7.org/linux/man-pages/man2/clone.2.html
http://man7.org/linux/man-pages/man2/fork.2.html

Change-Id: Ib4e092433e49de4dde376c8cb81f7d3f7851cbc0
Reviewed-on: https://gem5-review.googlesource.com/c/9628
Reviewed-by: Brandon Potter <Brandon.Potter@amd.com>
Maintainer: Brandon Potter <Brandon.Potter@amd.com>

src/sim/syscall_emul.hh

index dcd6b5d994cdf1085401b10afc8ee3d78eae9426..295598c52ed13aff491bac082e7c7653150d379d 100644 (file)
@@ -1431,8 +1431,11 @@ cloneFunc(SyscallDesc *desc, int callnum, Process *p, ThreadContext *tc)
         return -EINVAL;
 
     ThreadContext *ctc;
-    if (!(ctc = p->findFreeContext()))
-        fatal("clone: no spare thread context in system");
+    if (!(ctc = p->findFreeContext())) {
+        DPRINTF_SYSCALL(Verbose, "clone: no spare thread context in system"
+                        "[cpu %d, thread %d]", tc->cpuId(), tc->threadId());
+        return -EAGAIN;
+    }
 
     /**
      * Note that ProcessParams is generated by swig and there are no other