diff options
-rw-r--r-- | dev/ns_gige.cc | 13 | ||||
-rw-r--r-- | dev/pktfifo.hh | 20 | ||||
-rwxr-xr-x | util/stats/stats.py | 4 |
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) |