lkml.org 
[lkml]   [2015]   [Sep]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V6 2/6] kvm: factor out core eventfd assign/deassign logic
    Date
    This patch factors out core eventfd assign/deassign logic and leaves
    the argument checking and bus index selection to callers.

    Cc: stable@vger.kernel.org
    Cc: Gleb Natapov <gleb@kernel.org>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Jason Wang <jasowang@redhat.com>
    ---
    virt/kvm/eventfd.c | 85 ++++++++++++++++++++++++++++++++----------------------
    1 file changed, 50 insertions(+), 35 deletions(-)

    diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c
    index e404806..0829c7f 100644
    --- a/virt/kvm/eventfd.c
    +++ b/virt/kvm/eventfd.c
    @@ -771,40 +771,14 @@ static enum kvm_bus ioeventfd_bus_from_flags(__u32 flags)
    return KVM_MMIO_BUS;
    }

    -static int
    -kvm_assign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)
    +static int kvm_assign_ioeventfd_idx(struct kvm *kvm,
    + enum kvm_bus bus_idx,
    + struct kvm_ioeventfd *args)
    {
    - enum kvm_bus bus_idx;
    - struct _ioeventfd *p;
    - struct eventfd_ctx *eventfd;
    - int ret;
    -
    - bus_idx = ioeventfd_bus_from_flags(args->flags);
    - /* must be natural-word sized, or 0 to ignore length */
    - switch (args->len) {
    - case 0:
    - case 1:
    - case 2:
    - case 4:
    - case 8:
    - break;
    - default:
    - return -EINVAL;
    - }
    -
    - /* check for range overflow */
    - if (args->addr + args->len < args->addr)
    - return -EINVAL;

    - /* check for extra flags that we don't understand */
    - if (args->flags & ~KVM_IOEVENTFD_VALID_FLAG_MASK)
    - return -EINVAL;
    -
    - /* ioeventfd with no length can't be combined with DATAMATCH */
    - if (!args->len &&
    - args->flags & (KVM_IOEVENTFD_FLAG_PIO |
    - KVM_IOEVENTFD_FLAG_DATAMATCH))
    - return -EINVAL;
    + struct eventfd_ctx *eventfd;
    + struct _ioeventfd *p;
    + int ret;

    eventfd = eventfd_ctx_fdget(args->fd);
    if (IS_ERR(eventfd))
    @@ -873,14 +847,13 @@ fail:
    }

    static int
    -kvm_deassign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)
    +kvm_deassign_ioeventfd_idx(struct kvm *kvm, enum kvm_bus bus_idx,
    + struct kvm_ioeventfd *args)
    {
    - enum kvm_bus bus_idx;
    struct _ioeventfd *p, *tmp;
    struct eventfd_ctx *eventfd;
    int ret = -ENOENT;

    - bus_idx = ioeventfd_bus_from_flags(args->flags);
    eventfd = eventfd_ctx_fdget(args->fd);
    if (IS_ERR(eventfd))
    return PTR_ERR(eventfd);
    @@ -918,6 +891,48 @@ kvm_deassign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)
    return ret;
    }

    +static int kvm_deassign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)
    +{
    + enum kvm_bus bus_idx = ioeventfd_bus_from_flags(args->flags);
    +
    + return kvm_deassign_ioeventfd_idx(kvm, bus_idx, args);
    +}
    +
    +static int
    +kvm_assign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)
    +{
    + enum kvm_bus bus_idx;
    +
    + bus_idx = ioeventfd_bus_from_flags(args->flags);
    + /* must be natural-word sized, or 0 to ignore length */
    + switch (args->len) {
    + case 0:
    + case 1:
    + case 2:
    + case 4:
    + case 8:
    + break;
    + default:
    + return -EINVAL;
    + }
    +
    + /* check for range overflow */
    + if (args->addr + args->len < args->addr)
    + return -EINVAL;
    +
    + /* check for extra flags that we don't understand */
    + if (args->flags & ~KVM_IOEVENTFD_VALID_FLAG_MASK)
    + return -EINVAL;
    +
    + /* ioeventfd with no length can't be combined with DATAMATCH */
    + if (!args->len &&
    + args->flags & (KVM_IOEVENTFD_FLAG_PIO |
    + KVM_IOEVENTFD_FLAG_DATAMATCH))
    + return -EINVAL;
    +
    + return kvm_assign_ioeventfd_idx(kvm, bus_idx, args);
    +}
    +
    int
    kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args)
    {
    --
    2.1.4


    \
     
     \ /
      Last update: 2015-09-15 09:01    [W:4.155 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site