-----BEGIN PGP SIGNATURE-----

Version: GnuPG v1
 
 iQEcBAABAgAGBQJYx6HVAAoJEO8Ells5jWIRAQgIAK4pR+SgHyrxy2BJKseN4t8Y
 /+4QAKHt4v/uWJqft7m5sk1YQS7V7GW4LXBcv/kshN3tX7hPeXT2D4+NBV/BbXgp
 ghHQt9o0/sNkKiyVY31heWaB/x5hioYzJ4S3SieeEZlkbn72gtp/8qWogCo36gPV
 7L7dTcUldKxZV/57hLGTXY8OJ/jMzOY3gLIoqg8tqvHPo0prYe/PAuaf0lEyZuXR
 /iPS9Q1/k7adsD989oUAM1mI+uks8X02ywv17HkxwdwAtI2o4aYRoQgUqd3TbSBd
 +HA0cWFutKK6/hpGfsaL1005q4XdW265WgqHpACimHXDQw6ZbwwajbSSpQChSHk=
 =PX31
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/jasowang/tags/net-pull-request' into staging

# gpg: Signature made Tue 14 Mar 2017 07:55:01 GMT
# gpg:                using RSA key 0xEF04965B398D6211
# gpg: Good signature from "Jason Wang (Jason Wang on RedHat) <jasowang@redhat.com>"
# gpg: WARNING: This key is not certified with sufficiently trusted signatures!
# gpg:          It is not certain that the signature belongs to the owner.
# Primary key fingerprint: 215D 46F4 8246 689E C77F  3562 EF04 965B 398D 6211

* remotes/jasowang/tags/net-pull-request:
  hw/net: implement MIB counters in mcf_fec driver
  COLO-compare: Fix trace_event print bug
  e1000e: correctly tear down MSI-X memory regions

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2017-03-14 11:15:00 +00:00
commit 591bce29b1
3 changed files with 141 additions and 9 deletions

View File

