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

Version: GnuPG v1
 
 iQEcBAABAgAGBQJfq+FCAAoJEO8Ells5jWIRN3gIAKCdxvA6m1Jvlz6cokSUCqEr
 jEKDqGNlVcH+aMykLpdOTF3oTy9zsd885wqbeG27Z+eDBsOjVPm0SWtPM0Ednlhl
 ZTSXtlkSd8w1AH+Kf1oxiyvuBxabiqBMpnIZAnMuRSjrcPVEa+Kkfi0FP5eeNAiu
 DoQlXw/RdlbaJLqvhzoe9FZdWa+tIL0IUeGW6l2Dx2DdQ7h6Es3mesPl2jtd7sl0
 iJU0jB2WGYjjn7wcqwIOFglYxUU7a5EJi2Jm4Zt3SyNFqlloYfbSTErWHwoTvYAP
 wSm8oeSYSGDy642NhWM4F6PazxDG1Q7TCFoAjRXwu0tz9xbNQyR+XP9K012tEAo=
 =Hvd0
 -----END PGP SIGNATURE-----

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

# gpg: Signature made Wed 11 Nov 2020 13:04:02 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:
  hw/net/can/ctucan_core: Use stl_le_p to write to tx_buffers
  hw/net/can/ctucan_core: Handle big-endian hosts
  hw/net/can/ctucan: Avoid unused value in ctucan_send_ready_buffers()
  hw/net/can/ctucan: Don't allow guest to write off end of tx_buffer
  net/l2tpv3: Remove redundant check in net_init_l2tpv3()
  net: remove an assert call in eth_get_gso_type
  net/colo-compare.c: Increase default queued packet scan frequency
  net/colo-compare.c: Add secondary old packet detection
  net/colo-compare.c: Change the timer clock type
  net/colo-compare.c: Fix compare_timeout format issue
  colo-compare: check mark in mutual exclusion
  colo-compare: fix missing compare_seq initialization
  Fix the qemu crash when guest shutdown in COLO mode
  Reduce the time of checkpoint for COLO
  Optimize seq_sorter function for colo-compare
  net/filter-rewriter: destroy g_hash_table in colo_rewriter_cleanup
  virtio-net: Set mac address to hardware if the peer is vdpa

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2020-11-11 14:00:35 +00:00
commit 54cd1213ce
10 changed files with 67 additions and 60 deletions

View File

