summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLisa Hsu <hsul@eecs.umich.edu>2004-11-17 00:04:00 -0500
committerLisa Hsu <hsul@eecs.umich.edu>2004-11-17 00:04:00 -0500
commit62ee766e50ff40bc519bcfda1ad9adfa2a7b6cba (patch)
treedeff5f7f3f73ba32eb224cddaacb3ac8708d9c11
parent95ce45ade93856d3f3dce6536e297f3b6247b481 (diff)
parentee962a6b0bf71b9ca8ce0b3cadc17938266fa162 (diff)
downloadgem5-62ee766e50ff40bc519bcfda1ad9adfa2a7b6cba.tar.xz
Merge zizzer:/bk/m5 into zed.eecs.umich.edu:/z/hsul/work/m5
--HG-- extra : convert_revision : 3ad33afea5aebe67816f7d4e6b24a43636316ffa
-rw-r--r--dev/ns_gige.cc13
-rw-r--r--dev/pktfifo.hh20
-rwxr-xr-xutil/stats/stats.py4
3 files changed, 23 insertions, 14 deletions
diff --git a/dev/ns_gige.cc b/dev/ns_gige.cc
index 401599126..e51e14f1d 100644
--- a/dev/ns_gige.cc
+++ b/dev/ns_gige.cc
@@ -1341,9 +1341,6 @@ NSGigE::rxKick()
// sanity check - i think the driver behaves like this
assert(rxDescCnt >= rxPktBytes);
-
- // Must clear the value before popping to decrement the
- // reference count
rxFifo.pop();
}
@@ -1564,9 +1561,6 @@ NSGigE::transmit()
* besides, it's functionally the same.
*/
devIntrPost(ISR_TXOK);
- } else {
- DPRINTF(Ethernet,
- "May need to rethink always sending the descriptors back?\n");
}
if (!txFifo.empty() && !txEvent.scheduled()) {
@@ -1822,7 +1816,11 @@ NSGigE::txKick()
// this is just because the receive can't handle a
// packet bigger want to make sure
assert(txPacket->length <= 1514);
- txFifo.push(txPacket);
+#ifndef NDEBUG
+ bool success =
+#endif
+ txFifo.push(txPacket);
+ assert(success);
/*
* this following section is not tqo spec, but
@@ -1903,6 +1901,7 @@ NSGigE::txKick()
txPacketBufPtr += txXferLen;
txFragPtr += txXferLen;
txDescCnt -= txXferLen;
+ txFifo.reserve(txXferLen);
txState = txFifoBlock;
break;
diff --git a/dev/pktfifo.hh b/dev/pktfifo.hh
index a54a49996..0b2e95e2a 100644
--- a/dev/pktfifo.hh
+++ b/dev/pktfifo.hh
@@ -43,6 +43,7 @@ class PacketFifo
std::list<PacketPtr> fifo;
int _maxsize;
int _size;
+ int _reserved;
public:
explicit PacketFifo(int max) : _maxsize(max), _size(0) {}
@@ -50,18 +51,27 @@ class PacketFifo
int maxsize() const { return _maxsize; }
int packets() const { return fifo.size(); }
- int size() const { return _size; }
- int avail() const { return _maxsize - _size; }
- bool empty() const { return _size == 0; }
- bool full() const { return _size >= _maxsize; }
+ int size() const { return _size + _reserved; }
+ int avail() const { return maxsize() - size(); }
+ bool empty() const { return size() == 0; }
+ bool full() const { return size() >= maxsize(); }
+
+ int reserve(int len = 0)
+ {
+ _reserved += len;
+ assert(avail() >= 0);
+ return _reserved;
+ }
bool push(PacketPtr ptr)
{
- if (avail() < ptr->length)
+ assert(_reserved <= ptr->length);
+ if (avail() < ptr->length - _reserved)
return false;
_size += ptr->length;
fifo.push_back(ptr);
+ _reserved = 0;
return true;
}
diff --git a/util/stats/stats.py b/util/stats/stats.py
index 233eab521..8ec889f09 100755
--- a/util/stats/stats.py
+++ b/util/stats/stats.py
@@ -132,8 +132,6 @@ def commands(options, command, args):
info.source.connect()
info.source.update_dict(globals())
- system = info.source.__dict__[options.system]
-
if type(options.get) is str:
info.source.get = options.get
@@ -232,6 +230,8 @@ def commands(options, command, args):
if len(args):
raise CommandException
+ system = info.source.__dict__[options.system]
+
if command == 'usertime':
import copy
kernel = copy.copy(system.full_cpu.numCycles)