Revert "cpu: fix how a thread starts up in MinorCPU"
authorGiacomo Travaglini <giacomo.travaglini@arm.com>
Fri, 1 Mar 2019 13:56:59 +0000 (13:56 +0000)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Tue, 14 May 2019 08:44:37 +0000 (08:44 +0000)
This reverts commit 02dafc5498750d9734ba8f2a1608a846f90b71d1.
The commit was part of a patchset which broke MinorCPU regressions
(switcheroo)

Change-Id: I0a8098fc71abe5838014e587dbe372b258d8aa9f
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/18604
Maintainer: Jason Lowe-Power <jason@lowepower.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/cpu/minor/cpu.cc
src/cpu/minor/cpu.hh
src/cpu/minor/execute.cc
src/cpu/minor/fetch2.cc
src/cpu/minor/fetch2.hh
src/cpu/minor/pipeline.cc

index 484457bd415405f2119047c3eae25c5ca6632cdf..63efde2dce3cffd828ff1a185fd9dcaa48829af8 100644 (file)
@@ -49,7 +49,6 @@
 
 MinorCPU::MinorCPU(MinorCPUParams *params) :
     BaseCPU(params),
-    pipelineStartupEvent([this]{ wakeupPipeline(); }, name()),
     threadPolicy(params->threadPolicy)
 {
     /* This is only written for one thread at the moment */
@@ -280,43 +279,20 @@ MinorCPU::takeOverFrom(BaseCPU *old_cpu)
 void
 MinorCPU::activateContext(ThreadID thread_id)
 {
-    /* Remember to wake up this thread_id by scheduling the
-     * pipelineStartup event.
-     * We can't wakeupFetch the thread right away because its context may
-     * not have been fully initialized. For example, in the case of clone
-     * syscall, this activateContext function is called in the middle of
-     * the syscall and before the new thread context is initialized.
-     * If we start fetching right away, the new thread will fetch from an
-     * invalid address (i.e., pc is not initialized yet), which could lead
-     * to a page fault. Instead, we remember which threads to wake up and
-     * schedule an event to wake all them up after their contexts are
-     * fully initialized */
-    readyThreads.push_back(thread_id);
-    if (!pipelineStartupEvent.scheduled())
-        schedule(pipelineStartupEvent, clockEdge(Cycles(0)));
-}
-
-void
-MinorCPU::wakeupPipeline()
-{
-    for (auto thread_id : readyThreads) {
-        DPRINTF(MinorCPU, "ActivateContext thread: %d\n", thread_id);
+    DPRINTF(MinorCPU, "ActivateContext thread: %d\n", thread_id);
 
-        /* Do some cycle accounting.  lastStopped is reset to stop the
-         *  wakeup call on the pipeline from adding the quiesce period
-         *  to BaseCPU::numCycles */
-        stats.quiesceCycles += pipeline->cyclesSinceLastStopped();
-        pipeline->resetLastStopped();
-
-        /* Wake up the thread, wakeup the pipeline tick */
-        threads[thread_id]->activate();
-        wakeupOnEvent(Minor::Pipeline::CPUStageId);
+    /* Do some cycle accounting.  lastStopped is reset to stop the
+     *  wakeup call on the pipeline from adding the quiesce period
+     *  to BaseCPU::numCycles */
+    stats.quiesceCycles += pipeline->cyclesSinceLastStopped();
+    pipeline->resetLastStopped();
 
-        pipeline->wakeupFetch(thread_id);
-        BaseCPU::activateContext(thread_id);
-    }
+    /* Wake up the thread, wakeup the pipeline tick */
+    threads[thread_id]->activate();
+    wakeupOnEvent(Minor::Pipeline::CPUStageId);
+    pipeline->wakeupFetch(thread_id);
 
-    readyThreads.clear();
+    BaseCPU::activateContext(thread_id);
 }
 
 void
index 606a401b67dcb1bf2c7cc9a87d1a2c12831394fd..4e4762390034fde5cbc11b274d3386437b295030 100644 (file)
@@ -83,13 +83,6 @@ class MinorCPU : public BaseCPU
      *  Elements of pipeline call TheISA to implement the model. */
     Minor::Pipeline *pipeline;
 
-    /** An event that wakes up the pipeline when a thread context is
-     * activated */
-    EventFunctionWrapper pipelineStartupEvent;
-
-    /** List of threads that are ready to wake up and run */
-    std::vector<ThreadID> readyThreads;
-
   public:
     /** Activity recording for pipeline.  This belongs to Pipeline but
      *  stages will access it through the CPU as the MinorCPU object
@@ -172,9 +165,6 @@ class MinorCPU : public BaseCPU
     void activateContext(ThreadID thread_id) override;
     void suspendContext(ThreadID thread_id) override;
 
-    /** Wake up ready-to-run threads */
-    void wakeupPipeline();
-
     /** Thread scheduling utility functions */
     std::vector<ThreadID> roundRobinPriority(ThreadID priority)
     {
index 81d310bba89c2fdd53b95382222fc515a10446de..810ff11c63a236921d1df5f821f267c26a7bb7ee 100644 (file)
@@ -1061,8 +1061,7 @@ Execute::commit(ThreadID thread_id, bool only_commit_microops, bool discard,
         !branch.isStreamChange() && /* No real branch */
         fault == NoFault && /* No faults */
         completed_inst && /* Still finding instructions to execute */
-        num_insts_committed != commitLimit && /* Not reached commit limit */
-        cpu.getContext(thread_id)->status() != ThreadContext::Suspended
+        num_insts_committed != commitLimit /* Not reached commit limit */
         )
     {
         if (only_commit_microops) {
index b374ee9bf90b8ee557ef9eea3b614302753195cc..d60a1bab01ffcdd9b345bd558ab3d9a94177fa41 100644 (file)
@@ -120,7 +120,6 @@ Fetch2::dumpAllInput(ThreadID tid)
         popInput(tid);
 
     fetchInfo[tid].inputIndex = 0;
-    fetchInfo[tid].havePC = false;
 }
 
 void
index 114dec0f553b4d0c2a030d048a1d5edb4e91ac2b..ecd6a81ecf176fc3a9618fe417a07950fbb97d57 100644 (file)
@@ -173,11 +173,6 @@ class Fetch2 : public Named
     Stats::Scalar storeInstructions;
     Stats::Scalar amoInstructions;
 
-  public:
-    /** Dump the whole contents of the input buffer.  Useful after a
-     *  prediction changes control flow */
-    void dumpAllInput(ThreadID tid);
-
   protected:
     /** Get a piece of data to work on from the inputBuffer, or 0 if there
      *  is no data. */
@@ -186,6 +181,10 @@ class Fetch2 : public Named
     /** Pop an element off the input buffer, if there are any */
     void popInput(ThreadID tid);
 
+    /** Dump the whole contents of the input buffer.  Useful after a
+     *  prediction changes control flow */
+    void dumpAllInput(ThreadID tid);
+
     /** Update local branch prediction structures from feedback from
      *  Execute. */
     void updateBranchPrediction(const BranchData &branch);
index 3248d54657e376688ff165ec07162cb5380e01d0..b5659ac0da356d6849b3151e5502285c9477f7a8 100644 (file)
@@ -199,7 +199,6 @@ void
 Pipeline::wakeupFetch(ThreadID tid)
 {
     fetch1.wakeupFetch(tid);
-    fetch2.dumpAllInput(tid);
 }
 
 bool