mirror of https://github.com/xemu-project/xemu.git
-----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;
|
||||
}
|
||||
|
||||
if (!msix_enabled(core->owner)) {
|
||||
trace_e1000e_irq_icr_clear_nonmsix_icr_read();
|
||||
core->mac[ICR] = 0;
|
||||
}
|
||||
|
||||
if ((core->mac[ICR] & E1000_ICR_ASSERTED) &&
|
||||
(core->mac[CTRL_EXT] & E1000_CTRL_EXT_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_read_ics(uint32_t ics) "Current ICS: 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_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"
|
||||
|
|
|
@ -1816,7 +1816,9 @@ vmxnet3_io_bar1_write(void *opaque,
|
|||
case VMXNET3_REG_ICR:
|
||||
VMW_CBPRN("Write BAR1 [VMXNET3_REG_ICR] = %" PRIx64 ", size %d",
|
||||
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;
|
||||
|
||||
/* Event Cause Register */
|
||||
|
|
|
@ -197,7 +197,7 @@ static void colo_compare_inconsistency_notify(CompareState *s)
|
|||
/* Use restricted to colo_insert_packet() */
|
||||
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)
|
||||
|
@ -421,13 +421,13 @@ pri:
|
|||
if (g_queue_is_empty(&conn->primary_list)) {
|
||||
return;
|
||||
}
|
||||
ppkt = g_queue_pop_head(&conn->primary_list);
|
||||
ppkt = g_queue_pop_tail(&conn->primary_list);
|
||||
sec:
|
||||
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;
|
||||
}
|
||||
spkt = g_queue_pop_head(&conn->secondary_list);
|
||||
spkt = g_queue_pop_tail(&conn->secondary_list);
|
||||
|
||||
if (ppkt->tcp_seq == ppkt->seq_end) {
|
||||
colo_release_primary_pkt(s, ppkt);
|
||||
|
@ -458,7 +458,7 @@ sec:
|
|||
}
|
||||
}
|
||||
if (!ppkt) {
|
||||
g_queue_push_head(&conn->secondary_list, spkt);
|
||||
g_queue_push_tail(&conn->secondary_list, spkt);
|
||||
goto pri;
|
||||
}
|
||||
}
|
||||
|
@ -477,7 +477,7 @@ sec:
|
|||
if (mark == COLO_COMPARE_FREE_PRIMARY) {
|
||||
conn->compare_seq = ppkt->seq_end;
|
||||
colo_release_primary_pkt(s, ppkt);
|
||||
g_queue_push_head(&conn->secondary_list, spkt);
|
||||
g_queue_push_tail(&conn->secondary_list, spkt);
|
||||
goto pri;
|
||||
} else if (mark == COLO_COMPARE_FREE_SECONDARY) {
|
||||
conn->compare_seq = spkt->seq_end;
|
||||
|
@ -490,8 +490,8 @@ sec:
|
|||
goto pri;
|
||||
}
|
||||
} else {
|
||||
g_queue_push_head(&conn->primary_list, ppkt);
|
||||
g_queue_push_head(&conn->secondary_list, spkt);
|
||||
g_queue_push_tail(&conn->primary_list, ppkt);
|
||||
g_queue_push_tail(&conn->secondary_list, spkt);
|
||||
|
||||
#ifdef DEBUG_COLO_PACKETS
|
||||
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) &&
|
||||
!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,
|
||||
pkt, (GCompareFunc)HandlePacket);
|
||||
|
||||
|
@ -689,7 +689,7 @@ static void colo_compare_packet(CompareState *s, Connection *conn,
|
|||
* timeout, it will trigger a checkpoint request.
|
||||
*/
|
||||
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);
|
||||
break;
|
||||
|
@ -819,7 +819,7 @@ static int compare_chr_send(CompareState *s,
|
|||
entry->buf = g_malloc(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) {
|
||||
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) {
|
||||
/* Set default value to 3000 MS */
|
||||
/* Set default value to 1000 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;
|
||||
|
||||
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,
|
||||
pkt->data,
|
||||
pkt->size,
|
||||
|
@ -1357,7 +1357,7 @@ static void colo_flush_packets(void *opaque, void *user_data)
|
|||
packet_destroy_partial(pkt, NULL);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -389,7 +389,6 @@ eth_is_ip6_extension_header_type(uint8_t hdr_type)
|
|||
case IP6_HOP_BY_HOP:
|
||||
case IP6_ROUTING:
|
||||
case IP6_FRAGMENT:
|
||||
case IP6_ESP:
|
||||
case IP6_AUTHENTICATION:
|
||||
case IP6_DESTINATON:
|
||||
case IP6_MOBILITY:
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include "chardev/char-fe.h"
|
||||
#include "qemu/iov.h"
|
||||
#include "qemu/sockets.h"
|
||||
#include "block/aio-wait.h"
|
||||
|
||||
#define TYPE_FILTER_MIRROR "filter-mirror"
|
||||
typedef struct MirrorState MirrorState;
|
||||
|
@ -42,20 +43,21 @@ struct MirrorState {
|
|||
bool vnet_hdr;
|
||||
};
|
||||
|
||||
static int filter_send(MirrorState *s,
|
||||
const struct iovec *iov,
|
||||
int iovcnt)
|
||||
typedef struct FilterSendCo {
|
||||
MirrorState *s;
|
||||
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);
|
||||
int ret = 0;
|
||||
ssize_t size = 0;
|
||||
uint32_t len = 0;
|
||||
char *buf;
|
||||
|
||||
size = iov_size(iov, iovcnt);
|
||||
if (!size) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
len = htonl(size);
|
||||
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);
|
||||
g_free(buf);
|
||||
if (ret != size) {
|
||||
goto err;
|
||||
}
|
||||
|
@ -94,6 +93,47 @@ err:
|
|||
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,
|
||||
const uint8_t *buf,
|
||||
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)
|
||||
{
|
||||
struct ifreq ifr;
|
||||
memset(&ifr, 0, sizeof(ifr));
|
||||
|
||||
if (ioctl(fd, TUNGETIFF, &ifr) != 0) {
|
||||
/* TUNGETIFF is available since kernel v2.6.27 */
|
||||
|
|
Loading…
Reference in New Issue