pci: remove unnecessary ioctl() call and improve logging in vfio_set_irqs
Type: improvement Change-Id: Ic8e2785bf375882defe5a1d299948d522cdd4895 Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:
@ -648,33 +648,14 @@ vfio_set_irqs (vlib_main_t * vm, linux_pci_device_t * p, u32 index, u32 start,
|
|||||||
{
|
{
|
||||||
int data_len = efds ? count * sizeof (int) : 0;
|
int data_len = efds ? count * sizeof (int) : 0;
|
||||||
u8 buf[sizeof (struct vfio_irq_set) + data_len];
|
u8 buf[sizeof (struct vfio_irq_set) + data_len];
|
||||||
struct vfio_irq_info ii = { 0 };
|
|
||||||
struct vfio_irq_set *irq_set = (struct vfio_irq_set *) buf;
|
struct vfio_irq_set *irq_set = (struct vfio_irq_set *) buf;
|
||||||
|
|
||||||
|
|
||||||
ii.argsz = sizeof (struct vfio_irq_info);
|
|
||||||
ii.index = index;
|
|
||||||
|
|
||||||
if (ioctl (p->fd, VFIO_DEVICE_GET_IRQ_INFO, &ii) < 0)
|
|
||||||
return clib_error_return_unix (0, "ioctl(VFIO_DEVICE_GET_IRQ_INFO) "
|
|
||||||
"'%U'", format_vlib_pci_addr, &p->addr);
|
|
||||||
|
|
||||||
log_debug (p, "%s index:%u count:%u flags: %s%s%s%s(0x%x)", __func__,
|
|
||||||
ii.index, ii.count,
|
|
||||||
ii.flags & VFIO_IRQ_INFO_EVENTFD ? "eventfd " : "",
|
|
||||||
ii.flags & VFIO_IRQ_INFO_MASKABLE ? "maskable " : "",
|
|
||||||
ii.flags & VFIO_IRQ_INFO_AUTOMASKED ? "automasked " : "",
|
|
||||||
ii.flags & VFIO_IRQ_INFO_NORESIZE ? "noresize " : "", ii.flags);
|
|
||||||
|
|
||||||
if (ii.count < start + count)
|
|
||||||
return clib_error_return_unix (0, "vfio_set_irq: unexistng interrupt on "
|
|
||||||
"'%U'", format_vlib_pci_addr, &p->addr);
|
|
||||||
|
|
||||||
|
|
||||||
if (efds)
|
if (efds)
|
||||||
{
|
{
|
||||||
|
int *data = (int *) irq_set->data;
|
||||||
flags |= VFIO_IRQ_SET_DATA_EVENTFD;
|
flags |= VFIO_IRQ_SET_DATA_EVENTFD;
|
||||||
clib_memcpy_fast (&irq_set->data, efds, data_len);
|
for (u32 i = 0; i < count; i++)
|
||||||
|
data[i] = efds[i];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
flags |= VFIO_IRQ_SET_DATA_NONE;
|
flags |= VFIO_IRQ_SET_DATA_NONE;
|
||||||
@ -689,11 +670,11 @@ vfio_set_irqs (vlib_main_t * vm, linux_pci_device_t * p, u32 index, u32 start,
|
|||||||
irq_set->flags = flags;
|
irq_set->flags = flags;
|
||||||
|
|
||||||
if (ioctl (p->fd, VFIO_DEVICE_SET_IRQS, irq_set) < 0)
|
if (ioctl (p->fd, VFIO_DEVICE_SET_IRQS, irq_set) < 0)
|
||||||
return clib_error_return_unix (0, "%U:ioctl(VFIO_DEVICE_SET_IRQS) "
|
return clib_error_return_unix (0, "%U:ioctl(VFIO_DEVICE_SET_IRQS)\n%U",
|
||||||
"[index = %u, start = %u, count = %u, "
|
|
||||||
"flags = 0x%x]",
|
|
||||||
format_vlib_pci_addr, &p->addr,
|
format_vlib_pci_addr, &p->addr,
|
||||||
index, start, count, flags);
|
format_vfio_irq_set, irq_set);
|
||||||
|
|
||||||
|
log_debug (p, "%s:\n%U", __func__, format_vfio_irq_set, irq_set);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -301,10 +301,44 @@ format_vfio_region_info (u8 * s, va_list * args)
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
u8 *
|
||||||
* fd.io coding-style-patch-verification: ON
|
format_vfio_irq_set (u8 *s, va_list *args)
|
||||||
*
|
{
|
||||||
* Local Variables:
|
struct vfio_irq_set *is = va_arg (*args, struct vfio_irq_set *);
|
||||||
* eval: (c-set-style "gnu")
|
u32 indent = format_get_indent (s);
|
||||||
* End:
|
|
||||||
*/
|
s = format (s, "index:%u start:%u count:%u flags: 0x%x", is->index,
|
||||||
|
is->start, is->count, is->flags);
|
||||||
|
|
||||||
|
s = format (s, " (data:");
|
||||||
|
if (is->flags & VFIO_IRQ_SET_DATA_NONE)
|
||||||
|
s = format (s, " none");
|
||||||
|
if (is->flags & VFIO_IRQ_SET_DATA_BOOL)
|
||||||
|
s = format (s, " bool");
|
||||||
|
if (is->flags & VFIO_IRQ_SET_DATA_EVENTFD)
|
||||||
|
s = format (s, " eventfd");
|
||||||
|
|
||||||
|
s = format (s, ", action:");
|
||||||
|
if (is->flags & VFIO_IRQ_SET_ACTION_MASK)
|
||||||
|
s = format (s, " mask");
|
||||||
|
if (is->flags & VFIO_IRQ_SET_ACTION_UNMASK)
|
||||||
|
s = format (s, " unmask");
|
||||||
|
if (is->flags & VFIO_IRQ_SET_ACTION_TRIGGER)
|
||||||
|
s = format (s, " trigger");
|
||||||
|
vec_add1 (s, ')');
|
||||||
|
|
||||||
|
if (is->flags & VFIO_IRQ_SET_DATA_EVENTFD)
|
||||||
|
{
|
||||||
|
s = format (s, "\n%U eventfd data:", format_white_space, indent);
|
||||||
|
for (u32 i = 0; i < is->count; i++)
|
||||||
|
s = format (s, " %d", ((int *) (is->data))[i]);
|
||||||
|
}
|
||||||
|
if (is->flags & VFIO_IRQ_SET_DATA_BOOL)
|
||||||
|
{
|
||||||
|
s = format (s, "\n%U bool data:", format_white_space, indent);
|
||||||
|
for (u32 i = 0; i < is->count; i++)
|
||||||
|
s = format (s, " %u", is->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
@ -50,7 +50,7 @@ clib_error_t *linux_vfio_group_get_device_fd (vlib_pci_addr_t * addr,
|
|||||||
int *fd, int *is_noiommu);
|
int *fd, int *is_noiommu);
|
||||||
|
|
||||||
format_function_t format_vfio_region_info;
|
format_function_t format_vfio_region_info;
|
||||||
|
format_function_t format_vfio_irq_set;
|
||||||
|
|
||||||
#endif /* included_vlib_linux_vfio_h */
|
#endif /* included_vlib_linux_vfio_h */
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user