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 ---