mirror of https://github.com/proxmox/mirror_qemu
-----BEGIN PGP SIGNATURE-----
iQIcBAABAgAGBQJZ39YMAAoJENro4Ql1lpzlTKQP/2OkEmivcqm4EUkbO19UUng4 tfgWuR7fHEEegS3qWn7ZyKJMUFF62K2RD1DdAvcXDSCDT1DQJEk0qSRM5Xrg3cJp 00yYquzT72Pg/28R7/fwv9mPUK8H4AJxHnMnLyNEVkgYmqcSFkMkXy8nDYDrDvwj sByNfD6nZu036FixgB7aRsW9jFOLa0rVaUE7WGxt2sqQ+wx5qEy1s0LgE8Hf4aSG dBUJ2VWMv90p6PZmjPVoOBd/c1YehRABe14cZ9aRaqqg1IguoPf2b2viIb2KWYpO ITWK2iPASNSipmb2L4B/FIGzBsJ2dCp4+1dadKimdfqKf+PGRVuBY7i+OAvJO982 U8t+XGlt/iY7zjUKJdsVCNrLMJKCS+FU386yG0qnxLuPDrJfavZDbUoONEpWWjuO C6vyIdbswDzVPc7xoDEvoeD3VqWbtXsNgPI3gfSOGDxTJkWSlfdQNNN0aerhM4wT WttC1xsVrwM2HDjQvi8XUo4GQQTcj3+TMqKlcCt5ehz2uPuuAvCcTyHG1aqVYQm+ ylZysC74ok9knLQKLlPksmpPXyEPbZgnwxvYP9EmVMO/ndg2VA29VSpuAtJ7MXhP 02l8JVNTeT12i/hFvnFrhkfDXrFaFXspsNNu9hIhvZEYgFozx59H2hOTFNqasBoy q9QfO7yvlEtyGDLr4Fhq =NLvH -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/elmarco/tags/vu-pull-request' into staging # gpg: Signature made Thu 12 Oct 2017 21:52:28 BST # gpg: using RSA key 0xDAE8E10975969CE5 # gpg: Good signature from "Marc-André Lureau <marcandre.lureau@redhat.com>" # gpg: aka "Marc-André Lureau <marcandre.lureau@gmail.com>" # 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: 87A9 BD93 3F87 C606 D276 F62D DAE8 E109 7596 9CE5 * remotes/elmarco/tags/vu-pull-request: libvhost-user: Support VHOST_USER_SET_SLAVE_REQ_FD libvhost-user: Update and fix feature and request lists vhost-user-bridge: Only process received packets on started queues libvhost-user: vu_queue_started Signed-off-by: Peter Maydell <peter.maydell@linaro.org>master
commit
40a1e8ac2e
|
@ -56,13 +56,10 @@
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
vu_request_to_string(int req)
|
vu_request_to_string(unsigned int req)
|
||||||
{
|
{
|
||||||
#define REQ(req) [req] = #req
|
#define REQ(req) [req] = #req
|
||||||
static const char *vu_request_str[] = {
|
static const char *vu_request_str[] = {
|
||||||
REQ(VHOST_USER_NONE),
|
|
||||||
REQ(VHOST_USER_GET_FEATURES),
|
|
||||||
REQ(VHOST_USER_SET_FEATURES),
|
|
||||||
REQ(VHOST_USER_NONE),
|
REQ(VHOST_USER_NONE),
|
||||||
REQ(VHOST_USER_GET_FEATURES),
|
REQ(VHOST_USER_GET_FEATURES),
|
||||||
REQ(VHOST_USER_SET_FEATURES),
|
REQ(VHOST_USER_SET_FEATURES),
|
||||||
|
@ -83,7 +80,10 @@ vu_request_to_string(int req)
|
||||||
REQ(VHOST_USER_GET_QUEUE_NUM),
|
REQ(VHOST_USER_GET_QUEUE_NUM),
|
||||||
REQ(VHOST_USER_SET_VRING_ENABLE),
|
REQ(VHOST_USER_SET_VRING_ENABLE),
|
||||||
REQ(VHOST_USER_SEND_RARP),
|
REQ(VHOST_USER_SEND_RARP),
|
||||||
REQ(VHOST_USER_INPUT_GET_CONFIG),
|
REQ(VHOST_USER_NET_SET_MTU),
|
||||||
|
REQ(VHOST_USER_SET_SLAVE_REQ_FD),
|
||||||
|
REQ(VHOST_USER_IOTLB_MSG),
|
||||||
|
REQ(VHOST_USER_SET_VRING_ENDIAN),
|
||||||
REQ(VHOST_USER_MAX),
|
REQ(VHOST_USER_MAX),
|
||||||
};
|
};
|
||||||
#undef REQ
|
#undef REQ
|
||||||
|
@ -726,7 +726,8 @@ vu_set_vring_err_exec(VuDev *dev, VhostUserMsg *vmsg)
|
||||||
static bool
|
static bool
|
||||||
vu_get_protocol_features_exec(VuDev *dev, VhostUserMsg *vmsg)
|
vu_get_protocol_features_exec(VuDev *dev, VhostUserMsg *vmsg)
|
||||||
{
|
{
|
||||||
uint64_t features = 1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD;
|
uint64_t features = 1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD |
|
||||||
|
1ULL << VHOST_USER_PROTOCOL_F_SLAVE_REQ;
|
||||||
|
|
||||||
if (dev->iface->get_protocol_features) {
|
if (dev->iface->get_protocol_features) {
|
||||||
features |= dev->iface->get_protocol_features(dev);
|
features |= dev->iface->get_protocol_features(dev);
|
||||||
|
@ -779,6 +780,23 @@ vu_set_vring_enable_exec(VuDev *dev, VhostUserMsg *vmsg)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
vu_set_slave_req_fd(VuDev *dev, VhostUserMsg *vmsg)
|
||||||
|
{
|
||||||
|
if (vmsg->fd_num != 1) {
|
||||||
|
vu_panic(dev, "Invalid slave_req_fd message (%d fd's)", vmsg->fd_num);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dev->slave_fd != -1) {
|
||||||
|
close(dev->slave_fd);
|
||||||
|
}
|
||||||
|
dev->slave_fd = vmsg->fds[0];
|
||||||
|
DPRINT("Got slave_fd: %d\n", vmsg->fds[0]);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
vu_process_message(VuDev *dev, VhostUserMsg *vmsg)
|
vu_process_message(VuDev *dev, VhostUserMsg *vmsg)
|
||||||
{
|
{
|
||||||
|
@ -842,6 +860,8 @@ vu_process_message(VuDev *dev, VhostUserMsg *vmsg)
|
||||||
return vu_get_queue_num_exec(dev, vmsg);
|
return vu_get_queue_num_exec(dev, vmsg);
|
||||||
case VHOST_USER_SET_VRING_ENABLE:
|
case VHOST_USER_SET_VRING_ENABLE:
|
||||||
return vu_set_vring_enable_exec(dev, vmsg);
|
return vu_set_vring_enable_exec(dev, vmsg);
|
||||||
|
case VHOST_USER_SET_SLAVE_REQ_FD:
|
||||||
|
return vu_set_slave_req_fd(dev, vmsg);
|
||||||
case VHOST_USER_NONE:
|
case VHOST_USER_NONE:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -915,6 +935,10 @@ vu_deinit(VuDev *dev)
|
||||||
|
|
||||||
|
|
||||||
vu_close_log(dev);
|
vu_close_log(dev);
|
||||||
|
if (dev->slave_fd != -1) {
|
||||||
|
close(dev->slave_fd);
|
||||||
|
dev->slave_fd = -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (dev->sock != -1) {
|
if (dev->sock != -1) {
|
||||||
close(dev->sock);
|
close(dev->sock);
|
||||||
|
@ -945,6 +969,7 @@ vu_init(VuDev *dev,
|
||||||
dev->remove_watch = remove_watch;
|
dev->remove_watch = remove_watch;
|
||||||
dev->iface = iface;
|
dev->iface = iface;
|
||||||
dev->log_call_fd = -1;
|
dev->log_call_fd = -1;
|
||||||
|
dev->slave_fd = -1;
|
||||||
for (i = 0; i < VHOST_MAX_NR_VIRTQUEUE; i++) {
|
for (i = 0; i < VHOST_MAX_NR_VIRTQUEUE; i++) {
|
||||||
dev->vq[i] = (VuVirtq) {
|
dev->vq[i] = (VuVirtq) {
|
||||||
.call_fd = -1, .kick_fd = -1, .err_fd = -1,
|
.call_fd = -1, .kick_fd = -1, .err_fd = -1,
|
||||||
|
@ -966,6 +991,12 @@ vu_queue_enabled(VuDev *dev, VuVirtq *vq)
|
||||||
return vq->enable;
|
return vq->enable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
vu_queue_started(const VuDev *dev, const VuVirtq *vq)
|
||||||
|
{
|
||||||
|
return vq->started;
|
||||||
|
}
|
||||||
|
|
||||||
static inline uint16_t
|
static inline uint16_t
|
||||||
vring_avail_flags(VuVirtq *vq)
|
vring_avail_flags(VuVirtq *vq)
|
||||||
{
|
{
|
||||||
|
|
|
@ -34,6 +34,10 @@ enum VhostUserProtocolFeature {
|
||||||
VHOST_USER_PROTOCOL_F_MQ = 0,
|
VHOST_USER_PROTOCOL_F_MQ = 0,
|
||||||
VHOST_USER_PROTOCOL_F_LOG_SHMFD = 1,
|
VHOST_USER_PROTOCOL_F_LOG_SHMFD = 1,
|
||||||
VHOST_USER_PROTOCOL_F_RARP = 2,
|
VHOST_USER_PROTOCOL_F_RARP = 2,
|
||||||
|
VHOST_USER_PROTOCOL_F_REPLY_ACK = 3,
|
||||||
|
VHOST_USER_PROTOCOL_F_NET_MTU = 4,
|
||||||
|
VHOST_USER_PROTOCOL_F_SLAVE_REQ = 5,
|
||||||
|
VHOST_USER_PROTOCOL_F_CROSS_ENDIAN = 6,
|
||||||
|
|
||||||
VHOST_USER_PROTOCOL_F_MAX
|
VHOST_USER_PROTOCOL_F_MAX
|
||||||
};
|
};
|
||||||
|
@ -61,7 +65,10 @@ typedef enum VhostUserRequest {
|
||||||
VHOST_USER_GET_QUEUE_NUM = 17,
|
VHOST_USER_GET_QUEUE_NUM = 17,
|
||||||
VHOST_USER_SET_VRING_ENABLE = 18,
|
VHOST_USER_SET_VRING_ENABLE = 18,
|
||||||
VHOST_USER_SEND_RARP = 19,
|
VHOST_USER_SEND_RARP = 19,
|
||||||
VHOST_USER_INPUT_GET_CONFIG = 20,
|
VHOST_USER_NET_SET_MTU = 20,
|
||||||
|
VHOST_USER_SET_SLAVE_REQ_FD = 21,
|
||||||
|
VHOST_USER_IOTLB_MSG = 22,
|
||||||
|
VHOST_USER_SET_VRING_ENDIAN = 23,
|
||||||
VHOST_USER_MAX
|
VHOST_USER_MAX
|
||||||
} VhostUserRequest;
|
} VhostUserRequest;
|
||||||
|
|
||||||
|
@ -219,6 +226,7 @@ struct VuDev {
|
||||||
VuDevRegion regions[VHOST_MEMORY_MAX_NREGIONS];
|
VuDevRegion regions[VHOST_MEMORY_MAX_NREGIONS];
|
||||||
VuVirtq vq[VHOST_MAX_NR_VIRTQUEUE];
|
VuVirtq vq[VHOST_MAX_NR_VIRTQUEUE];
|
||||||
int log_call_fd;
|
int log_call_fd;
|
||||||
|
int slave_fd;
|
||||||
uint64_t log_size;
|
uint64_t log_size;
|
||||||
uint8_t *log_table;
|
uint8_t *log_table;
|
||||||
uint64_t features;
|
uint64_t features;
|
||||||
|
@ -334,6 +342,15 @@ void vu_queue_set_notification(VuDev *dev, VuVirtq *vq, int enable);
|
||||||
*/
|
*/
|
||||||
bool vu_queue_enabled(VuDev *dev, VuVirtq *vq);
|
bool vu_queue_enabled(VuDev *dev, VuVirtq *vq);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* vu_queue_started:
|
||||||
|
* @dev: a VuDev context
|
||||||
|
* @vq: a VuVirtq queue
|
||||||
|
*
|
||||||
|
* Returns: whether the queue is started.
|
||||||
|
*/
|
||||||
|
bool vu_queue_started(const VuDev *dev, const VuVirtq *vq);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* vu_queue_empty:
|
* vu_queue_empty:
|
||||||
* @dev: a VuDev context
|
* @dev: a VuDev context
|
||||||
|
|
|
@ -277,6 +277,7 @@ vubr_backend_recv_cb(int sock, void *ctx)
|
||||||
DPRINT(" hdrlen = %d\n", hdrlen);
|
DPRINT(" hdrlen = %d\n", hdrlen);
|
||||||
|
|
||||||
if (!vu_queue_enabled(dev, vq) ||
|
if (!vu_queue_enabled(dev, vq) ||
|
||||||
|
!vu_queue_started(dev, vq) ||
|
||||||
!vu_queue_avail_bytes(dev, vq, hdrlen, 0)) {
|
!vu_queue_avail_bytes(dev, vq, hdrlen, 0)) {
|
||||||
DPRINT("Got UDP packet, but no available descriptors on RX virtq.\n");
|
DPRINT("Got UDP packet, but no available descriptors on RX virtq.\n");
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in New Issue