@ -240,8 +240,6 @@ static void ctucan_send_ready_buffers(CtuCanCoreState *s)
uint8_t *pf; uint8_t *pf;
int buff2tx_idx; int buff2tx_idx;
uint32_t tx_prio_max; uint32_t tx_prio_max;
unsigned int buff_st;
uint32_t buff_st_mask;
if (!s->mode_settings.s.ena) { if (!s->mode_settings.s.ena) {
return; return;
@ -256,10 +254,7 @@ static void ctucan_send_ready_buffers(CtuCanCoreState *s)
for (i = 0; i < CTUCAN_CORE_TXBUF_NUM; i++) { for (i = 0; i < CTUCAN_CORE_TXBUF_NUM; i++) {
uint32_t prio; uint32_t prio;
buff_st_mask = 0xf << (i * 4); if (extract32(s->tx_status.u32, i * 4, 4) != TXT_RDY) {
buff_st = (s->tx_status.u32 >> (i * 4)) & 0xf;
if (buff_st != TXT_RDY) {
continue; continue;
} }
prio = (s->tx_priority.u32 >> (i * 4)) & 0x7; prio = (s->tx_priority.u32 >> (i * 4)) & 0x7;
@ -271,10 +266,7 @@ static void ctucan_send_ready_buffers(CtuCanCoreState *s)
if (buff2tx_idx == -1) { if (buff2tx_idx == -1) {
break; break;
} }
buff_st_mask = 0xf << (buff2tx_idx * 4);
buff_st = (s->tx_status.u32 >> (buff2tx_idx * 4)) & 0xf;
int_stat.u32 = 0; int_stat.u32 = 0;
buff_st = TXT_RDY;
pf = s->tx_buffer[buff2tx_idx].data; pf = s->tx_buffer[buff2tx_idx].data;
ctucan_buff2frame(pf, &frame); ctucan_buff2frame(pf, &frame);
s->status.s.idle = 0; s->status.s.idle = 0;
@ -283,12 +275,11 @@ static void ctucan_send_ready_buffers(CtuCanCoreState *s)
s->status.s.idle = 1; s->status.s.idle = 1;
s->status.s.txs = 0; s->status.s.txs = 0;
s->tx_fr_ctr.s.tx_fr_ctr_val++; s->tx_fr_ctr.s.tx_fr_ctr_val++;
buff_st = TXT_TOK;
int_stat.s.txi = 1; int_stat.s.txi = 1;
int_stat.s.txbhci = 1; int_stat.s.txbhci = 1;
s->int_stat.u32 |= int_stat.u32 & ~s->int_mask.u32; s->int_stat.u32 |= int_stat.u32 & ~s->int_mask.u32;
s->tx_status.u32 = (s->tx_status.u32 & ~buff_st_mask) | s->tx_status.u32 = deposit32(s->tx_status.u32,
(buff_st << (buff2tx_idx * 4)); buff2tx_idx * 4, 4, TXT_TOK);
} while (1); } while (1);
} }
@ -303,7 +294,7 @@ void ctucan_mem_write(CtuCanCoreState *s, hwaddr addr, uint64_t val,
DPRINTF("write 0x%02llx addr 0x%02x\n", DPRINTF("write 0x%02llx addr 0x%02x\n",
(unsigned long long)val, (unsigned int)addr); (unsigned long long)val, (unsigned int)addr);
if (addr > CTUCAN_CORE_MEM_SIZE) { if (addr >= CTUCAN_CORE_MEM_SIZE) {
return; return;
} }
@ -312,9 +303,9 @@ void ctucan_mem_write(CtuCanCoreState *s, hwaddr addr, uint64_t val,
addr -= CTU_CAN_FD_TXTB1_DATA_1; addr -= CTU_CAN_FD_TXTB1_DATA_1;
buff_num = addr / CTUCAN_CORE_TXBUFF_SPAN; buff_num = addr / CTUCAN_CORE_TXBUFF_SPAN;
addr %= CTUCAN_CORE_TXBUFF_SPAN; addr %= CTUCAN_CORE_TXBUFF_SPAN;
if (buff_num < CTUCAN_CORE_TXBUF_NUM) { if ((buff_num < CTUCAN_CORE_TXBUF_NUM) &&
uint32_t *bufp = (uint32_t *)(s->tx_buffer[buff_num].data + addr); ((addr + size) <= sizeof(s->tx_buffer[buff_num].data))) {
*bufp = cpu_to_le32(val); stn_le_p(s->tx_buffer[buff_num].data + addr, size, val);
} }
} else { } else {
switch (addr & ~3) { switch (addr & ~3) {

View File

@ -31,8 +31,7 @@
#include "exec/hwaddr.h" #include "exec/hwaddr.h"
#include "net/can_emu.h" #include "net/can_emu.h"
#ifndef HOST_WORDS_BIGENDIAN
#ifndef __LITTLE_ENDIAN_BITFIELD
#define __LITTLE_ENDIAN_BITFIELD 1 #define __LITTLE_ENDIAN_BITFIELD 1
#endif #endif

View File

@ -3395,6 +3395,12 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
nc = qemu_get_queue(n->nic); nc = qemu_get_queue(n->nic);
nc->rxfilter_notify_enabled = 1; nc->rxfilter_notify_enabled = 1;
if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) {
struct virtio_net_config netcfg = {};
memcpy(&netcfg.mac, &n->nic_conf.macaddr, ETH_ALEN);
vhost_net_set_config(get_vhost_net(nc->peer),
(uint8_t *)&netcfg, 0, ETH_ALEN, VHOST_SET_CONFIG_TYPE_MASTER);
}
QTAILQ_INIT(&n->rsc_chains); QTAILQ_INIT(&n->rsc_chains);
n->qdev = dev; n->qdev = dev;

View File

@ -3011,6 +3011,18 @@ static void decompress_data_with_multi_threads(QEMUFile *f,
qemu_mutex_unlock(&decomp_done_lock); qemu_mutex_unlock(&decomp_done_lock);
} }
/*
* we must set ram_bulk_stage to false, otherwise in
* migation_bitmap_find_dirty the bitmap will be unused and
* all the pages in ram cache wil be flushed to the ram of
* secondary VM.
*/
static void colo_init_ram_state(void)
{
ram_state_init(&ram_state);
ram_state->ram_bulk_stage = false;
}
/* /*
* colo cache: this is for secondary VM, we cache the whole * colo cache: this is for secondary VM, we cache the whole
* memory of the secondary VM, it is need to hold the global lock * memory of the secondary VM, it is need to hold the global lock
@ -3054,7 +3066,7 @@ int colo_init_ram_cache(void)
} }
} }
ram_state_init(&ram_state); colo_init_ram_state();
return 0; return 0;
} }

View File

@ -52,7 +52,7 @@ static NotifierList colo_compare_notifiers =
#define COLO_COMPARE_FREE_PRIMARY 0x01 #define COLO_COMPARE_FREE_PRIMARY 0x01
#define COLO_COMPARE_FREE_SECONDARY 0x02 #define COLO_COMPARE_FREE_SECONDARY 0x02
#define REGULAR_PACKET_CHECK_MS 3000 #define REGULAR_PACKET_CHECK_MS 1000
#define DEFAULT_TIME_OUT_MS 3000 #define DEFAULT_TIME_OUT_MS 3000
/* #define DEBUG_COLO_PACKETS */ /* #define DEBUG_COLO_PACKETS */
@ -120,7 +120,7 @@ struct CompareState {
SendCo out_sendco; SendCo out_sendco;
SendCo notify_sendco; SendCo notify_sendco;
bool vnet_hdr; bool vnet_hdr;
uint32_t compare_timeout; uint64_t compare_timeout;
uint32_t expired_scan_cycle; uint32_t expired_scan_cycle;
/* /*
@ -194,13 +194,10 @@ static void colo_compare_inconsistency_notify(CompareState *s)
} }
} }
/* 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)
{ {
struct tcp_hdr *atcp, *btcp; return a->tcp_seq - b->tcp_seq;
atcp = (struct tcp_hdr *)(a->transport_header);
btcp = (struct tcp_hdr *)(b->transport_header);
return ntohl(atcp->th_seq) - ntohl(btcp->th_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)
@ -480,13 +477,11 @@ sec:
colo_release_primary_pkt(s, ppkt); colo_release_primary_pkt(s, ppkt);
g_queue_push_head(&conn->secondary_list, spkt); g_queue_push_head(&conn->secondary_list, spkt);
goto pri; goto pri;
} } else if (mark == COLO_COMPARE_FREE_SECONDARY) {
if (mark == COLO_COMPARE_FREE_SECONDARY) {
conn->compare_seq = spkt->seq_end; conn->compare_seq = spkt->seq_end;
packet_destroy(spkt, NULL); packet_destroy(spkt, NULL);
goto sec; goto sec;
} } else if (mark == (COLO_COMPARE_FREE_PRIMARY | COLO_COMPARE_FREE_SECONDARY)) {
if (mark == (COLO_COMPARE_FREE_PRIMARY | COLO_COMPARE_FREE_SECONDARY)) {
conn->compare_seq = ppkt->seq_end; conn->compare_seq = ppkt->seq_end;
colo_release_primary_pkt(s, ppkt); colo_release_primary_pkt(s, ppkt);
packet_destroy(spkt, NULL); packet_destroy(spkt, NULL);
@ -641,19 +636,26 @@ void colo_compare_unregister_notifier(Notifier *notify)
static int colo_old_packet_check_one_conn(Connection *conn, static int colo_old_packet_check_one_conn(Connection *conn,
CompareState *s) CompareState *s)
{ {
GList *result = NULL; if (!g_queue_is_empty(&conn->primary_list)) {
if (g_queue_find_custom(&conn->primary_list,
&s->compare_timeout,
(GCompareFunc)colo_old_packet_check_one))
goto out;
}
result = g_queue_find_custom(&conn->primary_list, if (!g_queue_is_empty(&conn->secondary_list)) {
&s->compare_timeout, if (g_queue_find_custom(&conn->secondary_list,
(GCompareFunc)colo_old_packet_check_one); &s->compare_timeout,
(GCompareFunc)colo_old_packet_check_one))
if (result) { goto out;
/* Do checkpoint will flush old packet */
colo_compare_inconsistency_notify(s);
return 0;
} }
return 1; return 1;
out:
/* Do checkpoint will flush old packet */
colo_compare_inconsistency_notify(s);
return 0;
} }
/* /*
@ -905,7 +907,7 @@ static void check_old_packet_regular(void *opaque)
/* if have old packet we will notify checkpoint */ /* if have old packet we will notify checkpoint */
colo_old_packet_check(s); colo_old_packet_check(s);
timer_mod(s->packet_check_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + timer_mod(s->packet_check_timer, qemu_clock_get_ms(QEMU_CLOCK_HOST) +
s->expired_scan_cycle); s->expired_scan_cycle);
} }
@ -939,10 +941,10 @@ static void colo_compare_timer_init(CompareState *s)
{ {
AioContext *ctx = iothread_get_aio_context(s->iothread); AioContext *ctx = iothread_get_aio_context(s->iothread);
s->packet_check_timer = aio_timer_new(ctx, QEMU_CLOCK_VIRTUAL, s->packet_check_timer = aio_timer_new(ctx, QEMU_CLOCK_HOST,
SCALE_MS, check_old_packet_regular, SCALE_MS, check_old_packet_regular,
s); s);
timer_mod(s->packet_check_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + timer_mod(s->packet_check_timer, qemu_clock_get_ms(QEMU_CLOCK_HOST) +
s->expired_scan_cycle); s->expired_scan_cycle);
} }
@ -1081,9 +1083,9 @@ static void compare_get_timeout(Object *obj, Visitor *v,
Error **errp) Error **errp)
{ {
CompareState *s = COLO_COMPARE(obj); CompareState *s = COLO_COMPARE(obj);
uint32_t value = s->compare_timeout; uint64_t value = s->compare_timeout;
visit_type_uint32(v, name, &value, errp); visit_type_uint64(v, name, &value, errp);
} }
static void compare_set_timeout(Object *obj, Visitor *v, static void compare_set_timeout(Object *obj, Visitor *v,
@ -1146,9 +1148,9 @@ static void set_max_queue_size(Object *obj, Visitor *v,
Error **errp) Error **errp)
{ {
Error *local_err = NULL; Error *local_err = NULL;
uint32_t value; uint64_t value;
visit_type_uint32(v, name, &value, &local_err); visit_type_uint64(v, name, &value, &local_err);
if (local_err) { if (local_err) {
goto out; goto out;
} }
@ -1396,7 +1398,7 @@ static void colo_compare_init(Object *obj)
object_property_add_str(obj, "notify_dev", object_property_add_str(obj, "notify_dev",
compare_get_notify_dev, compare_set_notify_dev); compare_get_notify_dev, compare_set_notify_dev);
object_property_add(obj, "compare_timeout", "uint32", object_property_add(obj, "compare_timeout", "uint64",
compare_get_timeout, compare_get_timeout,
compare_set_timeout, NULL, NULL); compare_set_timeout, NULL, NULL);

View File

@ -133,14 +133,11 @@ void reverse_connection_key(ConnectionKey *key)
Connection *connection_new(ConnectionKey *key) Connection *connection_new(ConnectionKey *key)
{ {
Connection *conn = g_slice_new(Connection); Connection *conn = g_slice_new0(Connection);
conn->ip_proto = key->ip_proto; conn->ip_proto = key->ip_proto;
conn->processing = false; conn->processing = false;
conn->offset = 0;
conn->tcp_state = TCPS_CLOSED; conn->tcp_state = TCPS_CLOSED;
conn->pack = 0;
conn->sack = 0;
g_queue_init(&conn->primary_list); g_queue_init(&conn->primary_list);
g_queue_init(&conn->secondary_list); g_queue_init(&conn->secondary_list);

View File

@ -16,6 +16,7 @@
*/ */
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/log.h"
#include "net/eth.h" #include "net/eth.h"
#include "net/checksum.h" #include "net/checksum.h"
#include "net/tap.h" #include "net/tap.h"
@ -71,9 +72,8 @@ eth_get_gso_type(uint16_t l3_proto, uint8_t *l3_hdr, uint8_t l4proto)
return VIRTIO_NET_HDR_GSO_TCPV6 | ecn_state; return VIRTIO_NET_HDR_GSO_TCPV6 | ecn_state;
} }
} }
qemu_log_mask(LOG_UNIMP, "%s: probably not GSO frame, "
/* Unsupported offload */ "unknown L3 protocol: 0x%04"PRIx16"\n", __func__, l3_proto);
g_assert_not_reached();
return VIRTIO_NET_HDR_GSO_NONE | ecn_state; return VIRTIO_NET_HDR_GSO_NONE | ecn_state;
} }

