aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Levon <john.levon@nutanix.com>2021-04-13 10:46:43 +0100
committerGitHub <noreply@github.com>2021-04-13 10:46:43 +0100
commit59cc98aa2fa8f7e1713c90a534b37970fa526164 (patch)
treedc972758a2cf8d9bad8c4a8246a8ca890cf5eacc
parent451b4180c18722b11047ba6c7554e24dde0004f9 (diff)
downloadlibvfio-user-59cc98aa2fa8f7e1713c90a534b37970fa526164.zip
libvfio-user-59cc98aa2fa8f7e1713c90a534b37970fa526164.tar.gz
libvfio-user-59cc98aa2fa8f7e1713c90a534b37970fa526164.tar.bz2
irq.c: use ERROR_INT() (#429)
Signed-off-by: John Levon <john.levon@nutanix.com> Reviewed-by: Thanos Makatos <thanos.makatos@nutanix.com>
-rw-r--r--lib/irq.c16
-rw-r--r--lib/libvfio-user.c4
-rw-r--r--test/unit-tests.c45
3 files changed, 42 insertions, 23 deletions
diff --git a/lib/irq.c b/lib/irq.c
index 1dec459..3547df5 100644
--- a/lib/irq.c
+++ b/lib/irq.c
@@ -55,7 +55,7 @@ vfio_irq_idx_to_str(int index)
}
}
-static long
+static int
dev_get_irqinfo(vfu_ctx_t *vfu_ctx, struct vfio_irq_info *irq_info_in,
struct vfio_irq_info *irq_info_out)
{
@@ -68,7 +68,7 @@ dev_get_irqinfo(vfu_ctx_t *vfu_ctx, struct vfio_irq_info *irq_info_in,
(irq_info_in->index >= VFU_DEV_NUM_IRQS)) {
vfu_log(vfu_ctx, LOG_DEBUG, "bad irq_info (size=%d index=%d)",
irq_info_in->argsz, irq_info_in->index);
- return -EINVAL;
+ return ERROR_INT(EINVAL);
}
irq_info_out->count = vfu_ctx->irq_count[irq_info_in->index];
@@ -88,7 +88,7 @@ handle_device_get_irq_info(vfu_ctx_t *vfu_ctx, uint32_t size,
if (size != sizeof(*irq_info_in) || size != irq_info_in->argsz) {
vfu_log(vfu_ctx, LOG_WARNING, "IRQ info size %d", size);
- return -EINVAL;
+ return ERROR_INT(EINVAL);
}
return dev_get_irqinfo(vfu_ctx, irq_info_in, irq_info_out);
@@ -174,7 +174,7 @@ irqs_set_data_none(vfu_ctx_t *vfu_ctx, struct vfio_irq_set *irq_set)
if (ret == -1) {
vfu_log(vfu_ctx, LOG_DEBUG,
"IRQ: failed to set data to none: %m");
- return -errno;
+ return -1;
}
}
}
@@ -201,7 +201,7 @@ irqs_set_data_bool(vfu_ctx_t *vfu_ctx, struct vfio_irq_set *irq_set, void *data)
if (ret == -1) {
vfu_log(vfu_ctx, LOG_DEBUG,
"IRQ: failed to set data to bool: %m");
- return -errno;
+ return -1;
}
}
}
@@ -240,7 +240,7 @@ irqs_set_data_eventfd(vfu_ctx_t *vfu_ctx, struct vfio_irq_set *irq_set,
return 0;
}
-static long
+static int
device_set_irqs_validate(vfu_ctx_t *vfu_ctx, struct vfio_irq_set *irq_set,
size_t nr_fds)
{
@@ -315,7 +315,7 @@ invalid:
vfu_log(vfu_ctx, LOG_DEBUG, "invalid SET_IRQS (%d): action=%u data_type=%u "
"index=%u start=%u count=%u nr_fds=%zu", line, a_type, d_type,
irq_set->index, irq_set->start, irq_set->count, nr_fds);
- return -EINVAL;
+ return ERROR_INT(EINVAL);
}
int
@@ -330,7 +330,7 @@ handle_device_set_irqs(vfu_ctx_t *vfu_ctx, uint32_t size,
if (size < sizeof(*irq_set) || size != irq_set->argsz) {
vfu_log(vfu_ctx, LOG_ERR, "%s: bad size %u", __func__, size);
- return -EINVAL;
+ return ERROR_INT(EINVAL);
}
ret = device_set_irqs_validate(vfu_ctx, irq_set, nr_fds);
diff --git a/lib/libvfio-user.c b/lib/libvfio-user.c
index f4aa804..b0bfbbe 100644
--- a/lib/libvfio-user.c
+++ b/lib/libvfio-user.c
@@ -856,6 +856,7 @@ MOCK_DEFINE(exec_command)(vfu_ctx_t *vfu_ctx, struct vfio_user_header *hdr,
*iovecs = _iovecs;
*nr_iovecs = 2;
} else {
+ ret = -errno;
free(irq_info);
}
break;
@@ -863,6 +864,9 @@ MOCK_DEFINE(exec_command)(vfu_ctx_t *vfu_ctx, struct vfio_user_header *hdr,
case VFIO_USER_DEVICE_SET_IRQS:
ret = handle_device_set_irqs(vfu_ctx, cmd_data_size, fds, nr_fds,
cmd_data);
+ if (ret < 0) {
+ ret = -errno;
+ }
break;
case VFIO_USER_REGION_READ:
diff --git a/test/unit-tests.c b/test/unit-tests.c
index 1e245a5..4a628a0 100644
--- a/test/unit-tests.c
+++ b/test/unit-tests.c
@@ -1746,34 +1746,39 @@ test_device_set_irqs(UNUSED void **state)
ret = handle_device_set_irqs(&vfu_ctx, 0, NULL, 0, &irq_set);
/* bad message size */
- assert_int_equal(-EINVAL, ret);
+ assert_int_equal(-1, ret);
+ assert_int_equal(EINVAL, errno);
irq_set.argsz = 3;
ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set);
/* bad .argsz */
- assert_int_equal(-EINVAL, ret);
+ assert_int_equal(-1, ret);
+ assert_int_equal(EINVAL, errno);
irq_set.argsz = sizeof (irq_set);
irq_set.index = VFU_DEV_NUM_IRQS;
ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set);
/* bad .index */
- assert_int_equal(-EINVAL, ret);
+ assert_int_equal(-1, ret);
+ assert_int_equal(EINVAL, errno);
irq_set.index = VFU_DEV_MSIX_IRQ;
irq_set.flags = VFIO_IRQ_SET_ACTION_MASK | VFIO_IRQ_SET_ACTION_UNMASK;
ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set);
/* bad flags, MASK and UNMASK */
- assert_int_equal(-EINVAL, ret);
+ assert_int_equal(-1, ret);
+ assert_int_equal(EINVAL, errno);
irq_set.flags = VFIO_IRQ_SET_ACTION_MASK | VFIO_IRQ_SET_DATA_NONE |
VFIO_IRQ_SET_DATA_BOOL;
ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set);
/* bad flags, DATA_NONE and DATA_BOOL */
- assert_int_equal(-EINVAL, ret);
+ assert_int_equal(-1, ret);
+ assert_int_equal(EINVAL, errno);
irq_set.flags = VFIO_IRQ_SET_ACTION_MASK | VFIO_IRQ_SET_DATA_NONE;
irq_set.start = 2047;
@@ -1781,14 +1786,16 @@ test_device_set_irqs(UNUSED void **state)
ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set);
/* bad start, count range */
- assert_int_equal(-EINVAL, ret);
+ assert_int_equal(-1, ret);
+ assert_int_equal(EINVAL, errno);
irq_set.start = 2049;
irq_set.count = 1;
ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set);
/* bad start, count range */
- assert_int_equal(-EINVAL, ret);
+ assert_int_equal(-1, ret);
+ assert_int_equal(EINVAL, errno);
irq_set.start = 0;
irq_set.count = 1;
@@ -1796,13 +1803,15 @@ test_device_set_irqs(UNUSED void **state)
ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set);
/* bad action for err irq */
- assert_int_equal(-EINVAL, ret);
+ assert_int_equal(-1, ret);
+ assert_int_equal(EINVAL, errno);
irq_set.index = VFU_DEV_REQ_IRQ;
ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set);
/* bad action for req irq */
- assert_int_equal(-EINVAL, ret);
+ assert_int_equal(-1, ret);
+ assert_int_equal(EINVAL, errno);
irq_set.start = 1;
irq_set.count = 0;
@@ -1810,7 +1819,8 @@ test_device_set_irqs(UNUSED void **state)
ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set);
/* bad start for count == 0 */
- assert_int_equal(-EINVAL, ret);
+ assert_int_equal(-1, ret);
+ assert_int_equal(EINVAL, errno);
irq_set.flags = VFIO_IRQ_SET_ACTION_MASK | VFIO_IRQ_SET_DATA_NONE;
irq_set.count = 0;
@@ -1818,7 +1828,8 @@ test_device_set_irqs(UNUSED void **state)
ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set);
/* bad action for count == 0 */
- assert_int_equal(-EINVAL, ret);
+ assert_int_equal(-1, ret);
+ assert_int_equal(EINVAL, errno);
irq_set.flags = VFIO_IRQ_SET_ACTION_TRIGGER | VFIO_IRQ_SET_DATA_BOOL;
irq_set.count = 0;
@@ -1826,7 +1837,8 @@ test_device_set_irqs(UNUSED void **state)
ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), NULL, 0, &irq_set);
/* bad action and data type for count == 0 */
- assert_int_equal(-EINVAL, ret);
+ assert_int_equal(-1, ret);
+ assert_int_equal(EINVAL, errno);
irq_set.flags = VFIO_IRQ_SET_ACTION_TRIGGER | VFIO_IRQ_SET_DATA_BOOL;
irq_set.count = 1;
@@ -1834,7 +1846,8 @@ test_device_set_irqs(UNUSED void **state)
ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), &fd, 1, &irq_set);
/* bad fds for DATA_BOOL */
- assert_int_equal(-EINVAL, ret);
+ assert_int_equal(-1, ret);
+ assert_int_equal(EINVAL, errno);
irq_set.flags = VFIO_IRQ_SET_ACTION_TRIGGER | VFIO_IRQ_SET_DATA_NONE;
irq_set.count = 1;
@@ -1842,7 +1855,8 @@ test_device_set_irqs(UNUSED void **state)
ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), &fd, 1, &irq_set);
/* bad fds for DATA_NONE */
- assert_int_equal(-EINVAL, ret);
+ assert_int_equal(-1, ret);
+ assert_int_equal(EINVAL, errno);
irq_set.flags = VFIO_IRQ_SET_ACTION_TRIGGER | VFIO_IRQ_SET_DATA_EVENTFD;
irq_set.count = 2;
@@ -1850,7 +1864,8 @@ test_device_set_irqs(UNUSED void **state)
ret = handle_device_set_irqs(&vfu_ctx, sizeof (irq_set), &fd, 1, &irq_set);
/* bad fds for count == 2 */
- assert_int_equal(-EINVAL, ret);
+ assert_int_equal(-1, ret);
+ assert_int_equal(EINVAL, errno);
irqs->err_efd = irqs->req_efd = -1;