aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven <sluong@cisco.com>2017-07-29 08:56:08 -0700
committerFlorin Coras <florin.coras@gmail.com>2017-08-31 20:48:25 +0000
commit49a04b9545de22beaef5218d3985896d6ba37982 (patch)
tree70a6ae5a630820f47254ba70a36286771774b45c
parentda78c85c5504f0a429d1feb57b6789254f60177d (diff)
vhost: Disallow interrupt mode config if driver opts out interrupt support
According to the spec, supporting interrupt mode from the driver is optional, not a must. When interrupt mode is configured on the interface, we should check to make sure that the driver didn't opt out for the kickfd support and reject the configuration if it did. Change-Id: I7d3dbaddde65458e1a6a802754a3768ae8685a0e Signed-off-by: Steven <sluong@cisco.com>
-rw-r--r--src/vnet/devices/virtio/vhost-user.c11
-rw-r--r--src/vnet/devices/virtio/vhost-user.h1
2 files changed, 9 insertions, 3 deletions
diff --git a/src/vnet/devices/virtio/vhost-user.c b/src/vnet/devices/virtio/vhost-user.c
index bfd3e73e64a..5fe378cb771 100644
--- a/src/vnet/devices/virtio/vhost-user.c
+++ b/src/vnet/devices/virtio/vhost-user.c
@@ -933,7 +933,7 @@ vhost_user_socket_read (unix_file_t * uf)
vui->vrings[q].callfd_idx = ~0;
}
- if (!(msg.u64 & 0x100))
+ if (!(msg.u64 & VHOST_USER_VRING_NOFD_MASK))
{
if (number_of_fds != 1)
{
@@ -965,7 +965,7 @@ vhost_user_socket_read (unix_file_t * uf)
vui->vrings[q].kickfd_idx = ~0;
}
- if (!(msg.u64 & 0x100))
+ if (!(msg.u64 & VHOST_USER_VRING_NOFD_MASK))
{
if (number_of_fds != 1)
{
@@ -998,7 +998,7 @@ vhost_user_socket_read (unix_file_t * uf)
if (vui->vrings[q].errfd != -1)
close (vui->vrings[q].errfd);
- if (!(msg.u64 & 0x100))
+ if (!(msg.u64 & VHOST_USER_VRING_NOFD_MASK))
{
if (number_of_fds != 1)
goto close_socket;
@@ -2382,6 +2382,11 @@ vhost_user_interface_rx_mode_change (vnet_main_t * vnm, u32 hw_if_index,
if ((mode == VNET_HW_INTERFACE_RX_MODE_INTERRUPT) ||
(mode == VNET_HW_INTERFACE_RX_MODE_ADAPTIVE))
{
+ if (txvq->kickfd_idx == ~0)
+ {
+ // We cannot support interrupt mode if the driver opts out
+ return clib_error_return (0, "Driver does not support interrupt");
+ }
if (txvq->mode == VNET_HW_INTERFACE_RX_MODE_POLLING)
{
vum->ifq_count++;
diff --git a/src/vnet/devices/virtio/vhost-user.h b/src/vnet/devices/virtio/vhost-user.h
index ad6c4219706..ae3b88e8927 100644
--- a/src/vnet/devices/virtio/vhost-user.h
+++ b/src/vnet/devices/virtio/vhost-user.h
@@ -23,6 +23,7 @@
#define VHOST_VRING_IDX_RX(qid) (2*qid)
#define VHOST_VRING_IDX_TX(qid) (2*qid + 1)
+#define VHOST_USER_VRING_NOFD_MASK 0x100
#define VIRTQ_DESC_F_NEXT 1
#define VIRTQ_DESC_F_INDIRECT 4
#define VHOST_USER_REPLY_MASK (0x1 << 2)