changeset 5e7599457b97 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=5e7599457b97
description:
dev: Add 'simLength' parameter in EthPacketData
Currently, all the network devices create a 16K buffer for the 'data'
field
in EthPacketData, and use 'length' to keep track of the size of the
packet
in the buffer. This patch introduces the 'simLength' parameter to
EthPacketData, which is used to hold the effective length of the packet
used
for all timing calulations in the simulator. Serialization is
performed using
only the useful data in the packet ('length') and not necessarily the
entire
original buffer.
diffstat:
src/dev/net/dist_etherlink.cc | 4 ++--
src/dev/net/dist_iface.cc | 9 +++++----
src/dev/net/dist_packet.hh | 6 ++++++
src/dev/net/etherbus.cc | 2 +-
src/dev/net/etherlink.cc | 6 +++---
src/dev/net/etherpkt.cc | 8 +++++++-
src/dev/net/etherpkt.hh | 24 ++++++++++++++----------
src/dev/net/etherswitch.cc | 2 +-
src/dev/net/ethertap.cc | 1 +
src/dev/net/i8254xGBe.cc | 7 +++++--
src/dev/net/ns_gige.cc | 6 ++++--
src/dev/net/pktfifo.cc | 2 +-
src/dev/net/sinic.cc | 3 ++-
src/dev/net/tcp_iface.cc | 1 +
14 files changed, 53 insertions(+), 28 deletions(-)
diffs (truncated from 333 to 300 lines):
diff -r 7d4d424c9f17 -r 5e7599457b97 src/dev/net/dist_etherlink.cc
--- a/src/dev/net/dist_etherlink.cc Wed Oct 26 22:48:28 2016 -0400
+++ b/src/dev/net/dist_etherlink.cc Wed Oct 26 22:48:33 2016 -0400
@@ -197,7 +197,7 @@
}
packet = pkt;
- Tick delay = (Tick)ceil(((double)pkt->length * ticksPerByte) + 1.0);
+ Tick delay = (Tick)ceil(((double)pkt->simLength * ticksPerByte) + 1.0);
if (delayVar != 0)
delay += random_mt.random<Tick>(0, delayVar);
@@ -233,7 +233,7 @@
bool packet_exists;
UNSERIALIZE_SCALAR(packet_exists);
if (packet_exists) {
- packet = make_shared<EthPacketData>(16384);
+ packet = make_shared<EthPacketData>();
packet->unserialize("packet", cp);
}
diff -r 7d4d424c9f17 -r 5e7599457b97 src/dev/net/dist_iface.cc
--- a/src/dev/net/dist_iface.cc Wed Oct 26 22:48:28 2016 -0400
+++ b/src/dev/net/dist_iface.cc Wed Oct 26 22:48:33 2016 -0400
@@ -407,7 +407,7 @@
Desc d = descQueue.front();
descQueue.pop();
d.sendTick = curTick();
- d.sendDelay = d.packet->size(); // assume 1 tick/byte max link speed
+ d.sendDelay = d.packet->simLength; // assume 1 tick/byte max link speed
v.push_back(d);
}
@@ -493,7 +493,7 @@
{
UNSERIALIZE_SCALAR(sendTick);
UNSERIALIZE_SCALAR(sendDelay);
- packet = std::make_shared<EthPacketData>(16384);
+ packet = std::make_shared<EthPacketData>();
packet->unserialize("rxPacket", cp);
}
@@ -583,14 +583,15 @@
header.sendTick = curTick();
header.sendDelay = send_delay;
- header.dataPacketLength = pkt->size();
+ header.dataPacketLength = pkt->length;
+ header.simLength = pkt->simLength;
// Send out the packet and the meta info.
sendPacket(header, pkt);
DPRINTF(DistEthernetPkt,
"DistIface::sendDataPacket() done size:%d send_delay:%llu\n",
- pkt->size(), send_delay);
+ pkt->length, send_delay);
}
void
diff -r 7d4d424c9f17 -r 5e7599457b97 src/dev/net/dist_packet.hh
--- a/src/dev/net/dist_packet.hh Wed Oct 26 22:48:28 2016 -0400
+++ b/src/dev/net/dist_packet.hh Wed Oct 26 22:48:33 2016 -0400
@@ -86,6 +86,11 @@
*/
MsgType msgType;
Tick sendTick;
+ /**
+ * Length used for modeling timing in the simulator.
+ * (from EthPacketData::simLength).
+ */
+ unsigned simLength;
union {
Tick sendDelay;
Tick syncRepeat;
@@ -93,6 +98,7 @@
union {
/**
* Actual length of the simulated Ethernet packet.
+ * (from EthPacketData::length).
*/
unsigned dataPacketLength;
struct {
diff -r 7d4d424c9f17 -r 5e7599457b97 src/dev/net/etherbus.cc
--- a/src/dev/net/etherbus.cc Wed Oct 26 22:48:28 2016 -0400
+++ b/src/dev/net/etherbus.cc Wed Oct 26 22:48:33 2016 -0400
@@ -98,7 +98,7 @@
packet = pkt;
sender = sndr;
- int delay = (int)ceil(((double)pkt->length * ticksPerByte) + 1.0);
+ int delay = (int)ceil(((double)pkt->simLength * ticksPerByte) + 1.0);
DPRINTF(Ethernet, "scheduling packet: delay=%d, (rate=%f)\n",
delay, ticksPerByte);
schedule(event, curTick() + delay);
diff -r 7d4d424c9f17 -r 5e7599457b97 src/dev/net/etherlink.cc
--- a/src/dev/net/etherlink.cc Wed Oct 26 22:48:28 2016 -0400
+++ b/src/dev/net/etherlink.cc Wed Oct 26 22:48:33 2016 -0400
@@ -192,7 +192,7 @@
DDUMP(EthernetData, pkt->data, pkt->length);
packet = pkt;
- Tick delay = (Tick)ceil(((double)pkt->length * ticksPerByte) + 1.0);
+ Tick delay = (Tick)ceil(((double)pkt->simLength * ticksPerByte) + 1.0);
if (delayVar != 0)
delay += random_mt.random<Tick>(0, delayVar);
@@ -235,7 +235,7 @@
bool packet_exists;
paramIn(cp, base + ".packet_exists", packet_exists);
if (packet_exists) {
- packet = make_shared<EthPacketData>(16384);
+ packet = make_shared<EthPacketData>();
packet->unserialize(base + ".packet", cp);
}
@@ -251,7 +251,7 @@
if (optParamIn(cp, base + ".tx_queue_size", tx_queue_size)) {
for (size_t idx = 0; idx < tx_queue_size; ++idx) {
Tick tick;
- EthPacketPtr delayed_packet = make_shared<EthPacketData>(16384);
+ EthPacketPtr delayed_packet = make_shared<EthPacketData>();
paramIn(cp, csprintf("%s.txQueue[%i].tick", base, idx), tick);
delayed_packet->unserialize(
diff -r 7d4d424c9f17 -r 5e7599457b97 src/dev/net/etherpkt.cc
--- a/src/dev/net/etherpkt.cc Wed Oct 26 22:48:28 2016 -0400
+++ b/src/dev/net/etherpkt.cc Wed Oct 26 22:48:33 2016 -0400
@@ -41,6 +41,7 @@
void
EthPacketData::serialize(const string &base, CheckpointOut &cp) const
{
+ paramOut(cp, base + ".simLength", simLength);
paramOut(cp, base + ".length", length);
arrayParamOut(cp, base + ".data", data, length);
}
@@ -49,7 +50,12 @@
EthPacketData::unserialize(const string &base, CheckpointIn &cp)
{
paramIn(cp, base + ".length", length);
- if (length)
+ if (length) {
+ assert(data == nullptr);
+ data = new uint8_t[length];
arrayParamIn(cp, base + ".data", data, length);
+ }
+ if (!optParamIn(cp, base + ".simLength", simLength))
+ simLength = length;
}
diff -r 7d4d424c9f17 -r 5e7599457b97 src/dev/net/etherpkt.hh
--- a/src/dev/net/etherpkt.hh Wed Oct 26 22:48:28 2016 -0400
+++ b/src/dev/net/etherpkt.hh Wed Oct 26 22:48:33 2016 -0400
@@ -49,33 +49,37 @@
class EthPacketData
{
public:
- /*
+ /**
* Pointer to packet data will be deleted
*/
uint8_t *data;
- /*
- * Length of the current packet
+ /**
+ * Amount of space occupied by the payload in the data buffer
*/
unsigned length;
- public:
+ /**
+ * Effective length, used for modeling timing in the simulator.
+ * This could be different from length if the packets are assumed
+ * to use a tightly packed or compressed format, but it's not worth
+ * the performance/complexity hit to perform that packing or compression
+ * in the simulation.
+ */
+ unsigned simLength;
+
EthPacketData()
- : data(NULL), length(0)
+ : data(nullptr), length(0), simLength(0)
{ }
explicit EthPacketData(unsigned size)
- : data(new uint8_t[size]), length(0)
+ : data(new uint8_t[size]), length(0), simLength(0)
{ }
~EthPacketData() { if (data) delete [] data; }
- public:
-
void serialize(const std::string &base, CheckpointOut &cp) const;
void unserialize(const std::string &base, CheckpointIn &cp);
-
- unsigned size() const { return length; }
};
typedef std::shared_ptr<EthPacketData> EthPacketPtr;
diff -r 7d4d424c9f17 -r 5e7599457b97 src/dev/net/etherswitch.cc
--- a/src/dev/net/etherswitch.cc Wed Oct 26 22:48:28 2016 -0400
+++ b/src/dev/net/etherswitch.cc Wed Oct 26 22:48:33 2016 -0400
@@ -200,7 +200,7 @@
Tick
EtherSwitch::Interface::switchingDelay()
{
- Tick delay = (Tick)ceil(((double)outputFifo.front()->length
+ Tick delay = (Tick)ceil(((double)outputFifo.front()->simLength
* ticksPerByte) + 1.0);
if (delayVar != 0)
delay += random_mt.random<Tick>(0, delayVar);
diff -r 7d4d424c9f17 -r 5e7599457b97 src/dev/net/ethertap.cc
--- a/src/dev/net/ethertap.cc Wed Oct 26 22:48:28 2016 -0400
+++ b/src/dev/net/ethertap.cc Wed Oct 26 22:48:33 2016 -0400
@@ -239,6 +239,7 @@
EthPacketPtr packet;
packet = make_shared<EthPacketData>(data_len);
packet->length = data_len;
+ packet->simLength = data_len;
memcpy(packet->data, data, data_len);
assert(buffer_offset >= data_len + sizeof(uint32_t));
diff -r 7d4d424c9f17 -r 5e7599457b97 src/dev/net/i8254xGBe.cc
--- a/src/dev/net/i8254xGBe.cc Wed Oct 26 22:48:28 2016 -0400
+++ b/src/dev/net/i8254xGBe.cc Wed Oct 26 22:48:33 2016 -0400
@@ -1771,12 +1771,15 @@
DPRINTF(EthernetDesc, "TSO: use: %d hdrlen: %d mss: %d total: %d "
"used: %d loaded hdr: %d\n", useTso, tsoHeaderLen, tsoMss,
tsoTotalLen, tsoUsedLen, tsoLoadedHeader);
+ pktPtr->simLength += tsoCopyBytes;
pktPtr->length += tsoCopyBytes;
tsoUsedLen += tsoCopyBytes;
DPRINTF(EthernetDesc, "TSO: descBytesUsed: %d copyBytes: %d\n",
tsoDescBytesUsed, tsoCopyBytes);
- } else
+ } else {
+ pktPtr->simLength += TxdOp::getLen(desc);
pktPtr->length += TxdOp::getLen(desc);
+ }
@@ -2519,7 +2522,7 @@
bool txPktExists;
UNSERIALIZE_SCALAR(txPktExists);
if (txPktExists) {
- txPacket = std::make_shared<EthPacketData>(16384);
+ txPacket = std::make_shared<EthPacketData>();
txPacket->unserialize("txpacket", cp);
}
diff -r 7d4d424c9f17 -r 5e7599457b97 src/dev/net/ns_gige.cc
--- a/src/dev/net/ns_gige.cc Wed Oct 26 22:48:28 2016 -0400
+++ b/src/dev/net/ns_gige.cc Wed Oct 26 22:48:33 2016 -0400
@@ -1738,6 +1738,7 @@
}
}
+ txPacket->simLength = txPacketBufPtr - txPacket->data;
txPacket->length = txPacketBufPtr - txPacket->data;
// this is just because the receive can't handle a
// packet bigger want to make sure
@@ -2186,6 +2187,7 @@
bool txPacketExists = txPacket != nullptr;
SERIALIZE_SCALAR(txPacketExists);
if (txPacketExists) {
+ txPacket->simLength = txPacketBufPtr - txPacket->data;
txPacket->length = txPacketBufPtr - txPacket->data;
txPacket->serialize("txPacket", cp);
uint32_t txPktBufPtr = (uint32_t) (txPacketBufPtr - txPacket->data);
@@ -2350,7 +2352,7 @@
bool txPacketExists;
UNSERIALIZE_SCALAR(txPacketExists);
if (txPacketExists) {
- txPacket = make_shared<EthPacketData>(16384);
+ txPacket = make_shared<EthPacketData>();
txPacket->unserialize("txPacket", cp);
uint32_t txPktBufPtr;
UNSERIALIZE_SCALAR(txPktBufPtr);
@@ -2362,7 +2364,7 @@
UNSERIALIZE_SCALAR(rxPacketExists);
rxPacket = 0;
if (rxPacketExists) {
- rxPacket = make_shared<EthPacketData>(16384);
+ rxPacket = make_shared<EthPacketData>();
rxPacket->unserialize("rxPacket", cp);
uint32_t rxPktBufPtr;
UNSERIALIZE_SCALAR(rxPktBufPtr);
diff -r 7d4d424c9f17 -r 5e7599457b97 src/dev/net/pktfifo.cc
--- a/src/dev/net/pktfifo.cc Wed Oct 26 22:48:28 2016 -0400
+++ b/src/dev/net/pktfifo.cc Wed Oct 26 22:48:33 2016 -0400
@@ -77,7 +77,7 @@
void
PacketFifoEntry::unserialize(const string &base, CheckpointIn &cp)
{
- packet = make_shared<EthPacketData>(16384);
+ packet = make_shared<EthPacketData>();
packet->unserialize(base + ".packet", cp);
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev