mirror of
https://github.com/qemu/qemu.git
synced 2024-11-28 14:24:02 +08:00
993f71ee33
When the VM is stopped using the HMP command "stop", soon the handler will stop reading from the vmnet interface. This causes a flood of `VMNET_INTERFACE_PACKETS_AVAILABLE` events to arrive and puts the host CPU at 100%. We fix this by removing the event handler from vmnet when the VM is no longer in a running state and restore it when we return to a running state. Signed-off-by: Joelle van Dyne <j@getutm.app> Signed-off-by: Jason Wang <jasowang@redhat.com>
65 lines
1.4 KiB
C
65 lines
1.4 KiB
C
/*
|
|
* vmnet_int.h
|
|
*
|
|
* Copyright(c) 2022 Vladislav Yaroshchuk <vladislav.yaroshchuk@jetbrains.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*
|
|
*/
|
|
#ifndef VMNET_INT_H
|
|
#define VMNET_INT_H
|
|
|
|
#include "vmnet_int.h"
|
|
#include "clients.h"
|
|
|
|
#include <vmnet/vmnet.h>
|
|
#include <dispatch/dispatch.h>
|
|
|
|
/**
|
|
* From vmnet.framework documentation
|
|
*
|
|
* Each read/write call allows up to 200 packets to be
|
|
* read or written for a maximum of 256KB.
|
|
*
|
|
* Each packet written should be a complete
|
|
* ethernet frame.
|
|
*
|
|
* https://developer.apple.com/documentation/vmnet
|
|
*/
|
|
#define VMNET_PACKETS_LIMIT 200
|
|
|
|
typedef struct VmnetState {
|
|
NetClientState nc;
|
|
interface_ref vmnet_if;
|
|
|
|
uint64_t mtu;
|
|
uint64_t max_packet_size;
|
|
|
|
dispatch_queue_t if_queue;
|
|
|
|
QEMUBH *send_bh;
|
|
|
|
struct vmpktdesc packets_buf[VMNET_PACKETS_LIMIT];
|
|
int packets_send_current_pos;
|
|
int packets_send_end_pos;
|
|
|
|
struct iovec iov_buf[VMNET_PACKETS_LIMIT];
|
|
|
|
VMChangeStateEntry *change;
|
|
} VmnetState;
|
|
|
|
const char *vmnet_status_map_str(vmnet_return_t status);
|
|
|
|
int vmnet_if_create(NetClientState *nc,
|
|
xpc_object_t if_desc,
|
|
Error **errp);
|
|
|
|
ssize_t vmnet_receive_common(NetClientState *nc,
|
|
const uint8_t *buf,
|
|
size_t size);
|
|
|
|
void vmnet_cleanup_common(NetClientState *nc);
|
|
|
|
#endif /* VMNET_INT_H */
|