View File

@ -381,6 +381,8 @@ static void colo_rewriter_cleanup(NetFilterState *nf)
filter_rewriter_flush(nf); filter_rewriter_flush(nf);
g_free(s->incoming_queue); g_free(s->incoming_queue);
} }
g_hash_table_destroy(s->connection_track_table);
} }
static void colo_rewriter_setup(NetFilterState *nf, Error **errp) static void colo_rewriter_setup(NetFilterState *nf, Error **errp)

View File

@ -655,9 +655,8 @@ int net_init_l2tpv3(const Netdev *netdev,
error_setg(errp, "could not bind socket err=%i", errno); error_setg(errp, "could not bind socket err=%i", errno);
goto outerr; goto outerr;
} }
if (result) {
freeaddrinfo(result); freeaddrinfo(result);
}
memset(&hints, 0, sizeof(hints)); memset(&hints, 0, sizeof(hints));
@ -686,9 +685,7 @@ int net_init_l2tpv3(const Netdev *netdev,
memcpy(s->dgram_dst, result->ai_addr, result->ai_addrlen); memcpy(s->dgram_dst, result->ai_addr, result->ai_addrlen);
s->dst_size = result->ai_addrlen; s->dst_size = result->ai_addrlen;
if (result) { freeaddrinfo(result);
freeaddrinfo(result);
}
if (l2tpv3->has_counter && l2tpv3->counter) { if (l2tpv3->has_counter && l2tpv3->counter) {
s->has_counter = true; s->has_counter = true;

View File

@ -632,6 +632,7 @@ static const RunStateTransition runstate_transitions_def[] = {
{ RUN_STATE_SHUTDOWN, RUN_STATE_PAUSED }, { RUN_STATE_SHUTDOWN, RUN_STATE_PAUSED },
{ RUN_STATE_SHUTDOWN, RUN_STATE_FINISH_MIGRATE }, { RUN_STATE_SHUTDOWN, RUN_STATE_FINISH_MIGRATE },
{ RUN_STATE_SHUTDOWN, RUN_STATE_PRELAUNCH }, { RUN_STATE_SHUTDOWN, RUN_STATE_PRELAUNCH },
{ RUN_STATE_SHUTDOWN, RUN_STATE_COLO },
{ RUN_STATE_DEBUG, RUN_STATE_SUSPENDED }, { RUN_STATE_DEBUG, RUN_STATE_SUSPENDED },
{ RUN_STATE_RUNNING, RUN_STATE_SUSPENDED }, { RUN_STATE_RUNNING, RUN_STATE_SUSPENDED },