mirror of
				https://github.com/qemu/qemu.git
				synced 2025-10-26 03:33:28 +00:00 
			
		
		
		
	 993f71ee33
			
		
	
	
		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 */
 |