libvhost-user: implement in-band notifications
Add support for VHOST_USER_PROTOCOL_F_IN_BAND_NOTIFICATIONS, but as it's not desired by default, don't enable it unless the device implementation opts in by returning it from its protocol features callback. Note that I updated vu_set_vring_err_exec(), but didn't add any sending of the VHOST_USER_SLAVE_VRING_ERR message as there's no write to the err_fd today either. This also adds vu_queue_notify_sync() which can be used to force a synchronous notification if inband notifications are supported. Previously, I had left out the slave->master direction handling of F_REPLY_ACK, this now adds some code to support it as well. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Message-Id: <20200123081708.7817-7-johannes@sipsolutions.net> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
		
				
					committed by
					
						
						Michael S. Tsirkin
					
				
			
			
				
	
			
			
			
						parent
						
							3348e7e34f
						
					
				
				
					commit
					ff1320050a
				
			@@ -54,6 +54,7 @@ enum VhostUserProtocolFeature {
 | 
			
		||||
    VHOST_USER_PROTOCOL_F_SLAVE_SEND_FD = 10,
 | 
			
		||||
    VHOST_USER_PROTOCOL_F_HOST_NOTIFIER = 11,
 | 
			
		||||
    VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD = 12,
 | 
			
		||||
    VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS = 14,
 | 
			
		||||
 | 
			
		||||
    VHOST_USER_PROTOCOL_F_MAX
 | 
			
		||||
};
 | 
			
		||||
@@ -95,6 +96,7 @@ typedef enum VhostUserRequest {
 | 
			
		||||
    VHOST_USER_GET_INFLIGHT_FD = 31,
 | 
			
		||||
    VHOST_USER_SET_INFLIGHT_FD = 32,
 | 
			
		||||
    VHOST_USER_GPU_SET_SOCKET = 33,
 | 
			
		||||
    VHOST_USER_VRING_KICK = 35,
 | 
			
		||||
    VHOST_USER_MAX
 | 
			
		||||
} VhostUserRequest;
 | 
			
		||||
 | 
			
		||||
@@ -103,6 +105,8 @@ typedef enum VhostUserSlaveRequest {
 | 
			
		||||
    VHOST_USER_SLAVE_IOTLB_MSG = 1,
 | 
			
		||||
    VHOST_USER_SLAVE_CONFIG_CHANGE_MSG = 2,
 | 
			
		||||
    VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG = 3,
 | 
			
		||||
    VHOST_USER_SLAVE_VRING_CALL = 4,
 | 
			
		||||
    VHOST_USER_SLAVE_VRING_ERR = 5,
 | 
			
		||||
    VHOST_USER_SLAVE_MAX
 | 
			
		||||
}  VhostUserSlaveRequest;
 | 
			
		||||
 | 
			
		||||
@@ -528,6 +532,16 @@ bool vu_queue_empty(VuDev *dev, VuVirtq *vq);
 | 
			
		||||
 */
 | 
			
		||||
void vu_queue_notify(VuDev *dev, VuVirtq *vq);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * vu_queue_notify_sync:
 | 
			
		||||
 * @dev: a VuDev context
 | 
			
		||||
 * @vq: a VuVirtq queue
 | 
			
		||||
 *
 | 
			
		||||
 * Request to notify the queue via callfd (skipped if unnecessary)
 | 
			
		||||
 * or sync message if possible.
 | 
			
		||||
 */
 | 
			
		||||
void vu_queue_notify_sync(VuDev *dev, VuVirtq *vq);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * vu_queue_pop:
 | 
			
		||||
 * @dev: a VuDev context
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user