aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/iodev.h
diff options
context:
space:
mode:
authorGregory Haskins <ghaskins@novell.com>2009-06-01 12:54:50 -0400
committerAvi Kivity <avi@redhat.com>2009-09-10 01:32:45 -0400
commitd76685c4a074041ed168e0b04dd604c3df5dcaa5 (patch)
tree828fb3a57b7829530904318a0ad9d006e21408ad /virt/kvm/iodev.h
parent787a660a4f03325a0e00493ac39017e53fd345fa (diff)
KVM: cleanup io_device code
We modernize the io_device code so that we use container_of() instead of dev->private, and move the vtable to a separate ops structure (theoretically allows better caching for multiple instances of the same ops structure) Signed-off-by: Gregory Haskins <ghaskins@novell.com> Acked-by: Chris Wright <chrisw@sous-sol.org> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'virt/kvm/iodev.h')
-rw-r--r--virt/kvm/iodev.h29
1 files changed, 20 insertions, 9 deletions
diff --git a/virt/kvm/iodev.h b/virt/kvm/iodev.h
index 55e8846ac3a6..2c67f5acd6db 100644
--- a/virt/kvm/iodev.h
+++ b/virt/kvm/iodev.h
@@ -18,7 +18,9 @@
18 18
19#include <linux/kvm_types.h> 19#include <linux/kvm_types.h>
20 20
21struct kvm_io_device { 21struct kvm_io_device;
22
23struct kvm_io_device_ops {
22 void (*read)(struct kvm_io_device *this, 24 void (*read)(struct kvm_io_device *this,
23 gpa_t addr, 25 gpa_t addr,
24 int len, 26 int len,
@@ -30,16 +32,25 @@ struct kvm_io_device {
30 int (*in_range)(struct kvm_io_device *this, gpa_t addr, int len, 32 int (*in_range)(struct kvm_io_device *this, gpa_t addr, int len,
31 int is_write); 33 int is_write);
32 void (*destructor)(struct kvm_io_device *this); 34 void (*destructor)(struct kvm_io_device *this);
35};
36
33 37
34 void *private; 38struct kvm_io_device {
39 const struct kvm_io_device_ops *ops;
35}; 40};
36 41
42static inline void kvm_iodevice_init(struct kvm_io_device *dev,
43 const struct kvm_io_device_ops *ops)
44{
45 dev->ops = ops;
46}
47
37static inline void kvm_iodevice_read(struct kvm_io_device *dev, 48static inline void kvm_iodevice_read(struct kvm_io_device *dev,
38 gpa_t addr, 49 gpa_t addr,
39 int len, 50 int len,
40 void *val) 51 void *val)
41{ 52{
42 dev->read(dev, addr, len, val); 53 dev->ops->read(dev, addr, len, val);
43} 54}
44 55
45static inline void kvm_iodevice_write(struct kvm_io_device *dev, 56static inline void kvm_iodevice_write(struct kvm_io_device *dev,
@@ -47,19 +58,19 @@ static inline void kvm_iodevice_write(struct kvm_io_device *dev,
47 int len, 58 int len,
48 const void *val) 59 const void *val)
49{ 60{
50 dev->write(dev, addr, len, val); 61 dev->ops->write(dev, addr, len, val);
51} 62}
52 63
53static inline int kvm_iodevice_inrange(struct kvm_io_device *dev, 64static inline int kvm_iodevice_in_range(struct kvm_io_device *dev,
54 gpa_t addr, int len, int is_write) 65 gpa_t addr, int len, int is_write)
55{ 66{
56 return dev->in_range(dev, addr, len, is_write); 67 return dev->ops->in_range(dev, addr, len, is_write);
57} 68}
58 69
59static inline void kvm_iodevice_destructor(struct kvm_io_device *dev) 70static inline void kvm_iodevice_destructor(struct kvm_io_device *dev)
60{ 71{
61 if (dev->destructor) 72 if (dev->ops->destructor)
62 dev->destructor(dev); 73 dev->ops->destructor(dev);
63} 74}
64 75
65#endif /* __KVM_IODEV_H__ */ 76#endif /* __KVM_IODEV_H__ */