@ -306,7 +306,7 @@ e1000e_init_msix(E1000EState *s)
static void
e1000e_cleanup_msix(E1000EState *s)
{
if (msix_enabled(PCI_DEVICE(s))) {
if (msix_present(PCI_DEVICE(s))) {
e1000e_unuse_msix_vectors(s, E1000E_MSIX_VEC_NUM);
msix_uninit(PCI_DEVICE(s), &s->msix, &s->msix);
}

View File

@ -27,6 +27,7 @@ do { printf("mcf_fec: " fmt , ## __VA_ARGS__); } while (0)
#define FEC_MAX_DESC 1024
#define FEC_MAX_FRAME_SIZE 2032
#define FEC_MIB_SIZE 64
typedef struct {
SysBusDevice parent_obj;
@ -51,6 +52,7 @@ typedef struct {
uint32_t erdsr;
uint32_t etdsr;
uint32_t emrbr;
uint32_t mib[FEC_MIB_SIZE];
} mcf_fec_state;
#define FEC_INT_HB 0x80000000
@ -111,6 +113,63 @@ typedef struct {
#define FEC_BD_OV 0x0002
#define FEC_BD_TR 0x0001
#define MIB_RMON_T_DROP 0
#define MIB_RMON_T_PACKETS 1
#define MIB_RMON_T_BC_PKT 2
#define MIB_RMON_T_MC_PKT 3
#define MIB_RMON_T_CRC_ALIGN 4
#define MIB_RMON_T_UNDERSIZE 5
#define MIB_RMON_T_OVERSIZE 6
#define MIB_RMON_T_FRAG 7
#define MIB_RMON_T_JAB 8
#define MIB_RMON_T_COL 9
#define MIB_RMON_T_P64 10
#define MIB_RMON_T_P65TO127 11
#define MIB_RMON_T_P128TO255 12
#define MIB_RMON_T_P256TO511 13
#define MIB_RMON_T_P512TO1023 14
#define MIB_RMON_T_P1024TO2047 15
#define MIB_RMON_T_P_GTE2048 16
#define MIB_RMON_T_OCTETS 17
#define MIB_IEEE_T_DROP 18
#define MIB_IEEE_T_FRAME_OK 19
#define MIB_IEEE_T_1COL 20
#define MIB_IEEE_T_MCOL 21
#define MIB_IEEE_T_DEF 22
#define MIB_IEEE_T_LCOL 23
#define MIB_IEEE_T_EXCOL 24
#define MIB_IEEE_T_MACERR 25
#define MIB_IEEE_T_CSERR 26
#define MIB_IEEE_T_SQE 27
#define MIB_IEEE_T_FDXFC 28
#define MIB_IEEE_T_OCTETS_OK 29
#define MIB_RMON_R_DROP 32
#define MIB_RMON_R_PACKETS 33
#define MIB_RMON_R_BC_PKT 34
#define MIB_RMON_R_MC_PKT 35
#define MIB_RMON_R_CRC_ALIGN 36
#define MIB_RMON_R_UNDERSIZE 37
#define MIB_RMON_R_OVERSIZE 38
#define MIB_RMON_R_FRAG 39
#define MIB_RMON_R_JAB 40
#define MIB_RMON_R_RESVD_0 41
#define MIB_RMON_R_P64 42
#define MIB_RMON_R_P65TO127 43
#define MIB_RMON_R_P128TO255 44
#define MIB_RMON_R_P256TO511 45
#define MIB_RMON_R_P512TO1023 46
#define MIB_RMON_R_P1024TO2047 47
#define MIB_RMON_R_P_GTE2048 48
#define MIB_RMON_R_OCTETS 49
#define MIB_IEEE_R_DROP 50
#define MIB_IEEE_R_FRAME_OK 51
#define MIB_IEEE_R_CRC 52
#define MIB_IEEE_R_ALIGN 53
#define MIB_IEEE_R_MACERR 54
#define MIB_IEEE_R_FDXFC 55
#define MIB_IEEE_R_OCTETS_OK 56
static void mcf_fec_read_bd(mcf_fec_bd *bd, uint32_t addr)
{
cpu_physical_memory_read(addr, bd, sizeof(*bd));
@ -147,6 +206,31 @@ static void mcf_fec_update(mcf_fec_state *s)
s->irq_state = active;
}
static void mcf_fec_tx_stats(mcf_fec_state *s, int size)
{
s->mib[MIB_RMON_T_PACKETS]++;
s->mib[MIB_RMON_T_OCTETS] += size;
if (size < 64) {
s->mib[MIB_RMON_T_FRAG]++;
} else if (size == 64) {
s->mib[MIB_RMON_T_P64]++;
} else if (size < 128) {
s->mib[MIB_RMON_T_P65TO127]++;
} else if (size < 256) {
s->mib[MIB_RMON_T_P128TO255]++;
} else if (size < 512) {
s->mib[MIB_RMON_T_P256TO511]++;
} else if (size < 1024) {
s->mib[MIB_RMON_T_P512TO1023]++;
} else if (size < 2048) {
s->mib[MIB_RMON_T_P1024TO2047]++;
} else {
s->mib[MIB_RMON_T_P_GTE2048]++;
}
s->mib[MIB_IEEE_T_FRAME_OK]++;
s->mib[MIB_IEEE_T_OCTETS_OK] += size;
}
static void mcf_fec_do_tx(mcf_fec_state *s)
{
uint32_t addr;
@ -180,6 +264,7 @@ static void mcf_fec_do_tx(mcf_fec_state *s)
/* Last buffer in frame. */
DPRINTF("Sending packet\n");
qemu_send_packet(qemu_get_queue(s->nic), frame, frame_size);
mcf_fec_tx_stats(s, frame_size);
ptr = frame;
frame_size = 0;
s->eir |= FEC_INT_TXF;
@ -302,6 +387,7 @@ static uint64_t mcf_fec_read(void *opaque, hwaddr addr,
case 0x180: return s->erdsr;
case 0x184: return s->etdsr;
case 0x188: return s->emrbr;
case 0x200 ... 0x2e0: return s->mib[(addr & 0x1ff) / 4];
default:
hw_error("mcf_fec_read: Bad address 0x%x\n", (int)addr);
return 0;
@ -399,12 +485,40 @@ static void mcf_fec_write(void *opaque, hwaddr addr,
case 0x188:
s->emrbr = value > 0 ? value & 0x7F0 : 0x7F0;
break;
case 0x200 ... 0x2e0:
s->mib[(addr & 0x1ff) / 4] = value;
break;
default:
hw_error("mcf_fec_write Bad address 0x%x\n", (int)addr);
}
mcf_fec_update(s);
}
static void mcf_fec_rx_stats(mcf_fec_state *s, int size)
{
s->mib[MIB_RMON_R_PACKETS]++;
s->mib[MIB_RMON_R_OCTETS] += size;
if (size < 64) {
s->mib[MIB_RMON_R_FRAG]++;
} else if (size == 64) {
s->mib[MIB_RMON_R_P64]++;
} else if (size < 128) {
s->mib[MIB_RMON_R_P65TO127]++;
} else if (size < 256) {
s->mib[MIB_RMON_R_P128TO255]++;
} else if (size < 512) {
s->mib[MIB_RMON_R_P256TO511]++;
} else if (size < 1024) {
s->mib[MIB_RMON_R_P512TO1023]++;
} else if (size < 2048) {
s->mib[MIB_RMON_R_P1024TO2047]++;
} else {
s->mib[MIB_RMON_R_P_GTE2048]++;
}
s->mib[MIB_IEEE_R_FRAME_OK]++;
s->mib[MIB_IEEE_R_OCTETS_OK] += size;
}
static int mcf_fec_have_receive_space(mcf_fec_state *s, size_t want)
{
mcf_fec_bd bd;
@ -500,6 +614,7 @@ static ssize_t mcf_fec_receive(NetClientState *nc, const uint8_t *buf, size_t si
}
}
s->rx_descriptor = addr;
mcf_fec_rx_stats(s, retsize);
mcf_fec_enable_rx(s);
mcf_fec_update(s);
return retsize;

View File

@ -182,10 +182,18 @@ static int packet_enqueue(CompareState *s, int mode)
*/
static int colo_packet_compare_common(Packet *ppkt, Packet *spkt, int offset)
{
trace_colo_compare_ip_info(ppkt->size, inet_ntoa(ppkt->ip->ip_src),
inet_ntoa(ppkt->ip->ip_dst), spkt->size,
inet_ntoa(spkt->ip->ip_src),
inet_ntoa(spkt->ip->ip_dst));
if (trace_event_get_state(TRACE_COLO_COMPARE_MISCOMPARE)) {
char pri_ip_src[20], pri_ip_dst[20], sec_ip_src[20], sec_ip_dst[20];
strcpy(pri_ip_src, inet_ntoa(ppkt->ip->ip_src));
strcpy(pri_ip_dst, inet_ntoa(ppkt->ip->ip_dst));
strcpy(sec_ip_src, inet_ntoa(spkt->ip->ip_src));
strcpy(sec_ip_dst, inet_ntoa(spkt->ip->ip_dst));
trace_colo_compare_ip_info(ppkt->size, pri_ip_src,
pri_ip_dst, spkt->size,
sec_ip_src, sec_ip_dst);
}
if (ppkt->size == spkt->size) {
return memcmp(ppkt->data + offset, spkt->data + offset,
@ -336,10 +344,19 @@ static int colo_packet_compare_icmp(Packet *spkt, Packet *ppkt)
static int colo_packet_compare_other(Packet *spkt, Packet *ppkt)
{
trace_colo_compare_main("compare other");
trace_colo_compare_ip_info(ppkt->size, inet_ntoa(ppkt->ip->ip_src),
inet_ntoa(ppkt->ip->ip_dst), spkt->size,
inet_ntoa(spkt->ip->ip_src),
inet_ntoa(spkt->ip->ip_dst));
if (trace_event_get_state(TRACE_COLO_COMPARE_MISCOMPARE)) {
char pri_ip_src[20], pri_ip_dst[20], sec_ip_src[20], sec_ip_dst[20];
strcpy(pri_ip_src, inet_ntoa(ppkt->ip->ip_src));
strcpy(pri_ip_dst, inet_ntoa(ppkt->ip->ip_dst));
strcpy(sec_ip_src, inet_ntoa(spkt->ip->ip_src));
strcpy(sec_ip_dst, inet_ntoa(spkt->ip->ip_dst));
trace_colo_compare_ip_info(ppkt->size, pri_ip_src,
pri_ip_dst, spkt->size,
sec_ip_src, sec_ip_dst);
}
return colo_packet_compare_common(ppkt, spkt, 0);
}