I tried to increase the writeBuffer size??and my code works like what I want. 
It put all dirty cache-blk to writebuffer and will send writeBackDirty to 
memory controller.But it crash after perfroming several times flush all 
cache-blk. 
The error report is below.


panic: panic condition (sf_item.holder & req_port).none() occurred: 
requester 
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010
 is not a holder :( SF value 
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


 
It seems like I flush some cache-blk that shouldn??t be flush.


My code :


BaseCache::recvTimingReq(pkt){     //some instr will trigger this code 
section     if(trigger){                  wb_pkts.clear();                 
dirty_blk_count = my_memWriteback(wb_pkts);                                
 //doWritebacks(wb_pkts, clockEdge(lat+forwardLatency));                 
while(!wb_pkts.empty()){                         PacketPtr wbPkt = 
wb_pkts.front();                         allocateWriteBuffer(wbPkt, 
clockEdge(lat + forwardLatency));                         wb_pkts.pop_front();  
               } }     
   bool satisfied = false;         {       PacketList writebacks;       
satisfied = access(pkt, blk, lat, writebacks);       ..... }




BaseCache::my_memWriteback(PacketList &wb_pkts) {   int count = 0;   
tags->forEachBlk([this,&count,&wb_pkts](CacheBlk &blk) mutable{  
                     if(blk.isDirty()){                               
if(blk.isValid()){                                       count++;               
             }                       }                       
my_writebackVisitor(blk,wb_pkts);                   });   
//printf("NmemWriteback count:%d\n",count);   return count; }




BaseCache::my_writebackVisitor(CacheBlk &blk,PacketList &writebacks) {  
 if (blk.isDirty()) {       assert(blk.isValid());     /* do make request in 
writebackBlk()      *     RequestPtr request = std::make_shared(           
regenerateBlkAddr(&blk), blkSize, 0, Request::funcMasterId);       
request->taskId(blk.task_id);       if (blk.isSecure()) {           
request->setFlags(Request::SECURE);       }      //will not send request to 
memory controller when MemCmd::WriteClean      PacketPtr packet = new 
Packet(request, MemCmd::WriteClean);      packet->allocate();       
std::memcpy(packet->getPtr, blk.data, blkSize);      *      */
      PacketPtr packet = writebackBlk(&blk);      
//invalidateBlock(&blk)              writebacks.push_back(packet);       
//blk.status &= ~BlkDirty;    } }










And I am confuse on what is the difference among 
MemCmd::WritebackDirty,MemCmd::WritebackClean,and MemCmd::WriteClean.Because I 
run a process which execute _mm_clflush and the gem5 behavior is




4658583000: system.l2cache: sendMSHRQueuePacket: MSHR CleanInvalidReq 
[448760:448760] PoC
4658583000: system.l2cache: Create WriteClean [448740:44877f] PoC writable: 1, 
dirty: 1
4658583000: global: handleSnoop for WriteClean [448740:44877f] ES PoC
4658583001: system.l2cache: sendWriteQueuePacket: write WriteClean 
[448740:44877f] PoC
4658584000: system.l2cache: sendWriteQueuePacket: write WriteClean 
[448740:44877f] PoC
4658584000: system.mem_ctrl: recvTimingReq: request WriteClean addr 4491072 
size 64
4658584000: system.mem_ctrl: Write queue limit 64, current size 3, entries 
needed 1
4658584000: system.mem_ctrl: Address: 4491072 Rank 0 Bank 4 Row 34
4658584000: system.mem_ctrl: Adding to write queue
4658584000: system.mem_ctrl: Responding to Address 4491072.. 4658584000: 
system.mem_ctrl: Done
4658591000: system.l2cache: recvTimingResp: Handling response CleanInvalidResp 
[448760:448760] PoC
 
So I try to make a WriteClean for each dirty cache-blk 
"PacketPtr packet = new Packet(request, MemCmd::WriteClean); "
But it will not send req to memory controller which make me confused. Instead 
WritebackDirty will send req to memory controller.
_______________________________________________
gem5-users mailing list
gem5-users@gem5.org
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users

Reply via email to