diff options
author | Michael S. Tsirkin <mst@redhat.com> | 2009-06-29 15:24:32 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-09-10 01:33:05 -0400 |
commit | bda9020e2463ec94db9f97e8615f3bae22069838 (patch) | |
tree | 48125316d4c0f419a35aefdfbf665d30ad0c55ca /virt/kvm/coalesced_mmio.c | |
parent | 6c474694530f377507f9aca438c17206e051e6e7 (diff) |
KVM: remove in_range from io devices
This changes bus accesses to use high-level kvm_io_bus_read/kvm_io_bus_write
functions. in_range now becomes unused so it is removed from device ops in
favor of read/write callbacks performing range checks internally.
This allows aliasing (mostly for in-kernel virtio), as well as better error
handling by making it possible to pass errors up to userspace.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'virt/kvm/coalesced_mmio.c')
-rw-r--r-- | virt/kvm/coalesced_mmio.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/virt/kvm/coalesced_mmio.c b/virt/kvm/coalesced_mmio.c index 7b7cc9fe5ee3..0352f81ecc0b 100644 --- a/virt/kvm/coalesced_mmio.c +++ b/virt/kvm/coalesced_mmio.c | |||
@@ -19,18 +19,14 @@ static inline struct kvm_coalesced_mmio_dev *to_mmio(struct kvm_io_device *dev) | |||
19 | return container_of(dev, struct kvm_coalesced_mmio_dev, dev); | 19 | return container_of(dev, struct kvm_coalesced_mmio_dev, dev); |
20 | } | 20 | } |
21 | 21 | ||
22 | static int coalesced_mmio_in_range(struct kvm_io_device *this, | 22 | static int coalesced_mmio_in_range(struct kvm_coalesced_mmio_dev *dev, |
23 | gpa_t addr, int len, int is_write) | 23 | gpa_t addr, int len) |
24 | { | 24 | { |
25 | struct kvm_coalesced_mmio_dev *dev = to_mmio(this); | ||
26 | struct kvm_coalesced_mmio_zone *zone; | 25 | struct kvm_coalesced_mmio_zone *zone; |
27 | struct kvm_coalesced_mmio_ring *ring; | 26 | struct kvm_coalesced_mmio_ring *ring; |
28 | unsigned avail; | 27 | unsigned avail; |
29 | int i; | 28 | int i; |
30 | 29 | ||
31 | if (!is_write) | ||
32 | return 0; | ||
33 | |||
34 | /* Are we able to batch it ? */ | 30 | /* Are we able to batch it ? */ |
35 | 31 | ||
36 | /* last is the first free entry | 32 | /* last is the first free entry |
@@ -60,11 +56,13 @@ static int coalesced_mmio_in_range(struct kvm_io_device *this, | |||
60 | return 0; | 56 | return 0; |
61 | } | 57 | } |
62 | 58 | ||
63 | static void coalesced_mmio_write(struct kvm_io_device *this, | 59 | static int coalesced_mmio_write(struct kvm_io_device *this, |
64 | gpa_t addr, int len, const void *val) | 60 | gpa_t addr, int len, const void *val) |
65 | { | 61 | { |
66 | struct kvm_coalesced_mmio_dev *dev = to_mmio(this); | 62 | struct kvm_coalesced_mmio_dev *dev = to_mmio(this); |
67 | struct kvm_coalesced_mmio_ring *ring = dev->kvm->coalesced_mmio_ring; | 63 | struct kvm_coalesced_mmio_ring *ring = dev->kvm->coalesced_mmio_ring; |
64 | if (!coalesced_mmio_in_range(dev, addr, len)) | ||
65 | return -EOPNOTSUPP; | ||
68 | 66 | ||
69 | spin_lock(&dev->lock); | 67 | spin_lock(&dev->lock); |
70 | 68 | ||
@@ -76,6 +74,7 @@ static void coalesced_mmio_write(struct kvm_io_device *this, | |||
76 | smp_wmb(); | 74 | smp_wmb(); |
77 | ring->last = (ring->last + 1) % KVM_COALESCED_MMIO_MAX; | 75 | ring->last = (ring->last + 1) % KVM_COALESCED_MMIO_MAX; |
78 | spin_unlock(&dev->lock); | 76 | spin_unlock(&dev->lock); |
77 | return 0; | ||
79 | } | 78 | } |
80 | 79 | ||
81 | static void coalesced_mmio_destructor(struct kvm_io_device *this) | 80 | static void coalesced_mmio_destructor(struct kvm_io_device *this) |
@@ -87,7 +86,6 @@ static void coalesced_mmio_destructor(struct kvm_io_device *this) | |||
87 | 86 | ||
88 | static const struct kvm_io_device_ops coalesced_mmio_ops = { | 87 | static const struct kvm_io_device_ops coalesced_mmio_ops = { |
89 | .write = coalesced_mmio_write, | 88 | .write = coalesced_mmio_write, |
90 | .in_range = coalesced_mmio_in_range, | ||
91 | .destructor = coalesced_mmio_destructor, | 89 | .destructor = coalesced_mmio_destructor, |
92 | }; | 90 | }; |
93 | 91 | ||