cpu: Remove the "profile" parameter and plumbing.
authorGabe Black <gabeblack@google.com>
Wed, 5 Aug 2020 06:25:25 +0000 (23:25 -0700)
committerGabe Black <gabeblack@google.com>
Wed, 5 Aug 2020 23:58:53 +0000 (23:58 +0000)
This parameter is associated with a periodic event which would take a
sample for a kernel profile in FS mode. Unfortunately the only ISA which
had working versions of the necessary classes was alpha, and that has
been deleted. That means that without additional work for any given ISA,
the profile parameter has no chance of working.

Ideally, this parameter should be moved to the Workload classes. There
it can intrinsically be tied to a particular kernel, rather than having
to assume a particular kernel and gate everything on whether you're in
FS mode.

Because this isn't (IMHO) where this parameter should live in the long
term, and because it's currently unusable without additional development
for each of the ISAs, I think it makes the most sense to remove the
front end for this mechanism from the CPU.

Since the sampling/profiling mechanism itself could be useful and could
be re-plumbed somewhere else, the back end and its classes are left alone.

Change-Id: I2a3319c1d5ad0ef8c99f5d35953b93c51b2a8a0b
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/32214
Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
15 files changed:
src/arch/arm/fastmodel/iris/thread_context.hh
src/cpu/BaseCPU.py
src/cpu/base.cc
src/cpu/base.hh
src/cpu/checker/thread_context.hh
src/cpu/o3/commit_impl.hh
src/cpu/o3/thread_context.hh
src/cpu/o3/thread_context_impl.hh
src/cpu/o3/thread_state.hh
src/cpu/simple/base.cc
src/cpu/simple_thread.cc
src/cpu/simple_thread.hh
src/cpu/thread_context.hh
src/cpu/thread_state.cc
src/cpu/thread_state.hh

index 8386e235e41ef68f4bbbe6dc73b6a3035dacea15..363e1d7066130bb257ed9f5c16117c7d9d4cb226 100644 (file)
@@ -237,12 +237,6 @@ class ThreadContext : public ::ThreadContext
     void suspend() override { setStatus(Suspended); }
     void halt() override { setStatus(Halted); }
 
-    void
-    dumpFuncProfile() override
-    {
-        panic("%s not implemented.", __FUNCTION__);
-    }
-
     void
     takeOverFrom(::ThreadContext *old_context) override
     {
@@ -263,17 +257,6 @@ class ThreadContext : public ::ThreadContext
         panic("%s not implemented.", __FUNCTION__);
     }
 
-    void
-    profileClear() override
-    {
-        panic("%s not implemented.", __FUNCTION__);
-    }
-    void
-    profileSample() override
-    {
-        panic("%s not implemented.", __FUNCTION__);
-    }
-
     void
     copyArchRegs(::ThreadContext *tc) override
     {
index e487cbb6bf519f93c0fe6e4209ae223d54420cae..96e96fc719e621d4e1a3432299d6dd1b6cc09fa0 100644 (file)
@@ -148,8 +148,6 @@ class BaseCPU(ClockedObject):
     do_statistics_insts = Param.Bool(True,
         "enable statistics pseudo instructions")
 
-    profile = Param.Latency('0ns', "trace the kernel stack")
-
     wait_for_remote_gdb = Param.Bool(False,
         "Wait for a remote GDB connection");
 
index c90314565430a266a6d7042321ce3cdfa9cb07cb..084c1e52963af26583fa3ec49eafb57c3a6bba8d 100644 (file)
@@ -54,7 +54,6 @@
 #include "base/output.hh"
 #include "base/trace.hh"
 #include "cpu/checker/cpu.hh"
-#include "cpu/profile.hh"
 #include "cpu/thread_context.hh"
 #include "debug/Mwait.hh"
 #include "debug/SyscallVerbose.hh"
@@ -127,8 +126,7 @@ BaseCPU::BaseCPU(Params *p, bool is_checker)
       _dataMasterId(p->system->getMasterId(this, "data")),
       _taskId(ContextSwitchTaskId::Unknown), _pid(invldPid),
       _switchedOut(p->switched_out), _cacheLineSize(p->system->cacheLineSize()),
-      interrupts(p->interrupts), profileEvent(NULL),
-      numThreads(p->numThreads), system(p->system),
+      interrupts(p->interrupts), numThreads(p->numThreads), system(p->system),
       previousCycle(0), previousState(CPU_STATE_SLEEP),
       functionTraceStream(nullptr), currentFunctionStart(0),
       currentFunctionEnd(0), functionEntryTick(0),
@@ -169,12 +167,6 @@ BaseCPU::BaseCPU(Params *p, bool is_checker)
         }
     }
 
