blob: 51293e981ced17b852840f9bbf2b8cda5ca402e6 [file] [log] [blame]
/*
* Copyright (c) 2004-2005 The Regents of The University of Michigan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met: redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer;
* redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution;
* neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "dev/net/etherdevice.hh"
#include "sim/stats.hh"
namespace gem5
{
EtherDevice::EtherDeviceStats::EtherDeviceStats(statistics::Group *parent)
: statistics::Group(parent, "EtherDevice"),
ADD_STAT(postedInterrupts, statistics::units::Count::get(),
"Number of posts to CPU"),
ADD_STAT(txBytes, statistics::units::Byte::get(),
"Bytes Transmitted"),
ADD_STAT(rxBytes, statistics::units::Byte::get(), "Bytes Received"),
ADD_STAT(txPackets, statistics::units::Count::get(),
"Number of Packets Transmitted"),
ADD_STAT(rxPackets, statistics::units::Count::get(),
"Number of Packets Received"),
ADD_STAT(txBandwidth, statistics::units::Rate<
statistics::units::Bit, statistics::units::Second>::get(),
"Transmit Bandwidth",
txBytes * statistics::constant(8) / simSeconds),
ADD_STAT(rxBandwidth, statistics::units::Rate<
statistics::units::Bit, statistics::units::Second>::get(),
"Receive Bandwidth",
rxBytes * statistics::constant(8) / simSeconds),
ADD_STAT(txIpChecksums, statistics::units::Count::get(),
"Number of tx IP Checksums done by device"),
ADD_STAT(rxIpChecksums, statistics::units::Count::get(),
"Number of rx IP Checksums done by device"),
ADD_STAT(txTcpChecksums, statistics::units::Count::get(),
"Number of tx TCP Checksums done by device"),
ADD_STAT(rxTcpChecksums, statistics::units::Count::get(),
"Number of rx TCP Checksums done by device"),
ADD_STAT(txUdpChecksums, statistics::units::Count::get(),
"Number of tx UDP Checksums done by device"),
ADD_STAT(rxUdpChecksums, statistics::units::Count::get(),
"Number of rx UDP Checksums done by device"),
ADD_STAT(descDmaReads, statistics::units::Count::get(),
"Number of descriptors the device read w/ DMA"),
ADD_STAT(descDmaWrites, statistics::units::Count::get(),
"Number of descriptors the device wrote w/ DMA"),
ADD_STAT(descDmaRdBytes, statistics::units::Count::get(),
"Number of descriptor bytes read w/ DMA"),
ADD_STAT(descDmaWrBytes, statistics::units::Count::get(),
"Number of descriptor bytes write w/ DMA"),
ADD_STAT(totBandwidth, statistics::units::Rate<
statistics::units::Bit, statistics::units::Second>::get(),
"Total Bandwidth",
txBandwidth + rxBandwidth),
ADD_STAT(totPackets, statistics::units::Count::get(), "Total Packets",
txPackets + rxPackets),
ADD_STAT(totBytes, statistics::units::Byte::get(), "Total Bytes",
txBytes + rxBytes),
ADD_STAT(totPacketRate, statistics::units::Rate<
statistics::units::Count, statistics::units::Second>::get(),
"Total Packet Tranmission Rate",
totPackets / simSeconds),
ADD_STAT(txPacketRate, statistics::units::Rate<
statistics::units::Count, statistics::units::Second>::get(),
"Packet Tranmission Rate",
txPackets / simSeconds),
ADD_STAT(rxPacketRate, statistics::units::Rate<
statistics::units::Count, statistics::units::Second>::get(),
"Packet Reception Rate",
rxPackets / simSeconds),
ADD_STAT(postedSwi, statistics::units::Count::get(),
"Number of software interrupts posted to CPU"),
ADD_STAT(totalSwi, statistics::units::Count::get(),
"Total number of Swi written to ISR"),
ADD_STAT(coalescedSwi, statistics::units::Rate<
statistics::units::Count, statistics::units::Count>::get(),
"Average number of Swi's coalesced into each post",
totalSwi / postedInterrupts),
ADD_STAT(postedRxIdle, statistics::units::Count::get(),
"Number of rxIdle interrupts posted to CPU"),
ADD_STAT(totalRxIdle, statistics::units::Count::get(),
"Total number of RxIdle written to ISR"),
ADD_STAT(coalescedRxIdle, statistics::units::Rate<
statistics::units::Count, statistics::units::Count>::get(),
"Average number of RxIdle's coalesced into each post",
totalRxIdle / postedInterrupts),
ADD_STAT(postedRxOk, statistics::units::Count::get(),
"Number of RxOk interrupts posted to CPU"),
ADD_STAT(totalRxOk, statistics::units::Count::get(),
"Total number of RxOk written to ISR"),
ADD_STAT(coalescedRxOk, statistics::units::Rate<
statistics::units::Count, statistics::units::Count>::get(),
"Average number of RxOk's coalesced into each post",
totalRxOk / postedInterrupts),
ADD_STAT(postedRxDesc, statistics::units::Count::get(),
"Number of RxDesc interrupts posted to CPU"),
ADD_STAT(totalRxDesc, statistics::units::Count::get(),
"Total number of RxDesc written to ISR"),
ADD_STAT(coalescedRxDesc, statistics::units::Rate<
statistics::units::Count, statistics::units::Count>::get(),
"Average number of RxDesc's coalesced into each post",
totalRxDesc / postedInterrupts),
ADD_STAT(postedTxOk, statistics::units::Count::get(),
"Number of TxOk interrupts posted to CPU"),
ADD_STAT(totalTxOk, statistics::units::Count::get(),
"Total number of TxOk written to ISR"),
ADD_STAT(coalescedTxOk, statistics::units::Rate<
statistics::units::Count, statistics::units::Count>::get(),
"Average number of TxOk's coalesced into each post",
totalTxOk / postedInterrupts),
ADD_STAT(postedTxIdle, statistics::units::Count::get(),
"Number of TxIdle interrupts posted to CPU"),
ADD_STAT(totalTxIdle, statistics::units::Count::get(),
"Total number of TxIdle written to ISR"),
ADD_STAT(coalescedTxIdle, statistics::units::Rate<
statistics::units::Count, statistics::units::Count>::get(),
"Average number of TxIdle's coalesced into each post",
totalTxIdle / postedInterrupts),
ADD_STAT(postedTxDesc, statistics::units::Count::get(),
"Number of TxDesc interrupts posted to CPU"),
ADD_STAT(totalTxDesc, statistics::units::Count::get(),
"Total number of TxDesc written to ISR"),
ADD_STAT(coalescedTxDesc, statistics::units::Rate<
statistics::units::Count, statistics::units::Count>::get(),
"Average number of TxDesc's coalesced into each post",
totalTxDesc / postedInterrupts),
ADD_STAT(postedRxOrn, statistics::units::Count::get(),
"Number of RxOrn posted to CPU"),
ADD_STAT(totalRxOrn, statistics::units::Count::get(),
"Total number of RxOrn written to ISR"),
ADD_STAT(coalescedRxOrn, statistics::units::Rate<
statistics::units::Count, statistics::units::Count>::get(),
"Average number of RxOrn's coalesced into each post",
totalRxOrn / postedInterrupts),
ADD_STAT(coalescedTotal, statistics::units::Rate<
statistics::units::Count, statistics::units::Count>::get(),
"Average number of interrupts coalesced into each post"),
ADD_STAT(droppedPackets, statistics::units::Count::get(),
"Number of packets dropped")
{
postedInterrupts
.precision(0);
txBytes
.prereq(txBytes);
rxBytes
.prereq(rxBytes);
txPackets
.prereq(txBytes);
rxPackets
.prereq(rxBytes);
txIpChecksums
.precision(0)
.prereq(txBytes);
rxIpChecksums
.precision(0)
.prereq(rxBytes);
txTcpChecksums
.precision(0)
.prereq(txBytes);
rxTcpChecksums
.precision(0)
.prereq(rxBytes);
txUdpChecksums
.precision(0)
.prereq(txBytes);
rxUdpChecksums
.precision(0)
.prereq(rxBytes);
descDmaReads
.precision(0);
descDmaWrites
.precision(0);
descDmaRdBytes
.precision(0);
descDmaWrBytes
.precision(0);
txBandwidth
.precision(0)
.prereq(txBytes)
;
rxBandwidth
.precision(0)
.prereq(rxBytes);
totBandwidth
.precision(0)
.prereq(totBytes);
totPackets
.precision(0)
.prereq(totBytes);
totBytes
.precision(0)
.prereq(totBytes);
totPacketRate
.precision(0)
.prereq(totBytes);
txPacketRate
.precision(0)
.prereq(txBytes);
rxPacketRate
.precision(0)
.prereq(rxBytes);
postedSwi
.precision(0);
totalSwi
.precision(0);
coalescedSwi
.precision(0);
postedRxIdle
.precision(0);
totalRxIdle
.precision(0);
coalescedRxIdle
.precision(0);
postedRxOk
.precision(0);
totalRxOk
.precision(0);
coalescedRxOk
.precision(0);
postedRxDesc
.precision(0);
totalRxDesc
.precision(0);
coalescedRxDesc
.precision(0);
postedTxOk
.precision(0);
totalTxOk
.precision(0);
coalescedTxOk
.precision(0);
postedTxIdle
.precision(0);
totalTxIdle
.precision(0);
coalescedTxIdle
.precision(0);
postedTxDesc
.precision(0);
totalTxDesc
.precision(0);
coalescedTxDesc
.precision(0);
postedRxOrn
.precision(0);
totalRxOrn
.precision(0);
coalescedRxOrn
.precision(0);
coalescedTotal
.precision(0);
droppedPackets
.precision(0);
coalescedTotal = (totalSwi + totalRxIdle + totalRxOk + totalRxDesc +
totalTxOk + totalTxIdle + totalTxDesc +
totalRxOrn) / postedInterrupts;
}
} // namespace gem5