bridge.cc (4965:ad0e792a5c78) | bridge.cc (4986:b7c82ad6b3ef) |
---|---|
1 2/* 3 * Copyright (c) 2006 The Regents of The University of Michigan 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright --- 105 unchanged lines hidden (view full) --- 114bool 115Bridge::BridgePort::recvTiming(PacketPtr pkt) 116{ 117 DPRINTF(BusBridge, "recvTiming: src %d dest %d addr 0x%x\n", 118 pkt->getSrc(), pkt->getDest(), pkt->getAddr()); 119 120 DPRINTF(BusBridge, "Local queue size: %d outreq: %d outresp: %d\n", 121 sendQueue.size(), queuedRequests, outstandingResponses); | 1 2/* 3 * Copyright (c) 2006 The Regents of The University of Michigan 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright --- 105 unchanged lines hidden (view full) --- 114bool 115Bridge::BridgePort::recvTiming(PacketPtr pkt) 116{ 117 DPRINTF(BusBridge, "recvTiming: src %d dest %d addr 0x%x\n", 118 pkt->getSrc(), pkt->getDest(), pkt->getAddr()); 119 120 DPRINTF(BusBridge, "Local queue size: %d outreq: %d outresp: %d\n", 121 sendQueue.size(), queuedRequests, outstandingResponses); |
122 DPRINTF(BusBridge, "Remove queue size: %d outreq: %d outresp: %d\n", | 122 DPRINTF(BusBridge, "Remote queue size: %d outreq: %d outresp: %d\n", |
123 otherPort->sendQueue.size(), otherPort->queuedRequests, 124 otherPort->outstandingResponses); 125 | 123 otherPort->sendQueue.size(), otherPort->queuedRequests, 124 otherPort->outstandingResponses); 125 |
126 if (pkt->isRequest() && otherPort->reqQueueFull() && !pkt->wasNacked()) { | 126 if (pkt->isRequest() && otherPort->reqQueueFull()) { |
127 DPRINTF(BusBridge, "Remote queue full, nacking\n"); 128 nackRequest(pkt); 129 return true; 130 } 131 | 127 DPRINTF(BusBridge, "Remote queue full, nacking\n"); 128 nackRequest(pkt); 129 return true; 130 } 131 |
132 if (pkt->needsResponse() && !pkt->wasNacked()) | 132 if (pkt->needsResponse()) |
133 if (respQueueFull()) { 134 DPRINTF(BusBridge, "Local queue full, no space for response, nacking\n"); 135 DPRINTF(BusBridge, "queue size: %d outreq: %d outstanding resp: %d\n", 136 sendQueue.size(), queuedRequests, outstandingResponses); 137 nackRequest(pkt); 138 return true; 139 } else { 140 DPRINTF(BusBridge, "Request Needs response, reserving space\n"); --- 4 unchanged lines hidden (view full) --- 145 146 return true; 147} 148 149void 150Bridge::BridgePort::nackRequest(PacketPtr pkt) 151{ 152 // Nack the packet | 133 if (respQueueFull()) { 134 DPRINTF(BusBridge, "Local queue full, no space for response, nacking\n"); 135 DPRINTF(BusBridge, "queue size: %d outreq: %d outstanding resp: %d\n", 136 sendQueue.size(), queuedRequests, outstandingResponses); 137 nackRequest(pkt); 138 return true; 139 } else { 140 DPRINTF(BusBridge, "Request Needs response, reserving space\n"); --- 4 unchanged lines hidden (view full) --- 145 146 return true; 147} 148 149void 150Bridge::BridgePort::nackRequest(PacketPtr pkt) 151{ 152 // Nack the packet |
153 pkt->makeTimingResponse(); |
|
153 pkt->setNacked(); | 154 pkt->setNacked(); |
154 pkt->setDest(pkt->getSrc()); | |
155 156 //put it on the list to send 157 Tick readyTime = curTick + nackDelay; 158 PacketBuffer *buf = new PacketBuffer(pkt, readyTime, true); 159 160 // nothing on the list, add it and we're done 161 if (sendQueue.empty()) { 162 assert(!sendEvent.scheduled()); --- 27 unchanged lines hidden (view full) --- 190 } 191 assert(done); 192} 193 194 195void 196Bridge::BridgePort::queueForSendTiming(PacketPtr pkt) 197{ | 155 156 //put it on the list to send 157 Tick readyTime = curTick + nackDelay; 158 PacketBuffer *buf = new PacketBuffer(pkt, readyTime, true); 159 160 // nothing on the list, add it and we're done 161 if (sendQueue.empty()) { 162 assert(!sendEvent.scheduled()); --- 27 unchanged lines hidden (view full) --- 190 } 191 assert(done); 192} 193 194 195void 196Bridge::BridgePort::queueForSendTiming(PacketPtr pkt) 197{ |
198 if (pkt->isResponse() || pkt->wasNacked()) { | 198 if (pkt->isResponse()) { |
199 // This is a response for a request we forwarded earlier. The 200 // corresponding PacketBuffer should be stored in the packet's 201 // senderState field. | 199 // This is a response for a request we forwarded earlier. The 200 // corresponding PacketBuffer should be stored in the packet's 201 // senderState field. |
202 |
|
202 PacketBuffer *buf = dynamic_cast<PacketBuffer*>(pkt->senderState); 203 assert(buf != NULL); 204 // set up new packet dest & senderState based on values saved 205 // from original request 206 buf->fixResponse(pkt); 207 | 203 PacketBuffer *buf = dynamic_cast<PacketBuffer*>(pkt->senderState); 204 assert(buf != NULL); 205 // set up new packet dest & senderState based on values saved 206 // from original request 207 buf->fixResponse(pkt); 208 |
208 // Check if this packet was expecting a response and it's a nacked 209 // packet, in which case we will never being seeing it 210 if (buf->expectResponse && pkt->wasNacked()) 211 --outstandingResponses; 212 | |
213 DPRINTF(BusBridge, "response, new dest %d\n", pkt->getDest()); 214 delete buf; 215 } 216 217 | 209 DPRINTF(BusBridge, "response, new dest %d\n", pkt->getDest()); 210 delete buf; 211 } 212 213 |
218 if (pkt->isRequest() && !pkt->wasNacked()) { | 214 if (pkt->isRequest()) { |
219 ++queuedRequests; 220 } 221 222 223 224 Tick readyTime = curTick + delay; 225 PacketBuffer *buf = new PacketBuffer(pkt, readyTime); 226 --- 17 unchanged lines hidden (view full) --- 244 assert(buf->ready <= curTick); 245 246 PacketPtr pkt = buf->pkt; 247 248 DPRINTF(BusBridge, "trySend: origSrc %d dest %d addr 0x%x\n", 249 buf->origSrc, pkt->getDest(), pkt->getAddr()); 250 251 bool wasReq = pkt->isRequest(); | 215 ++queuedRequests; 216 } 217 218 219 220 Tick readyTime = curTick + delay; 221 PacketBuffer *buf = new PacketBuffer(pkt, readyTime); 222 --- 17 unchanged lines hidden (view full) --- 240 assert(buf->ready <= curTick); 241 242 PacketPtr pkt = buf->pkt; 243 244 DPRINTF(BusBridge, "trySend: origSrc %d dest %d addr 0x%x\n", 245 buf->origSrc, pkt->getDest(), pkt->getAddr()); 246 247 bool wasReq = pkt->isRequest(); |
252 bool wasNacked = pkt->wasNacked(); | 248 bool was_nacked_here = buf->nackedHere; |
253 | 249 |
250 // If the send was successful, make sure sender state was set to NULL 251 // otherwise we could get a NACK back of a packet that didn't expect a 252 // response and we would try to use freed memory. 253 254 Packet::SenderState *old_sender_state = pkt->senderState; 255 if (pkt->isRequest() && !buf->expectResponse) 256 pkt->senderState = NULL; 257 |
|
254 if (sendTiming(pkt)) { 255 // send successful 256 sendQueue.pop_front(); 257 buf->pkt = NULL; // we no longer own packet, so it's not safe to look at it 258 259 if (buf->expectResponse) { 260 // Must wait for response 261 DPRINTF(BusBridge, " successful: awaiting response (%d)\n", 262 outstandingResponses); 263 } else { 264 // no response expected... deallocate packet buffer now. 265 DPRINTF(BusBridge, " successful: no response expected\n"); 266 delete buf; 267 } 268 | 258 if (sendTiming(pkt)) { 259 // send successful 260 sendQueue.pop_front(); 261 buf->pkt = NULL; // we no longer own packet, so it's not safe to look at it 262 263 if (buf->expectResponse) { 264 // Must wait for response 265 DPRINTF(BusBridge, " successful: awaiting response (%d)\n", 266 outstandingResponses); 267 } else { 268 // no response expected... deallocate packet buffer now. 269 DPRINTF(BusBridge, " successful: no response expected\n"); 270 delete buf; 271 } 272 |
269 if (!wasNacked) { 270 if (wasReq) 271 --queuedRequests; 272 else 273 --outstandingResponses; 274 } | 273 if (wasReq) 274 --queuedRequests; 275 else if (!was_nacked_here) 276 --outstandingResponses; |
275 276 // If there are more packets to send, schedule event to try again. 277 if (!sendQueue.empty()) { 278 buf = sendQueue.front(); 279 DPRINTF(BusBridge, "Scheduling next send\n"); 280 sendEvent.schedule(std::max(buf->ready, curTick + 1)); 281 } 282 } else { 283 DPRINTF(BusBridge, " unsuccessful\n"); | 277 278 // If there are more packets to send, schedule event to try again. 279 if (!sendQueue.empty()) { 280 buf = sendQueue.front(); 281 DPRINTF(BusBridge, "Scheduling next send\n"); 282 sendEvent.schedule(std::max(buf->ready, curTick + 1)); 283 } 284 } else { 285 DPRINTF(BusBridge, " unsuccessful\n"); |
286 pkt->senderState = old_sender_state; |
|
284 inRetry = true; 285 } | 287 inRetry = true; 288 } |
289 |
|
286 DPRINTF(BusBridge, "trySend: queue size: %d outreq: %d outstanding resp: %d\n", 287 sendQueue.size(), queuedRequests, outstandingResponses); 288} 289 290 291void 292Bridge::BridgePort::recvRetry() 293{ --- 54 unchanged lines hidden --- | 290 DPRINTF(BusBridge, "trySend: queue size: %d outreq: %d outstanding resp: %d\n", 291 sendQueue.size(), queuedRequests, outstandingResponses); 292} 293 294 295void 296Bridge::BridgePort::recvRetry() 297{ --- 54 unchanged lines hidden --- |