-    if (FullSystem) {
-        if (params()->profile)
-            profileEvent = new EventFunctionWrapper(
-                [this]{ processProfileEvent(); },
-                name());
-    }
     tracer = params()->tracer;
 
     if (params()->isa.size() != numThreads) {
@@ -191,7 +183,6 @@ BaseCPU::enableFunctionTrace()
 
 BaseCPU::~BaseCPU()
 {
-    delete profileEvent;
 }
 
 void
@@ -307,11 +298,6 @@ BaseCPU::init()
 void
 BaseCPU::startup()
 {
-    if (FullSystem) {
-        if (!params()->switched_out && profileEvent)
-            schedule(profileEvent, curTick());
-    }
-
     if (params()->progress_interval) {
         new CPUProgressEvent(this, params()->progress_interval);
     }
@@ -536,8 +522,6 @@ BaseCPU::switchOut()
 {
     assert(!_switchedOut);
     _switchedOut = true;
-    if (profileEvent && profileEvent->scheduled())
-        deschedule(profileEvent);
 
     // Flush all TLBs in the CPU to avoid having stale translations if
     // it gets switched in later.
@@ -628,14 +612,6 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU)
     }
     oldCPU->interrupts.clear();
 
-    if (FullSystem) {
-        for (ThreadID i = 0; i < size; ++i)
-            threadContexts[i]->profileClear();
-
-        if (profileEvent)
-            schedule(profileEvent, curTick());
-    }
-
     // All CPUs have an instruction and a data port, and the new CPU's
     // ports are dangling while the old CPU has its ports connected
     // already. Unbind the old CPU and then bind the ports of the one
@@ -660,17 +636,6 @@ BaseCPU::flushTLBs()
     }
 }
 
-void
-BaseCPU::processProfileEvent()
-{
-    ThreadID size = threadContexts.size();
-
-    for (ThreadID i = 0; i < size; ++i)
-        threadContexts[i]->profileSample();
-
-    schedule(profileEvent, curTick() + params()->profile);
-}
-
 void
 BaseCPU::serialize(CheckpointOut &cp) const
 {
index b9456a92644bf3df211c08507a4d9ed460cb6cff..2b4ac3cfdb104660a7ba63525df6c2218484c2bc 100644 (file)
@@ -257,9 +257,6 @@ class BaseCPU : public ClockedObject
         return FullSystem && interrupts[tid]->checkInterrupts();
     }
 
-    void processProfileEvent();
-    EventFunctionWrapper * profileEvent;
-
   protected:
     std::vector<ThreadContext *> threadContexts;
 
index 620522232aadafc17edb98f96606d12791cb43c9..06cb3b9a065e5a3e0b1e343e8f12be4802876924 100644 (file)
@@ -196,8 +196,6 @@ class CheckerThreadContext : public ThreadContext
     /// Set the status to Halted.
     void halt() override { actualTC->halt(); }
 
