@ -674,15 +674,24 @@ ioeventfd_check_collision(struct kvm *kvm, struct _ioeventfd *p)
return false ;
return false ;
}
}
static enum kvm_bus ioeventfd_bus_from_flags ( __u32 flags )
{
if ( flags & KVM_IOEVENTFD_FLAG_PIO )
return KVM_PIO_BUS ;
if ( flags & KVM_IOEVENTFD_FLAG_VIRTIO_CCW_NOTIFY )
return KVM_VIRTIO_CCW_NOTIFY_BUS ;
return KVM_MMIO_BUS ;
}
static int
static int
kvm_assign_ioeventfd ( struct kvm * kvm , struct kvm_ioeventfd * args )
kvm_assign_ioeventfd ( struct kvm * kvm , struct kvm_ioeventfd * args )
{
{
int pio = args - > flags & KVM_IOEVENTFD_FLAG_PIO ;
enum kvm_bus bus_idx ;
enum kvm_bus bus_idx = pio ? KVM_PIO_BUS : KVM_MMIO_BUS ;
struct _ioeventfd * p ;
struct _ioeventfd * p ;
struct eventfd_ctx * eventfd ;
struct eventfd_ctx * eventfd ;
int ret ;
int ret ;
bus_idx = ioeventfd_bus_from_flags ( args - > flags ) ;
/* must be natural-word sized */
/* must be natural-word sized */
switch ( args - > len ) {
switch ( args - > len ) {
case 1 :
case 1 :
@ -757,12 +766,12 @@ fail:
static int
static int
kvm_deassign_ioeventfd ( struct kvm * kvm , struct kvm_ioeventfd * args )
kvm_deassign_ioeventfd ( struct kvm * kvm , struct kvm_ioeventfd * args )
{
{
int pio = args - > flags & KVM_IOEVENTFD_FLAG_PIO ;
enum kvm_bus bus_idx ;
enum kvm_bus bus_idx = pio ? KVM_PIO_BUS : KVM_MMIO_BUS ;
struct _ioeventfd * p , * tmp ;
struct _ioeventfd * p , * tmp ;
struct eventfd_ctx * eventfd ;
struct eventfd_ctx * eventfd ;
int ret = - ENOENT ;
int ret = - ENOENT ;
bus_idx = ioeventfd_bus_from_flags ( args - > flags ) ;
eventfd = eventfd_ctx_fdget ( args - > fd ) ;
eventfd = eventfd_ctx_fdget ( args - > fd ) ;
if ( IS_ERR ( eventfd ) )
if ( IS_ERR ( eventfd ) )
return PTR_ERR ( eventfd ) ;
return PTR_ERR ( eventfd ) ;