-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1 iQEcBAABAgAGBQJiCdGyAAoJEO8Ells5jWIRWL8H/2XOuuv9JJYqboCVPWSpltch FgTh2SHWbQueo70xxxIzRbM2RN/G9Eu+4LnpMw+ZRJA6EY6QgNYmgVFbyV1eTkxG f0qUyCliCPWzZEZ4GLJ7JOSuHpU4rZ90e5IKuGhtD+yrfT+L0Re1TyluZdWEniOp tz6daq31jkF870iPn7X9QOTW0JBcK5ww7Qv5BThAoUmCOq6BMBFxg+xFNto9a5S7 UjADfhZiqNIbks5hfpldr9g2F2LcBNeSHWOAxhEi24IEaV7AcL2/1B3EZhfMcA/O hcbw1oKcJ3anpAD6Ukwy4KnyrZNv1M7wtiN9XkAKKu6idIzrHuIju9j7TOKkxt4= =M6Ok -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/jasowang/tags/net-pull-request' into staging # gpg: Signature made Mon 14 Feb 2022 03:51:14 GMT # gpg: using RSA key EF04965B398D6211 # gpg: Good signature from "Jason Wang (Jason Wang on RedHat) <jasowang@redhat.com>" [marginal] # 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: net/eth: Don't consider ESP to be an IPv6 option header hw/net: e1000e: Clear ICR on read when using non MSI-X interrupts net/filter: Optimize filter_send to coroutine net/colo-compare.c: Update the default value comments net/colo-compare.c: Optimize compare order for performance net: Fix uninitialized data usage net/tap: Set return code on failure hw/net/vmxnet3: Log guest-triggerable errors using LOG_GUEST_ERROR Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
e56d873f0e
@ -2607,6 +2607,11 @@ e1000e_mac_icr_read(E1000ECore *core, int index)
|
|||||||
core->mac[ICR] = 0;
|
core->mac[ICR] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!msix_enabled(core->owner)) {
|
||||||
|
trace_e1000e_irq_icr_clear_nonmsix_icr_read();
|
||||||
|
core->mac[ICR] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if ((core->mac[ICR] & E1000_ICR_ASSERTED) &&
|
if ((core->mac[ICR] & E1000_ICR_ASSERTED) &&
|
||||||
(core->mac[CTRL_EXT] & E1000_CTRL_EXT_IAME)) {
|
(core->mac[CTRL_EXT] & E1000_CTRL_EXT_IAME)) {
|
||||||
trace_e1000e_irq_icr_clear_iame();
|
trace_e1000e_irq_icr_clear_iame();
|
||||||
|
@ -221,6 +221,7 @@ e1000e_irq_write_ics(uint32_t val) "Adding ICR bits 0x%x"
|
|||||||
e1000e_irq_icr_process_iame(void) "Clearing IMS bits due to IAME"
|
e1000e_irq_icr_process_iame(void) "Clearing IMS bits due to IAME"
|
||||||
e1000e_irq_read_ics(uint32_t ics) "Current ICS: 0x%x"
|
e1000e_irq_read_ics(uint32_t ics) "Current ICS: 0x%x"
|
||||||
e1000e_irq_read_ims(uint32_t ims) "Current IMS: 0x%x"
|
e1000e_irq_read_ims(uint32_t ims) "Current IMS: 0x%x"
|
||||||
|
e1000e_irq_icr_clear_nonmsix_icr_read(void) "Clearing ICR on read due to non MSI-X int"
|
||||||
e1000e_irq_icr_read_entry(uint32_t icr) "Starting ICR read. Current ICR: 0x%x"
|
e1000e_irq_icr_read_entry(uint32_t icr) "Starting ICR read. Current ICR: 0x%x"
|
||||||
e1000e_irq_icr_read_exit(uint32_t icr) "Ending ICR read. Current ICR: 0x%x"
|
e1000e_irq_icr_read_exit(uint32_t icr) "Ending ICR read. Current ICR: 0x%x"
|
||||||
e1000e_irq_icr_clear_zero_ims(void) "Clearing ICR on read due to zero IMS"
|
e1000e_irq_icr_clear_zero_ims(void) "Clearing ICR on read due to zero IMS"
|
||||||
|
@ -1816,7 +1816,9 @@ vmxnet3_io_bar1_write(void *opaque,
|
|||||||
case VMXNET3_REG_ICR:
|
case VMXNET3_REG_ICR:
|
||||||
VMW_CBPRN("Write BAR1 [VMXNET3_REG_ICR] = %" PRIx64 ", size %d",
|
VMW_CBPRN("Write BAR1 [VMXNET3_REG_ICR] = %" PRIx64 ", size %d",
|
||||||
val, size);
|
val, size);
|
||||||
g_assert_not_reached();
|
qemu_log_mask(LOG_GUEST_ERROR,
|
||||||
|
"%s: write to read-only register VMXNET3_REG_ICR\n",
|
||||||
|
TYPE_VMXNET3);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Event Cause Register */
|
/* Event Cause Register */
|
||||||
|
@ -197,7 +197,7 @@ static void colo_compare_inconsistency_notify(CompareState *s)
|
|||||||
/* Use restricted to colo_insert_packet() */
|
/* Use restricted to colo_insert_packet() */
|
||||||
static gint seq_sorter(Packet *a, Packet *b, gpointer data)
|
static gint seq_sorter(Packet *a, Packet *b, gpointer data)
|
||||||
{
|
{
|
||||||
return a->tcp_seq - b->tcp_seq;
|
return b->tcp_seq - a->tcp_seq;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fill_pkt_tcp_info(void *data, uint32_t *max_ack)
|
static void fill_pkt_tcp_info(void *data, uint32_t *max_ack)
|
||||||
@ -421,13 +421,13 @@ pri:
|
|||||||
if (g_queue_is_empty(&conn->primary_list)) {
|
if (g_queue_is_empty(&conn->primary_list)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ppkt = g_queue_pop_head(&conn->primary_list);
|
ppkt = g_queue_pop_tail(&conn->primary_list);
|
||||||
sec:
|
sec:
|
||||||
if (g_queue_is_empty(&conn->secondary_list)) {
|
if (g_queue_is_empty(&conn->secondary_list)) {
|
||||||
g_queue_push_head(&conn->primary_list, ppkt);
|
g_queue_push_tail(&conn->primary_list, ppkt);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
spkt = g_queue_pop_head(&conn->secondary_list);
|
spkt = g_queue_pop_tail(&conn->secondary_list);
|
||||||
|
|
||||||
if (ppkt->tcp_seq == ppkt->seq_end) {
|
if (ppkt->tcp_seq == ppkt->seq_end) {
|
||||||
colo_release_primary_pkt(s, ppkt);
|
colo_release_primary_pkt(s, ppkt);
|
||||||
@ -458,7 +458,7 @@ sec:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!ppkt) {
|
if (!ppkt) {
|
||||||
g_queue_push_head(&conn->secondary_list, spkt);
|
g_queue_push_tail(&conn->secondary_list, spkt);
|
||||||
goto pri;
|
goto pri;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -477,7 +477,7 @@ sec:
|
|||||||
if (mark == COLO_COMPARE_FREE_PRIMARY) {
|
if (mark == COLO_COMPARE_FREE_PRIMARY) {
|
||||||
conn->compare_seq = ppkt->seq_end;
|
conn->compare_seq = ppkt->seq_end;
|
||||||
colo_release_primary_pkt(s, ppkt);
|
colo_release_primary_pkt(s, ppkt);
|
||||||
g_queue_push_head(&conn->secondary_list, spkt);
|
g_queue_push_tail(&conn->secondary_list, spkt);
|
||||||
goto pri;
|
goto pri;
|
||||||
} else if (mark == COLO_COMPARE_FREE_SECONDARY) {
|
} else if (mark == COLO_COMPARE_FREE_SECONDARY) {
|
||||||
conn->compare_seq = spkt->seq_end;
|
conn->compare_seq = spkt->seq_end;
|
||||||
@ -490,8 +490,8 @@ sec:
|
|||||||
goto pri;
|
goto pri;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
g_queue_push_head(&conn->primary_list, ppkt);
|
g_queue_push_tail(&conn->primary_list, ppkt);
|
||||||
g_queue_push_head(&conn->secondary_list, spkt);
|
g_queue_push_tail(&conn->secondary_list, spkt);
|
||||||
|
|
||||||
#ifdef DEBUG_COLO_PACKETS
|
#ifdef DEBUG_COLO_PACKETS
|
||||||
qemu_hexdump(stderr, "colo-compare ppkt", ppkt->data, ppkt->size);
|
qemu_hexdump(stderr, "colo-compare ppkt", ppkt->data, ppkt->size);
|
||||||
@ -673,7 +673,7 @@ static void colo_compare_packet(CompareState *s, Connection *conn,
|
|||||||
|
|
||||||
while (!g_queue_is_empty(&conn->primary_list) &&
|
while (!g_queue_is_empty(&conn->primary_list) &&
|
||||||
!g_queue_is_empty(&conn->secondary_list)) {
|
!g_queue_is_empty(&conn->secondary_list)) {
|
||||||
pkt = g_queue_pop_head(&conn->primary_list);
|
pkt = g_queue_pop_tail(&conn->primary_list);
|
||||||
result = g_queue_find_custom(&conn->secondary_list,
|
result = g_queue_find_custom(&conn->secondary_list,
|
||||||
pkt, (GCompareFunc)HandlePacket);
|
pkt, (GCompareFunc)HandlePacket);
|
||||||
|
|
||||||
@ -689,7 +689,7 @@ static void colo_compare_packet(CompareState *s, Connection *conn,
|
|||||||
* timeout, it will trigger a checkpoint request.
|
* timeout, it will trigger a checkpoint request.
|
||||||
*/
|
*/
|
||||||
trace_colo_compare_main("packet different");
|
trace_colo_compare_main("packet different");
|
||||||
g_queue_push_head(&conn->primary_list, pkt);
|
g_queue_push_tail(&conn->primary_list, pkt);
|
||||||
|
|
||||||
colo_compare_inconsistency_notify(s);
|
colo_compare_inconsistency_notify(s);
|
||||||
break;
|
break;
|
||||||
@ -819,7 +819,7 @@ static int compare_chr_send(CompareState *s,
|
|||||||
entry->buf = g_malloc(size);
|
entry->buf = g_malloc(size);
|
||||||
memcpy(entry->buf, buf, size);
|
memcpy(entry->buf, buf, size);
|
||||||
}
|
}
|
||||||
g_queue_push_head(&sendco->send_list, entry);
|
g_queue_push_tail(&sendco->send_list, entry);
|
||||||
|
|
||||||
if (sendco->done) {
|
if (sendco->done) {
|
||||||
sendco->co = qemu_coroutine_create(_compare_chr_send, sendco);
|
sendco->co = qemu_coroutine_create(_compare_chr_send, sendco);
|
||||||
@ -1267,7 +1267,7 @@ static void colo_compare_complete(UserCreatable *uc, Error **errp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!s->expired_scan_cycle) {
|
if (!s->expired_scan_cycle) {
|
||||||
/* Set default value to 3000 MS */
|
/* Set default value to 1000 MS */
|
||||||
s->expired_scan_cycle = REGULAR_PACKET_CHECK_MS;
|
s->expired_scan_cycle = REGULAR_PACKET_CHECK_MS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1347,7 +1347,7 @@ static void colo_flush_packets(void *opaque, void *user_data)
|
|||||||
Packet *pkt = NULL;
|
Packet *pkt = NULL;
|
||||||
|
|
||||||
while (!g_queue_is_empty(&conn->primary_list)) {
|
while (!g_queue_is_empty(&conn->primary_list)) {
|
||||||
pkt = g_queue_pop_head(&conn->primary_list);
|
pkt = g_queue_pop_tail(&conn->primary_list);
|
||||||
compare_chr_send(s,
|
compare_chr_send(s,
|
||||||
pkt->data,
|
pkt->data,
|
||||||
pkt->size,
|
pkt->size,
|
||||||
@ -1357,7 +1357,7 @@ static void colo_flush_packets(void *opaque, void *user_data)
|
|||||||
packet_destroy_partial(pkt, NULL);
|
packet_destroy_partial(pkt, NULL);
|
||||||
}
|
}
|
||||||
while (!g_queue_is_empty(&conn->secondary_list)) {
|
while (!g_queue_is_empty(&conn->secondary_list)) {
|
||||||
pkt = g_queue_pop_head(&conn->secondary_list);
|
pkt = g_queue_pop_tail(&conn->secondary_list);
|
||||||
packet_destroy(pkt, NULL);
|
packet_destroy(pkt, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -389,7 +389,6 @@ eth_is_ip6_extension_header_type(uint8_t hdr_type)
|
|||||||
case IP6_HOP_BY_HOP:
|
case IP6_HOP_BY_HOP:
|
||||||
case IP6_ROUTING:
|
case IP6_ROUTING:
|
||||||
case IP6_FRAGMENT:
|
case IP6_FRAGMENT:
|
||||||
case IP6_ESP:
|
|
||||||
case IP6_AUTHENTICATION:
|
case IP6_AUTHENTICATION:
|
||||||
case IP6_DESTINATON:
|
case IP6_DESTINATON:
|
||||||
case IP6_MOBILITY:
|
case IP6_MOBILITY:
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "chardev/char-fe.h"
|
#include "chardev/char-fe.h"
|
||||||
#include "qemu/iov.h"
|
#include "qemu/iov.h"
|
||||||
#include "qemu/sockets.h"
|
#include "qemu/sockets.h"
|
||||||
|
#include "block/aio-wait.h"
|
||||||
|
|
||||||
#define TYPE_FILTER_MIRROR "filter-mirror"
|
#define TYPE_FILTER_MIRROR "filter-mirror"
|
||||||
typedef struct MirrorState MirrorState;
|
typedef struct MirrorState MirrorState;
|
||||||
@ -42,20 +43,21 @@ struct MirrorState {
|
|||||||
bool vnet_hdr;
|
bool vnet_hdr;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int filter_send(MirrorState *s,
|
typedef struct FilterSendCo {
|
||||||
const struct iovec *iov,
|
MirrorState *s;
|
||||||
int iovcnt)
|
char *buf;
|
||||||
|
ssize_t size;
|
||||||
|
bool done;
|
||||||
|
int ret;
|
||||||
|
} FilterSendCo;
|
||||||
|
|
||||||
|
static int _filter_send(MirrorState *s,
|
||||||
|
char *buf,
|
||||||
|
ssize_t size)
|
||||||
{
|
{
|
||||||
NetFilterState *nf = NETFILTER(s);
|
NetFilterState *nf = NETFILTER(s);
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
ssize_t size = 0;
|
|
||||||
uint32_t len = 0;
|
uint32_t len = 0;
|
||||||
char *buf;
|
|
||||||
|
|
||||||
size = iov_size(iov, iovcnt);
|
|
||||||
if (!size) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = htonl(size);
|
len = htonl(size);
|
||||||
ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)&len, sizeof(len));
|
ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)&len, sizeof(len));
|
||||||
@ -80,10 +82,7 @@ static int filter_send(MirrorState *s,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = g_malloc(size);
|
|
||||||
iov_to_buf(iov, iovcnt, 0, buf, size);
|
|
||||||
ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)buf, size);
|
ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)buf, size);
|
||||||
g_free(buf);
|
|
||||||
if (ret != size) {
|
if (ret != size) {
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -94,6 +93,47 @@ err:
|
|||||||
return ret < 0 ? ret : -EIO;
|
return ret < 0 ? ret : -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void coroutine_fn filter_send_co(void *opaque)
|
||||||
|
{
|
||||||
|
FilterSendCo *data = opaque;
|
||||||
|
|
||||||
|
data->ret = _filter_send(data->s, data->buf, data->size);
|
||||||
|
data->done = true;
|
||||||
|
g_free(data->buf);
|
||||||
|
aio_wait_kick();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int filter_send(MirrorState *s,
|
||||||
|
const struct iovec *iov,
|
||||||
|
int iovcnt)
|
||||||
|
{
|
||||||
|
ssize_t size = iov_size(iov, iovcnt);
|
||||||
|
char *buf = NULL;
|
||||||
|
|
||||||
|
if (!size) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = g_malloc(size);
|
||||||
|
iov_to_buf(iov, iovcnt, 0, buf, size);
|
||||||
|
|
||||||
|
FilterSendCo data = {
|
||||||
|
.s = s,
|
||||||
|
.size = size,
|
||||||
|
.buf = buf,
|
||||||
|
.ret = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
Coroutine *co = qemu_coroutine_create(filter_send_co, &data);
|
||||||
|
qemu_coroutine_enter(co);
|
||||||
|
|
||||||
|
while (!data.done) {
|
||||||
|
aio_poll(qemu_get_aio_context(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return data.ret;
|
||||||
|
}
|
||||||
|
|
||||||
static void redirector_to_filter(NetFilterState *nf,
|
static void redirector_to_filter(NetFilterState *nf,
|
||||||
const uint8_t *buf,
|
const uint8_t *buf,
|
||||||
int len)
|
int len)
|
||||||
|
@ -150,6 +150,7 @@ void tap_set_sndbuf(int fd, const NetdevTapOptions *tap, Error **errp)
|
|||||||
int tap_probe_vnet_hdr(int fd, Error **errp)
|
int tap_probe_vnet_hdr(int fd, Error **errp)
|
||||||
{
|
{
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
|
memset(&ifr, 0, sizeof(ifr));
|
||||||
|
|
||||||
if (ioctl(fd, TUNGETIFF, &ifr) != 0) {
|
if (ioctl(fd, TUNGETIFF, &ifr) != 0) {
|
||||||
/* TUNGETIFF is available since kernel v2.6.27 */
|
/* TUNGETIFF is available since kernel v2.6.27 */
|
||||||
|
@ -900,6 +900,7 @@ int net_init_tap(const Netdev *netdev, const char *name,
|
|||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
vnet_hdr = tap_probe_vnet_hdr(fd, errp);
|
vnet_hdr = tap_probe_vnet_hdr(fd, errp);
|
||||||
if (vnet_hdr < 0) {
|
if (vnet_hdr < 0) {
|
||||||
|
ret = -1;
|
||||||
goto free_fail;
|
goto free_fail;
|
||||||
}
|
}
|
||||||
} else if (vnet_hdr != tap_probe_vnet_hdr(fd, NULL)) {
|
} else if (vnet_hdr != tap_probe_vnet_hdr(fd, NULL)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user