diff options
author | Alex Shi <alex.shi@linaro.org> | 2017-07-28 12:01:34 +0800 |
---|---|---|
committer | Alex Shi <alex.shi@linaro.org> | 2017-07-28 12:01:34 +0800 |
commit | f5ca0eb3afa9d044e91d8f5ca9813dff4a954a49 (patch) | |
tree | 1670d635cd8c328dbddffe87925fed9262f6b44d /virt | |
parent | b017a97fcc4f4649ee687d568b7e856829aad6b5 (diff) | |
parent | e058f634852d0d2a2c16e62a19373817ac2ffeb4 (diff) |
Merge tag 'v4.4.79' into linux-linaro-lsk-v4.4
This is the 4.4.79 stable release
Diffstat (limited to 'virt')
-rw-r--r-- | virt/kvm/vfio.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/virt/kvm/vfio.c b/virt/kvm/vfio.c index 1dd087da6f31..111e09c3f4bf 100644 --- a/virt/kvm/vfio.c +++ b/virt/kvm/vfio.c @@ -47,6 +47,22 @@ static struct vfio_group *kvm_vfio_group_get_external_user(struct file *filep) return vfio_group; } +static bool kvm_vfio_external_group_match_file(struct vfio_group *group, + struct file *filep) +{ + bool ret, (*fn)(struct vfio_group *, struct file *); + + fn = symbol_get(vfio_external_group_match_file); + if (!fn) + return false; + + ret = fn(group, filep); + + symbol_put(vfio_external_group_match_file); + + return ret; +} + static void kvm_vfio_group_put_external_user(struct vfio_group *vfio_group) { void (*fn)(struct vfio_group *); @@ -171,18 +187,13 @@ static int kvm_vfio_set_group(struct kvm_device *dev, long attr, u64 arg) if (!f.file) return -EBADF; - vfio_group = kvm_vfio_group_get_external_user(f.file); - fdput(f); - - if (IS_ERR(vfio_group)) - return PTR_ERR(vfio_group); - ret = -ENOENT; mutex_lock(&kv->lock); list_for_each_entry(kvg, &kv->group_list, node) { - if (kvg->vfio_group != vfio_group) + if (!kvm_vfio_external_group_match_file(kvg->vfio_group, + f.file)) continue; list_del(&kvg->node); @@ -196,7 +207,7 @@ static int kvm_vfio_set_group(struct kvm_device *dev, long attr, u64 arg) mutex_unlock(&kv->lock); - kvm_vfio_group_put_external_user(vfio_group); + fdput(f); kvm_vfio_update_coherency(dev); |