aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/block/virtio_blk.c4
-rw-r--r--drivers/virtio/virtio_balloon.c6
-rw-r--r--include/linux/virtio_config.h47
3 files changed, 21 insertions, 36 deletions
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 7e83b6c6e3d6..cc6d39383a3f 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -246,8 +246,8 @@ static int virtblk_probe(struct virtio_device *vdev)
246 blk_queue_ordered(vblk->disk->queue, QUEUE_ORDERED_TAG, NULL); 246 blk_queue_ordered(vblk->disk->queue, QUEUE_ORDERED_TAG, NULL);
247 247
248 /* Host must always specify the capacity. */ 248 /* Host must always specify the capacity. */
249 __virtio_config_val(vdev, offsetof(struct virtio_blk_config, capacity), 249 vdev->config->get(vdev, offsetof(struct virtio_blk_config, capacity),
250 &cap); 250 &cap, sizeof(cap));
251 251
252 /* If capacity is too big, truncate with warning. */ 252 /* If capacity is too big, truncate with warning. */
253 if ((sector_t)cap != cap) { 253 if ((sector_t)cap != cap) {
diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
index 0b3efc31ee6d..fef88d84cef6 100644
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -155,9 +155,9 @@ static void virtballoon_changed(struct virtio_device *vdev)
155static inline s64 towards_target(struct virtio_balloon *vb) 155static inline s64 towards_target(struct virtio_balloon *vb)
156{ 156{
157 u32 v; 157 u32 v;
158 __virtio_config_val(vb->vdev, 158 vb->vdev->config->get(vb->vdev,
159 offsetof(struct virtio_balloon_config, num_pages), 159 offsetof(struct virtio_balloon_config, num_pages),
160 &v); 160 &v, sizeof(v));
161 return v - vb->num_pages; 161 return v - vb->num_pages;
162} 162}
163 163
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index d581b2914b34..475572e976fe 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -16,7 +16,7 @@
16#define VIRTIO_CONFIG_S_FAILED 0x80 16#define VIRTIO_CONFIG_S_FAILED 0x80
17 17
18#ifdef __KERNEL__ 18#ifdef __KERNEL__
19struct virtio_device; 19#include <linux/virtio.h>
20 20
21/** 21/**
22 * virtio_config_ops - operations for configuring a virtio device 22 * virtio_config_ops - operations for configuring a virtio device
@@ -30,13 +30,11 @@ struct virtio_device;
30 * offset: the offset of the configuration field 30 * offset: the offset of the configuration field
31 * buf: the buffer to write the field value into. 31 * buf: the buffer to write the field value into.
32 * len: the length of the buffer 32 * len: the length of the buffer
33 * Note that contents are conventionally little-endian.
34 * @set: write the value of a configuration field 33 * @set: write the value of a configuration field
35 * vdev: the virtio_device 34 * vdev: the virtio_device
36 * offset: the offset of the configuration field 35 * offset: the offset of the configuration field
37 * buf: the buffer to read the field value from. 36 * buf: the buffer to read the field value from.
38 * len: the length of the buffer 37 * len: the length of the buffer
39 * Note that contents are conventionally little-endian.
40 * @get_status: read the status byte 38 * @get_status: read the status byte
41 * vdev: the virtio_device 39 * vdev: the virtio_device
42 * Returns the status byte 40 * Returns the status byte
@@ -70,40 +68,27 @@ struct virtio_config_ops
70}; 68};
71 69
72/** 70/**
73 * virtio_config_val - look for a feature and get a single virtio config. 71 * virtio_config_val - look for a feature and get a virtio config entry.
74 * @vdev: the virtio device 72 * @vdev: the virtio device
75 * @fbit: the feature bit 73 * @fbit: the feature bit
76 * @offset: the type to search for. 74 * @offset: the type to search for.
77 * @val: a pointer to the value to fill in. 75 * @val: a pointer to the value to fill in.
78 * 76 *
79 * The return value is -ENOENT if the feature doesn't exist. Otherwise 77 * The return value is -ENOENT if the feature doesn't exist. Otherwise
80 * the value is endian-corrected and returned in v. */ 78 * the config value is copied into whatever is pointed to by v. */
81#define virtio_config_val(vdev, fbit, offset, v) ({ \ 79#define virtio_config_val(vdev, fbit, offset, v) \
82 int _err; \ 80 virtio_config_buf((vdev), (fbit), (offset), (v), sizeof(v))
83 if ((vdev)->config->feature((vdev), (fbit))) { \
84 __virtio_config_val((vdev), (offset), (v)); \
85 _err = 0; \
86 } else \
87 _err = -ENOENT; \
88 _err; \
89})
90 81
91/** 82static inline int virtio_config_buf(struct virtio_device *vdev,
92 * __virtio_config_val - get a single virtio config without feature check. 83 unsigned int fbit,
93 * @vdev: the virtio device 84 unsigned int offset,
94 * @offset: the type to search for. 85 void *buf, unsigned len)
95 * @val: a pointer to the value to fill in. 86{
96 * 87 if (!vdev->config->feature(vdev, fbit))
97 * The value is endian-corrected and returned in v. */ 88 return -ENOENT;
98#define __virtio_config_val(vdev, offset, v) do { \ 89
99 BUILD_BUG_ON(sizeof(*(v)) != 1 && sizeof(*(v)) != 2 \ 90 vdev->config->get(vdev, offset, buf, len);
100 && sizeof(*(v)) != 4 && sizeof(*(v)) != 8); \ 91 return 0;
101 (vdev)->config->get((vdev), (offset), (v), sizeof(*(v))); \ 92}
102 switch (sizeof(*(v))) { \
103 case 2: le16_to_cpus((__u16 *) v); break; \
104 case 4: le32_to_cpus((__u32 *) v); break; \
105 case 8: le64_to_cpus((__u64 *) v); break; \
106 } \
107} while(0)
108#endif /* __KERNEL__ */ 93#endif /* __KERNEL__ */
109#endif /* _LINUX_VIRTIO_CONFIG_H */ 94#endif /* _LINUX_VIRTIO_CONFIG_H */