-    void dumpFuncProfile() override { actualTC->dumpFuncProfile(); }
-
     void
     takeOverFrom(ThreadContext *oldContext) override
     {
@@ -215,9 +213,6 @@ class CheckerThreadContext : public ThreadContext
     Tick readLastActivate() override { return actualTC->readLastActivate(); }
     Tick readLastSuspend() override { return actualTC->readLastSuspend(); }
 
-    void profileClear() override { return actualTC->profileClear(); }
-    void profileSample() override { return actualTC->profileSample(); }
-
     // @todo: Do I need this?
     void
     copyArchRegs(ThreadContext *tc) override
index 49b40e3f57692eccf76e62bc7b3ee398ff37cd84..c1704841f2bb4a8cc529b2b87af4534c61858246 100644 (file)
@@ -1281,14 +1281,6 @@ DefaultCommit<Impl>::commitHead(const DynInstPtr &head_inst, unsigned inst_num)
     updateComInstStats(head_inst);
 
     if (FullSystem) {
-        if (thread[tid]->profile) {
-            thread[tid]->profilePC = head_inst->instAddr();
-            ProfileNode *node = thread[tid]->profile->consume(
-                    thread[tid]->getTC(), head_inst->staticInst);
-
-            if (node)
-                thread[tid]->profileNode = node;
-        }
         if (CPA::available()) {
             if (head_inst->isControl()) {
                 ThreadContext *tc = thread[tid]->getTC();
index b1c47d2b90b471bdcd711223a684ed64898501b1..f710613f71b7e6dc8964dfa8c8e423c67d5d45a3 100644 (file)
@@ -172,11 +172,6 @@ class O3ThreadContext : public ThreadContext
     /** Set the status to Halted. */
     void halt() override;
 
-    /** Dumps the function profiling information.
-     * @todo: Implement.
-     */
-    void dumpFuncProfile() override;
-
     /** Takes over execution of a thread from another CPU. */
     void takeOverFrom(ThreadContext *old_context) override;
 
@@ -185,11 +180,6 @@ class O3ThreadContext : public ThreadContext
     /** Reads the last tick that this thread was suspended on. */
     Tick readLastSuspend() override;
 
-    /** Clears the function profiling information. */
-    void profileClear() override;
-    /** Samples the function profiling information. */
-    void profileSample() override;
-
     /** Copies the architectural registers from another TC into this TC. */
     void copyArchRegs(ThreadContext *tc) override;
 
index 588db15efd291f51c0f5b3370e5efb9c367007a3..a5db7641c0999361bc7bf103bc9b613e85ffdbca 100644 (file)
@@ -55,13 +55,6 @@ O3ThreadContext<Impl>::getVirtProxy()
     return thread->getVirtProxy();
 }
 
-template <class Impl>
-void
-O3ThreadContext<Impl>::dumpFuncProfile()
-{
-    thread->dumpFuncProfile();
-}
-
 template <class Impl>
 void
 O3ThreadContext<Impl>::takeOverFrom(ThreadContext *old_context)
@@ -153,20 +146,6 @@ O3ThreadContext<Impl>::readLastSuspend()
     return thread->lastSuspend;
 }
 
-template <class Impl>
-void
-O3ThreadContext<Impl>::profileClear()
-{
-    thread->profileClear();
-}
-
-template <class Impl>
-void
-O3ThreadContext<Impl>::profileSample()
-{
-    thread->profileSample();
-}
-
 template <class Impl>
 void
 O3ThreadContext<Impl>::copyArchRegs(ThreadContext *tc)
index 30320bc529169df8db678909c8e43e06ea23ef40..757671a84c5a4516aac8aacd6e8367d77cdd4842 100644 (file)
@@ -41,7 +41,6 @@
 #ifndef __CPU_O3_THREAD_STATE_HH__
 #define __CPU_O3_THREAD_STATE_HH__
 
-#include "arch/stacktrace.hh"
 #include "base/callback.hh"
 #include "base/compiler.hh"
 #include "base/output.hh"
@@ -52,9 +51,7 @@
 
 class Event;
 class FunctionalMemory;
-class FunctionProfile;
 class Process;
-class ProfileNode;
 
 /**
  * Class that has various thread state, such as the status, the
@@ -100,24 +97,6 @@ struct O3ThreadState : public ThreadState {
           comInstEventQueue("instruction-based event queue"),
           noSquashFromTC(false), trapPending(false), tc(nullptr)
     {
-        if (!FullSystem)
-            return;
-
-        if (cpu->params()->profile) {
-            profile = new FunctionProfile(
-                    m5::make_unique<TheISA::StackTrace>(),
-                    cpu->params()->system->workload->symtab(tc));
-            Callback *cb =
-                new MakeCallback<O3ThreadState,
-                &O3ThreadState::dumpFuncProfile>(this);
-            registerExitCallback(cb);
-        }
-
-        // let's fill with a dummy node for now so we don't get a segfault
-        // on the first cycle when there's no node available.
-        static ProfileNode dummyNode;
-        profileNode = &dummyNode;
-        profilePC = 3;
     }
 
     void serialize(CheckpointOut &cp) const override
@@ -152,14 +131,6 @@ struct O3ThreadState : public ThreadState {
     {
         process->syscall(tc, fault);
     }
-
-    void dumpFuncProfile()
-    {
-        OutputStream *os(
-            simout.create(csprintf("profile.%s.dat", cpu->name())));
-        profile->dump(*os->stream());
-        simout.close(os);
-    }
 };
 
 #endif // __CPU_O3_THREAD_STATE_HH__
index 1dac921f60277d35cff7cc4c6a4e2a618b7a3997..c9db86c3adebfc99debb1e7565bf2d059b12a01d 100644 (file)
@@ -41,7 +41,6 @@
 
 #include "cpu/simple/base.hh"
 
-#include "arch/stacktrace.hh"
 #include "arch/utility.hh"
 #include "base/cp_annotate.hh"
 #include "base/cprintf.hh"
@@ -57,7 +56,6 @@
 #include "cpu/checker/thread_context.hh"
 #include "cpu/exetrace.hh"
 #include "cpu/pred/bpred_unit.hh"
-#include "cpu/profile.hh"
 #include "cpu/simple/exec_context.hh"
 #include "cpu/simple_thread.hh"
 #include "cpu/smt.hh"
@@ -573,20 +571,11 @@ void
 BaseSimpleCPU::postExecute()
 {
     SimpleExecContext &t_info = *threadInfo[curThread];
-    SimpleThread* thread = t_info.thread;
 
     assert(curStaticInst);
 
     TheISA::PCState pc = threadContexts[curThread]->pcState();
     Addr instAddr = pc.instAddr();
-    if (FullSystem && thread->profile) {
-        bool usermode = TheISA::inUserMode(threadContexts[curThread]);
-        thread->profilePC = usermode ? 1 : instAddr;
-        ProfileNode *node = thread->profile->consume(threadContexts[curThread],
-                                                     curStaticInst);
-        if (node)
-            thread->profileNode = node;
-    }
 
     if (curStaticInst->isMemRef()) {
         t_info.numMemRefs++;
index 4efe6c169136ae08938c4386eb11f29d4b17a9f1..1d2c0b83746dfbe91a841ce8f29d79066a6d0e8c 100644 (file)
@@ -43,7 +43,6 @@
 #include <string>
 
 #include "arch/isa_traits.hh"
-#include "arch/stacktrace.hh"
 #include "arch/utility.hh"
 #include "base/callback.hh"
 #include "base/compiler.hh"
@@ -52,7 +51,6 @@
 #include "base/trace.hh"
 #include "config/the_isa.hh"
 #include "cpu/base.hh"
-#include "cpu/profile.hh"
 #include "cpu/thread_context.hh"
 #include "mem/se_translating_port_proxy.hh"
 #include "mem/translating_port_proxy.hh"
@@ -91,21 +89,6 @@ SimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num, System *_sys,
     assert(isa);
 
     clearArchRegs();
-
-    if (baseCpu->params()->profile) {
-        profile = new FunctionProfile(m5::make_unique<TheISA::StackTrace>(),
-                                      system->workload->symtab(this));
-        Callback *cb =
-            new MakeCallback<SimpleThread,
-            &SimpleThread::dumpFuncProfile>(this);
-        registerExitCallback(cb);
-    }
-
-    // let's fill with a dummy node for now so we don't get a segfault
-    // on the first cycle when there's no node available.
-    static ProfileNode dummyNode;
-    profileNode = &dummyNode;
-    profilePC = 3;
 }
 
 void
@@ -148,14 +131,6 @@ SimpleThread::unserialize(CheckpointIn &cp)
     ::unserialize(*this, cp);
 }
 
-void
-SimpleThread::dumpFuncProfile()
-{
-    OutputStream *os(simout.create(csprintf("profile.%s.dat", baseCpu->name())));
-    profile->dump(*os->stream());
-    simout.close(os);
-}
-
 void
 SimpleThread::activate()
 {
index d62fa0eb573bc05148622c7fde6e9156bc0b592f..612174ccb91313301394a9a505386708965987f3 100644 (file)
@@ -71,9 +71,6 @@
 class BaseCPU;
 class CheckerCPU;
 
-class FunctionProfile;
-class ProfileNode;
-
 /**
  * The SimpleThread object provides a combination of the ThreadState
  * object and the ThreadContext interface. It implements the
@@ -179,8 +176,6 @@ class SimpleThread : public ThreadState, public ThreadContext
         dtb->demapPage(vaddr, asn);
     }
 
-    void dumpFuncProfile() override;
-
     /*******************************************
      * ThreadContext interface functions.
      ******************************************/
@@ -260,9 +255,6 @@ class SimpleThread : public ThreadState, public ThreadContext
         return ThreadState::readLastSuspend();
     }
 
-    void profileClear() override { ThreadState::profileClear(); }
-    void profileSample() override { ThreadState::profileSample(); }
-
     void copyArchRegs(ThreadContext *tc) override;
 
     void
index 6ebb191bd64e1c760986e30a69d9c10c827420e4..8ca2c5059ac23065f2ec616492c9a1662bdf9bcd 100644 (file)
@@ -177,8 +177,6 @@ class ThreadContext : public PCEventScope
     /// Quiesce, suspend, and schedule activate at resume
     void quiesceTick(Tick resume);
 
-    virtual void dumpFuncProfile() = 0;
-
     virtual void takeOverFrom(ThreadContext *old_context) = 0;
 
     virtual void regStats(const std::string &name) {};
@@ -192,9 +190,6 @@ class ThreadContext : public PCEventScope
     virtual Tick readLastActivate() = 0;
     virtual Tick readLastSuspend() = 0;
 
-    virtual void profileClear() = 0;
-    virtual void profileSample() = 0;
-
     virtual void copyArchRegs(ThreadContext *tc) = 0;
 
     virtual void clearArchRegs() = 0;
index f4859f6d69e58f990d2b70aacbd4bed0de718108..f681abc576cf422466bd29aa04750c857d0f1344 100644 (file)
@@ -30,7 +30,6 @@
 
 #include "base/output.hh"
 #include "cpu/base.hh"
-#include "cpu/profile.hh"
 #include "mem/port.hh"
 #include "mem/port_proxy.hh"
 #include "mem/se_translating_port_proxy.hh"
@@ -43,7 +42,6 @@ ThreadState::ThreadState(BaseCPU *cpu, ThreadID _tid, Process *_process)
     : numInst(0), numOp(0), numLoad(0), startNumLoad(0),
       _status(ThreadContext::Halted), baseCpu(cpu),
       _contextId(0), _threadId(_tid), lastActivate(0), lastSuspend(0),
-      profile(NULL), profileNode(NULL), profilePC(0),
       process(_process), physProxy(NULL), virtProxy(NULL),
       funcExeInst(0), storeCondFailures(0)
 {
@@ -118,17 +116,3 @@ ThreadState::getVirtProxy()
     assert(virtProxy != NULL);
     return *virtProxy;
 }
-
-void
-ThreadState::profileClear()
-{
-    if (profile)
-        profile->clear();
-}
-
-void
-ThreadState::profileSample()
-{
-    if (profile)
-        profile->sample(profileNode, profilePC);
-}
index e3f68b19aa8a7a473598ee656f8ca0d23cd4a32e..1cc92a1750f80e5d5cfcd7d0b9484b47d185ecb2 100644 (file)
 #include "arch/types.hh"
 #include "config/the_isa.hh"
 #include "cpu/base.hh"
-#include "cpu/profile.hh"
 #include "cpu/thread_context.hh"
 #include "sim/process.hh"
 
-class FunctionProfile;
-class ProfileNode;
-
 class Checkpoint;
 
 /**
@@ -82,12 +78,6 @@ struct ThreadState : public Serializable {
      */
     void initMemProxies(ThreadContext *tc);
 
-    void dumpFuncProfile();
-
-    void profileClear();
-
-    void profileSample();
-
     PortProxy &getPhysProxy();
 
     PortProxy &getVirtProxy();
@@ -152,11 +142,6 @@ struct ThreadState : public Serializable {
     /** Last time suspend was called on this thread. */
     Tick lastSuspend;
 
-  public:
-    FunctionProfile *profile;
-    ProfileNode *profileNode;
-    Addr profilePC;
-
   protected:
     Process *process;