From: Jason Wang <jasowang@redhat.com>
To: Leonid Bloch <leonid.bloch@ravellosystems.com>, qemu-devel@nongnu.org
Cc: Dmitry Fleytman <dmitry@daynix.com>,
Leonid Bloch <leonid@daynix.com>,
Shmulik Ladkani <shmulik.ladkani@ravellosystems.com>
Subject: Re: [Qemu-devel] [PATCH 6/6] e1000: Implementing various counters
Date: Tue, 20 Oct 2015 14:34:12 +0800 [thread overview]
Message-ID: <5625E064.7060201@redhat.com> (raw)
In-Reply-To: <1445154799-31083-7-git-send-email-leonid.bloch@ravellosystems.com>
On 10/18/2015 03:53 PM, Leonid Bloch wrote:
> This implements the following Statistic registers (various counters)
> according to Intel's specs:
>
> TSCTC GOTCL GOTCH GORCL GORCH MPRC BPRC RUC ROC
> BPTC MPTC PTC... PRC...
>
> Signed-off-by: Leonid Bloch <leonid.bloch@ravellosystems.com>
> Signed-off-by: Dmitry Fleytman <dmitry.fleytman@ravellosystems.com>
> ---
> hw/net/e1000.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
> 1 file changed, 75 insertions(+), 8 deletions(-)
>
> diff --git a/hw/net/e1000.c b/hw/net/e1000.c
> index 0ce7a7e..afb0ebe 100644
> --- a/hw/net/e1000.c
> +++ b/hw/net/e1000.c
> @@ -37,6 +37,8 @@
>
> #include "e1000_regs.h"
>
> +static const uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
> +
> #define E1000_DEBUG
>
> #ifdef E1000_DEBUG
> @@ -178,7 +180,13 @@ enum {
> defreg(DC), defreg(TNCRS), defreg(SEC), defreg(CEXTERR),
> defreg(RLEC), defreg(XONRXC), defreg(XONTXC), defreg(XOFFRXC),
> defreg(XOFFTXC), defreg(RFC), defreg(RJC), defreg(RNBC),
> - defreg(TSCTFC), defreg(MGTPRC), defreg(MGTPDC), defreg(MGTPTC)
> + defreg(TSCTFC), defreg(MGTPRC), defreg(MGTPDC), defreg(MGTPTC),
> + defreg(RUC), defreg(ROC), defreg(GORCL), defreg(GORCH),
> + defreg(GOTCL), defreg(GOTCH), defreg(BPRC), defreg(MPRC),
> + defreg(TSCTC), defreg(PRC64), defreg(PRC127), defreg(PRC255),
> + defreg(PRC511), defreg(PRC1023), defreg(PRC1522), defreg(PTC64),
> + defreg(PTC127), defreg(PTC255), defreg(PTC511), defreg(PTC1023),
> + defreg(PTC1522), defreg(MPTC), defreg(BPTC)
> };
>
> static void
> @@ -583,6 +591,16 @@ inc_reg_if_not_full(E1000State *s, int index)
> }
> }
>
> +static inline void
> +inc_tx_bcast_or_mcast_count(E1000State *s, unsigned char *arr)
> +{
> + if (!memcmp(arr, bcast, sizeof bcast)) {
> + inc_reg_if_not_full(s, BPTC);
> + } else if (arr[0] & 1) {
> + inc_reg_if_not_full(s, MPTC);
> + }
> +}
> +
> static void
> grow_8reg_if_not_full(E1000State *s, int index, int size)
> {
> @@ -605,6 +623,24 @@ grow_8reg_if_not_full(E1000State *s, int index, int size)
> }
> }
>
> +static void
> +increase_size_stats(E1000State *s, const int *size_regs, int size)
> +{
> + if (size > 1023) {
> + inc_reg_if_not_full(s, size_regs[5]);
> + } else if (size > 511) {
> + inc_reg_if_not_full(s, size_regs[4]);
> + } else if (size > 255) {
> + inc_reg_if_not_full(s, size_regs[3]);
> + } else if (size > 127) {
> + inc_reg_if_not_full(s, size_regs[2]);
> + } else if (size > 64) {
> + inc_reg_if_not_full(s, size_regs[1]);
> + } else if (size == 64) {
> + inc_reg_if_not_full(s, size_regs[0]);
> + }
> +}
> +
> static inline int
> vlan_enabled(E1000State *s)
> {
> @@ -656,6 +692,8 @@ xmit_seg(E1000State *s)
> uint16_t len, *sp;
> unsigned int frames = s->tx.tso_frames, css, sofar;
> struct e1000_tx *tp = &s->tx;
> + static const int PTCregs[6] = {PTC64, PTC127, PTC255, PTC511,
> + PTC1023, PTC1522};
>
> if (tp->tse && tp->cptse) {
> css = tp->ipcss;
> @@ -673,8 +711,11 @@ xmit_seg(E1000State *s)
> if (tp->tcp) {
> sofar = frames * tp->mss;
> stl_be_p(tp->data+css+4, ldl_be_p(tp->data+css+4)+sofar); /* seq */
> - if (tp->paylen - sofar > tp->mss)
> + if (tp->paylen - sofar > tp->mss) {
> tp->data[css + 13] &= ~9; /* PSH, FIN */
> + } else if (frames) {
> + inc_reg_if_not_full(s, TSCTC);
> + }
> } else /* UDP */
> stw_be_p(tp->data+css+4, len);
> if (tp->sum_needed & E1000_TXD_POPTS_TXSM) {
> @@ -697,11 +738,19 @@ xmit_seg(E1000State *s)
> memmove(tp->data, tp->data + 4, 8);
> memcpy(tp->data + 8, tp->vlan_header, 4);
> e1000_send_packet(s, tp->vlan, tp->size + 4);
> - } else
> + inc_tx_bcast_or_mcast_count(s, tp->vlan);
> + increase_size_stats(s, PTCregs, tp->size + 4);
> + } else {
> e1000_send_packet(s, tp->data, tp->size);
> + inc_tx_bcast_or_mcast_count(s, tp->data);
> + increase_size_stats(s, PTCregs, tp->size);
> + }
> +
Why not put above just inside e1000_send_packet() to avoid code duplication?
> inc_reg_if_not_full(s, TPT);
> grow_8reg_if_not_full(s, TOTL, s->tx.size);
> s->mac_reg[GPTC] = s->mac_reg[TPT];
> + s->mac_reg[GOTCL] = s->mac_reg[TOTL];
> + s->mac_reg[GOTCH] = s->mac_reg[TOTH];
> }
>
> static void
> @@ -869,7 +918,6 @@ start_xmit(E1000State *s)
> static int
> receive_filter(E1000State *s, const uint8_t *buf, int size)
> {
> - static const uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
> static const int mta_shift[] = {4, 3, 2, 0};
> uint32_t f, rctl = s->mac_reg[RCTL], ra[2], *rp;
> int isbcast = !memcmp(buf, bcast, sizeof bcast), ismcast = (buf[0] & 1);
> @@ -887,10 +935,12 @@ receive_filter(E1000State *s, const uint8_t *buf, int size)
> }
>
> if (ismcast && (rctl & E1000_RCTL_MPE)) { /* promiscuous mcast */
> + inc_reg_if_not_full(s, MPRC);
> return 1;
> }
>
> if (isbcast && (rctl & E1000_RCTL_BAM)) { /* broadcast enabled */
> + inc_reg_if_not_full(s, BPRC);
> return 1;
> }
>
> @@ -912,8 +962,10 @@ receive_filter(E1000State *s, const uint8_t *buf, int size)
>
> f = mta_shift[(rctl >> E1000_RCTL_MO_SHIFT) & 3];
> f = (((buf[5] << 8) | buf[4]) >> f) & 0xfff;
> - if (s->mac_reg[MTA + (f >> 5)] & (1 << (f & 0x1f)))
> + if (s->mac_reg[MTA + (f >> 5)] & (1 << (f & 0x1f))) {
> + inc_reg_if_not_full(s, MPRC);
> return 1;
> + }
> DBGOUT(RXFILTER,
> "dropping, inexact filter mismatch: %02x:%02x:%02x:%02x:%02x:%02x MO %d MTA[%d] %x\n",
> buf[0], buf[1], buf[2], buf[3], buf[4], buf[5],
> @@ -1002,6 +1054,8 @@ e1000_receive_iov(NetClientState *nc, const struct iovec *iov, int iovcnt)
> size_t desc_offset;
> size_t desc_size;
> size_t total_size;
> + static const int PRCregs[6] = {PRC64, PRC127, PRC255, PRC511,
> + PRC1023, PRC1522};
>
> if (!(s->mac_reg[STATUS] & E1000_STATUS_LU)) {
> return -1;
> @@ -1015,6 +1069,7 @@ e1000_receive_iov(NetClientState *nc, const struct iovec *iov, int iovcnt)
> if (size < sizeof(min_buf)) {
> iov_to_buf(iov, iovcnt, 0, min_buf, size);
> memset(&min_buf[size], 0, sizeof(min_buf) - size);
> + inc_reg_if_not_full(s, RUC);
> min_iov.iov_base = filter_buf = min_buf;
> min_iov.iov_len = size = sizeof(min_buf);
> iovcnt = 1;
> @@ -1030,6 +1085,7 @@ e1000_receive_iov(NetClientState *nc, const struct iovec *iov, int iovcnt)
> (size > MAXIMUM_ETHERNET_VLAN_SIZE
> && !(s->mac_reg[RCTL] & E1000_RCTL_LPE)))
> && !(s->mac_reg[RCTL] & E1000_RCTL_SBP)) {
> + inc_reg_if_not_full(s, ROC);
> return size;
> }
>
> @@ -1115,6 +1171,7 @@ e1000_receive_iov(NetClientState *nc, const struct iovec *iov, int iovcnt)
> }
> } while (desc_offset < total_size);
>
> + increase_size_stats(s, PRCregs, total_size);
> inc_reg_if_not_full(s, TPR);
> s->mac_reg[GPRC] = s->mac_reg[TPR];
> /* TOR - Total Octets Received:
> @@ -1123,6 +1180,8 @@ e1000_receive_iov(NetClientState *nc, const struct iovec *iov, int iovcnt)
> * Always include FCS length (4) in size.
> */
> grow_8reg_if_not_full(s, TORL, size+4);
> + s->mac_reg[GORCL] = s->mac_reg[TORL];
> + s->mac_reg[GORCH] = s->mac_reg[TORH];
>
> n = E1000_ICS_RXT0;
> if ((rdt = s->mac_reg[RDT]) < s->mac_reg[RDH])
> @@ -1274,10 +1333,18 @@ static uint32_t (*macreg_readops[])(E1000State *, int) = {
> getreg(RLEC), getreg(XONRXC), getreg(XONTXC), getreg(XOFFRXC),
> getreg(XOFFTXC), getreg(RFC), getreg(RJC), getreg(RNBC),
> getreg(TSCTFC), getreg(MGTPRC), getreg(MGTPDC), getreg(MGTPTC),
> -
> - [TOTH] = mac_read_clr8, [TORH] = mac_read_clr8,
> + getreg(GORCL), getreg(GOTCL),
> +
> + [TOTH] = mac_read_clr8, [TORH] = mac_read_clr8, [GOTCH] = mac_read_clr8,
> + [GORCH] = mac_read_clr8,
> + [PRC64] = mac_read_clr4, [PRC127] = mac_read_clr4, [PRC255] = mac_read_clr4,
> + [PRC511] = mac_read_clr4, [PRC1023] = mac_read_clr4, [PRC1522] = mac_read_clr4,
> + [PTC64] = mac_read_clr4, [PTC127] = mac_read_clr4, [PTC255] = mac_read_clr4,
> + [PTC511] = mac_read_clr4, [PTC1023] = mac_read_clr4, [PTC1522] = mac_read_clr4,
> [GPRC] = mac_read_clr4, [GPTC] = mac_read_clr4, [TPR] = mac_read_clr4,
> - [TPT] = mac_read_clr4,
> + [TPT] = mac_read_clr4, [RUC] = mac_read_clr4, [ROC] = mac_read_clr4,
> + [BPRC] = mac_read_clr4, [MPRC] = mac_read_clr4, [TSCTC] = mac_read_clr4,
> + [BPTC] = mac_read_clr4, [MPTC] = mac_read_clr4,
> [ICR] = mac_icr_read, [EECD] = get_eecd, [EERD] = flash_eerd_read,
> [RDFH] = mac_low13_read, [RDFT] = mac_low13_read,
> [RDFHS] = mac_low13_read, [RDFTS] = mac_low13_read, [RDFPC] = mac_low13_read,
next prev parent reply other threads:[~2015-10-20 6:34 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-18 7:53 [Qemu-devel] [PATCH 0/6] e1000: Various fixes and registers' implementation Leonid Bloch
2015-10-18 7:53 ` [Qemu-devel] [PATCH 1/6] e1000: Cosmetic and alignment fixes Leonid Bloch
2015-10-18 7:53 ` [Qemu-devel] [PATCH 2/6] e1000: Trivial implementation of various MAC registers Leonid Bloch
2015-10-20 5:40 ` Jason Wang
2015-10-21 9:13 ` Leonid Bloch
2015-10-22 7:19 ` Jason Wang
2015-10-22 14:05 ` Leonid Bloch
2015-10-23 3:10 ` Jason Wang
2015-10-25 19:39 ` Leonid Bloch
2015-10-18 7:53 ` [Qemu-devel] [PATCH 3/6] e1000: Fixing the received/transmitted packets' counters Leonid Bloch
2015-10-18 7:53 ` [Qemu-devel] [PATCH 4/6] e1000: Fixing the received/transmitted octets' counters Leonid Bloch
2015-10-20 6:16 ` Jason Wang
2015-10-21 12:20 ` Leonid Bloch
2015-10-22 7:20 ` Jason Wang
2015-10-18 7:53 ` [Qemu-devel] [PATCH 5/6] e1000: Fixing the packet address filtering procedure Leonid Bloch
2015-10-18 7:53 ` [Qemu-devel] [PATCH 6/6] e1000: Implementing various counters Leonid Bloch
2015-10-20 6:34 ` Jason Wang [this message]
2015-10-21 9:20 ` Leonid Bloch
2015-10-20 6:37 ` [Qemu-devel] [PATCH 0/6] e1000: Various fixes and registers' implementation Jason Wang
2015-10-21 13:32 ` Leonid Bloch
2015-10-22 7:22 ` Jason Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5625E064.7060201@redhat.com \
--to=jasowang@redhat.com \
--cc=dmitry@daynix.com \
--cc=leonid.bloch@ravellosystems.com \
--cc=leonid@daynix.com \
--cc=qemu-devel@nongnu.org \
--cc=shmulik.ladkani@ravellosystems.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.