-----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:
commit
54cd1213ce
@ -240,8 +240,6 @@ static void ctucan_send_ready_buffers(CtuCanCoreState *s)
|
||||
uint8_t *pf;
|
||||
int buff2tx_idx;
|
||||
uint32_t tx_prio_max;
|
||||
unsigned int buff_st;
|
||||
uint32_t buff_st_mask;
|
||||
|
||||
if (!s->mode_settings.s.ena) {
|
||||
return;
|
||||
@ -256,10 +254,7 @@ static void ctucan_send_ready_buffers(CtuCanCoreState *s)
|
||||
for (i = 0; i < CTUCAN_CORE_TXBUF_NUM; i++) {
|
||||
uint32_t prio;
|
||||
|
||||
buff_st_mask = 0xf << (i * 4);
|
||||
buff_st = (s->tx_status.u32 >> (i * 4)) & 0xf;
|
||||
|
||||
if (buff_st != TXT_RDY) {
|
||||
if (extract32(s->tx_status.u32, i * 4, 4) != TXT_RDY) {
|
||||
continue;
|
||||
}
|
||||
prio = (s->tx_priority.u32 >> (i * 4)) & 0x7;
|
||||
@ -271,10 +266,7 @@ static void ctucan_send_ready_buffers(CtuCanCoreState *s)
|
||||
if (buff2tx_idx == -1) {
|
||||
break;
|
||||
}
|
||||
buff_st_mask = 0xf << (buff2tx_idx * 4);
|
||||
buff_st = (s->tx_status.u32 >> (buff2tx_idx * 4)) & 0xf;
|
||||
int_stat.u32 = 0;
|
||||
buff_st = TXT_RDY;
|
||||
pf = s->tx_buffer[buff2tx_idx].data;
|
||||
ctucan_buff2frame(pf, &frame);
|
||||
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.txs = 0;
|
||||
s->tx_fr_ctr.s.tx_fr_ctr_val++;
|
||||
buff_st = TXT_TOK;
|
||||
int_stat.s.txi = 1;
|
||||
int_stat.s.txbhci = 1;
|
||||
s->int_stat.u32 |= int_stat.u32 & ~s->int_mask.u32;
|
||||
s->tx_status.u32 = (s->tx_status.u32 & ~buff_st_mask) |
|
||||
(buff_st << (buff2tx_idx * 4));
|
||||
s->tx_status.u32 = deposit32(s->tx_status.u32,
|
||||
buff2tx_idx * 4, 4, TXT_TOK);
|
||||
} 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",
|
||||
(unsigned long long)val, (unsigned int)addr);
|
||||
|
||||
if (addr > CTUCAN_CORE_MEM_SIZE) {
|
||||
if (addr >= CTUCAN_CORE_MEM_SIZE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -312,9 +303,9 @@ void ctucan_mem_write(CtuCanCoreState *s, hwaddr addr, uint64_t val,
|
||||
addr -= CTU_CAN_FD_TXTB1_DATA_1;
|
||||
buff_num = addr / CTUCAN_CORE_TXBUFF_SPAN;
|
||||
addr %= CTUCAN_CORE_TXBUFF_SPAN;
|
||||
if (buff_num < CTUCAN_CORE_TXBUF_NUM) {
|
||||
uint32_t *bufp = (uint32_t *)(s->tx_buffer[buff_num].data + addr);
|
||||
*bufp = cpu_to_le32(val);
|
||||
if ((buff_num < CTUCAN_CORE_TXBUF_NUM) &&
|
||||
((addr + size) <= sizeof(s->tx_buffer[buff_num].data))) {
|
||||
stn_le_p(s->tx_buffer[buff_num].data + addr, size, val);
|
||||
}
|
||||
} else {
|
||||
switch (addr & ~3) {
|
||||
|
@ -31,8 +31,7 @@
|
||||
#include "exec/hwaddr.h"
|
||||
#include "net/can_emu.h"
|
||||
|
||||
|
||||
#ifndef __LITTLE_ENDIAN_BITFIELD
|
||||
#ifndef HOST_WORDS_BIGENDIAN
|
||||
#define __LITTLE_ENDIAN_BITFIELD 1
|
||||
#endif
|
||||
|
||||
|
@ -3395,6 +3395,12 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
|
||||
nc = qemu_get_queue(n->nic);
|
||||
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);
|
||||
n->qdev = dev;
|
||||
|
||||
|
@ -3011,6 +3011,18 @@ static void decompress_data_with_multi_threads(QEMUFile *f,
|
||||
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
|
||||
* 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;
|
||||
}
|
||||
|
||||
|
@ -52,7 +52,7 @@ static NotifierList colo_compare_notifiers =
|
||||
#define COLO_COMPARE_FREE_PRIMARY 0x01
|
||||
#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 DEBUG_COLO_PACKETS */
|
||||
@ -120,7 +120,7 @@ struct CompareState {
|
||||
SendCo out_sendco;
|
||||
SendCo notify_sendco;
|
||||
bool vnet_hdr;
|
||||
uint32_t compare_timeout;
|
||||
uint64_t compare_timeout;
|
||||
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)
|
||||
{
|
||||
struct tcp_hdr *atcp, *btcp;
|
||||
|
||||
atcp = (struct tcp_hdr *)(a->transport_header);
|
||||
btcp = (struct tcp_hdr *)(b->transport_header);
|
||||
return ntohl(atcp->th_seq) - ntohl(btcp->th_seq);
|
||||
return a->tcp_seq - b->tcp_seq;
|
||||
}
|
||||
|
||||
static void fill_pkt_tcp_info(void *data, uint32_t *max_ack)
|
||||
@ -480,13 +477,11 @@ sec:
|
||||
colo_release_primary_pkt(s, ppkt);
|
||||
g_queue_push_head(&conn->secondary_list, spkt);
|
||||
goto pri;
|
||||
}
|
||||
if (mark == COLO_COMPARE_FREE_SECONDARY) {
|
||||
} else if (mark == COLO_COMPARE_FREE_SECONDARY) {
|
||||
conn->compare_seq = spkt->seq_end;
|
||||
packet_destroy(spkt, NULL);
|
||||
goto sec;
|
||||
}
|
||||
if (mark == (COLO_COMPARE_FREE_PRIMARY | COLO_COMPARE_FREE_SECONDARY)) {
|
||||
} else if (mark == (COLO_COMPARE_FREE_PRIMARY | COLO_COMPARE_FREE_SECONDARY)) {
|
||||
conn->compare_seq = ppkt->seq_end;
|
||||
colo_release_primary_pkt(s, ppkt);
|
||||
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,
|
||||
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,
|
||||
&s->compare_timeout,
|
||||
(GCompareFunc)colo_old_packet_check_one);
|
||||
|
||||
if (result) {
|
||||
/* Do checkpoint will flush old packet */
|
||||
colo_compare_inconsistency_notify(s);
|
||||
return 0;
|
||||
if (!g_queue_is_empty(&conn->secondary_list)) {
|
||||
if (g_queue_find_custom(&conn->secondary_list,
|
||||
&s->compare_timeout,
|
||||
(GCompareFunc)colo_old_packet_check_one))
|
||||
goto out;
|
||||
}
|
||||
|
||||
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 */
|
||||
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);
|
||||
}
|
||||
|
||||
@ -939,10 +941,10 @@ static void colo_compare_timer_init(CompareState *s)
|
||||
{
|
||||
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,
|
||||
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);
|
||||
}
|
||||
|
||||
@ -1081,9 +1083,9 @@ static void compare_get_timeout(Object *obj, Visitor *v,
|
||||
Error **errp)
|
||||
{
|
||||
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,
|
||||
@ -1146,9 +1148,9 @@ static void set_max_queue_size(Object *obj, Visitor *v,
|
||||
Error **errp)
|
||||
{
|
||||
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) {
|
||||
goto out;
|
||||
}
|
||||
@ -1396,7 +1398,7 @@ static void colo_compare_init(Object *obj)
|
||||
object_property_add_str(obj, "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_set_timeout, NULL, NULL);
|
||||
|
||||
|
@ -133,14 +133,11 @@ void reverse_connection_key(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->processing = false;
|
||||
conn->offset = 0;
|
||||
conn->tcp_state = TCPS_CLOSED;
|
||||
conn->pack = 0;
|
||||
conn->sack = 0;
|
||||
g_queue_init(&conn->primary_list);
|
||||
g_queue_init(&conn->secondary_list);
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/log.h"
|
||||
#include "net/eth.h"
|
||||
#include "net/checksum.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;
|
||||
}
|
||||
}
|
||||
|
||||
/* Unsupported offload */
|
||||
g_assert_not_reached();
|
||||
qemu_log_mask(LOG_UNIMP, "%s: probably not GSO frame, "
|
||||
"unknown L3 protocol: 0x%04"PRIx16"\n", __func__, l3_proto);
|
||||
|
||||
return VIRTIO_NET_HDR_GSO_NONE | ecn_state;
|
||||
}
|
||||
|
@ -381,6 +381,8 @@ static void colo_rewriter_cleanup(NetFilterState *nf)
|
||||
filter_rewriter_flush(nf);
|
||||
g_free(s->incoming_queue);
|
||||
}
|
||||
|
||||
g_hash_table_destroy(s->connection_track_table);
|
||||
}
|
||||
|
||||
static void colo_rewriter_setup(NetFilterState *nf, Error **errp)
|
||||
|
@ -655,9 +655,8 @@ int net_init_l2tpv3(const Netdev *netdev,
|
||||
error_setg(errp, "could not bind socket err=%i", errno);
|
||||
goto outerr;
|
||||
}
|
||||
if (result) {
|
||||
freeaddrinfo(result);
|
||||
}
|
||||
|
||||
freeaddrinfo(result);
|
||||
|
||||
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);
|
||||
s->dst_size = result->ai_addrlen;
|
||||
|
||||
if (result) {
|
||||
freeaddrinfo(result);
|
||||
}
|
||||
freeaddrinfo(result);
|
||||
|
||||
if (l2tpv3->has_counter && l2tpv3->counter) {
|
||||
s->has_counter = true;
|
||||
|
@ -632,6 +632,7 @@ static const RunStateTransition runstate_transitions_def[] = {
|
||||
{ RUN_STATE_SHUTDOWN, RUN_STATE_PAUSED },
|
||||
{ RUN_STATE_SHUTDOWN, RUN_STATE_FINISH_MIGRATE },
|
||||
{ RUN_STATE_SHUTDOWN, RUN_STATE_PRELAUNCH },
|
||||
{ RUN_STATE_SHUTDOWN, RUN_STATE_COLO },
|
||||
|
||||
{ RUN_STATE_DEBUG, RUN_STATE_SUSPENDED },
|
||||
{ RUN_STATE_RUNNING, RUN_STATE_SUSPENDED },
|
||||
|
Loading…
Reference in New Issue
Block a user