aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-12-18 23:50:30 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-12-18 23:50:30 -0500
commit64ec45bff6b3dade2643ed4c0f688a15ecf46ea2 (patch)
tree29816f500d80a64c84455778918d94ff3ddf02e4 /include/linux
parentc0f486fde3f353232c1cc2fd4d62783ac782a467 (diff)
parent5ff16110c637726111662c1df41afd9df7ef36bd (diff)
Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
Pull virtio fixes from Michael S Tsirkin: "virtio 1.0 related fixes Most importantly, this fixes using virtio_pci as a module. Further, the big virtio 1.0 conversion missed a couple of places. This fixes them up. This isn't 100% sparse-clean yet because on many architectures get_user triggers sparse warnings when used with __bitwise tag (when same tag is on both pointer and value read). I posted a patchset to fix it up by adding __force on all arches that don't already have it (many do), when that's merged these warnings will go away" * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost: virtio_pci: restore module attributes mic/host: fix up virtio 1.0 APIs vringh: update for virtio 1.0 APIs vringh: 64 bit features tools/virtio: add virtio 1.0 in vringh_test tools/virtio: add virtio 1.0 in virtio_test tools/virtio: enable -Werror tools/virtio: 64 bit features tools/virtio: fix vringh test tools/virtio: more stubs virtio: core support for config generation virtio_pci: add VIRTIO_PCI_NO_LEGACY virtio_pci: move probe to common file virtio_pci_common.h: drop VIRTIO_PCI_NO_LEGACY virtio_config: fix virtio_cread_bytes virtio: set VIRTIO_CONFIG_S_FEATURES_OK on restore
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/virtio_config.h29
-rw-r--r--include/linux/vringh.h37
2 files changed, 63 insertions, 3 deletions
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 7979f850e7ac..ca3ed78e5ec7 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -19,6 +19,9 @@
19 * offset: the offset of the configuration field 19 * offset: the offset of the configuration field
20 * buf: the buffer to read the field value from. 20 * buf: the buffer to read the field value from.
21 * len: the length of the buffer 21 * len: the length of the buffer
22 * @generation: config generation counter
23 * vdev: the virtio_device
24 * Returns the config generation counter
22 * @get_status: read the status byte 25 * @get_status: read the status byte
23 * vdev: the virtio_device 26 * vdev: the virtio_device
24 * Returns the status byte 27 * Returns the status byte
@@ -60,6 +63,7 @@ struct virtio_config_ops {
60 void *buf, unsigned len); 63 void *buf, unsigned len);
61 void (*set)(struct virtio_device *vdev, unsigned offset, 64 void (*set)(struct virtio_device *vdev, unsigned offset,
62 const void *buf, unsigned len); 65 const void *buf, unsigned len);
66 u32 (*generation)(struct virtio_device *vdev);
63 u8 (*get_status)(struct virtio_device *vdev); 67 u8 (*get_status)(struct virtio_device *vdev);
64 void (*set_status)(struct virtio_device *vdev, u8 status); 68 void (*set_status)(struct virtio_device *vdev, u8 status);
65 void (*reset)(struct virtio_device *vdev); 69 void (*reset)(struct virtio_device *vdev);
@@ -301,11 +305,33 @@ static inline u8 virtio_cread8(struct virtio_device *vdev, unsigned int offset)
301 return ret; 305 return ret;
302} 306}
303 307
308/* Read @count fields, @bytes each. */
309static inline void __virtio_cread_many(struct virtio_device *vdev,
310 unsigned int offset,
311 void *buf, size_t count, size_t bytes)
312{
313 u32 old, gen = vdev->config->generation ?
314 vdev->config->generation(vdev) : 0;
315 int i;
316
317 do {
318 old = gen;
319
320 for (i = 0; i < count; i++)
321 vdev->config->get(vdev, offset + bytes * i,
322 buf + i * bytes, bytes);
323
324 gen = vdev->config->generation ?
325 vdev->config->generation(vdev) : 0;
326 } while (gen != old);
327}
328
329
304static inline void virtio_cread_bytes(struct virtio_device *vdev, 330static inline void virtio_cread_bytes(struct virtio_device *vdev,
305 unsigned int offset, 331 unsigned int offset,
306 void *buf, size_t len) 332 void *buf, size_t len)
307{ 333{
308 vdev->config->get(vdev, offset, buf, len); 334 __virtio_cread_many(vdev, offset, buf, len, 1);
309} 335}
310 336
311static inline void virtio_cwrite8(struct virtio_device *vdev, 337static inline void virtio_cwrite8(struct virtio_device *vdev,
@@ -349,6 +375,7 @@ static inline u64 virtio_cread64(struct virtio_device *vdev,
349{ 375{
350 u64 ret; 376 u64 ret;
351 vdev->config->get(vdev, offset, &ret, sizeof(ret)); 377 vdev->config->get(vdev, offset, &ret, sizeof(ret));
378 __virtio_cread_many(vdev, offset, &ret, 1, sizeof(ret));
352 return virtio64_to_cpu(vdev, (__force __virtio64)ret); 379 return virtio64_to_cpu(vdev, (__force __virtio64)ret);
353} 380}
354 381
diff --git a/include/linux/vringh.h b/include/linux/vringh.h
index 749cde28728b..a3fa537e717a 100644
--- a/include/linux/vringh.h
+++ b/include/linux/vringh.h
@@ -24,12 +24,16 @@
24#ifndef _LINUX_VRINGH_H 24#ifndef _LINUX_VRINGH_H
25#define _LINUX_VRINGH_H 25#define _LINUX_VRINGH_H
26#include <uapi/linux/virtio_ring.h> 26#include <uapi/linux/virtio_ring.h>
27#include <linux/virtio_byteorder.h>
27#include <linux/uio.h> 28#include <linux/uio.h>
28#include <linux/slab.h> 29#include <linux/slab.h>
29#include <asm/barrier.h> 30#include <asm/barrier.h>
30 31
31/* virtio_ring with information needed for host access. */ 32/* virtio_ring with information needed for host access. */
32struct vringh { 33struct vringh {
34 /* Everything is little endian */
35 bool little_endian;
36
33 /* Guest publishes used event idx (note: we always do). */ 37 /* Guest publishes used event idx (note: we always do). */
34 bool event_indices; 38 bool event_indices;
35 39
@@ -105,7 +109,7 @@ struct vringh_kiov {
105#define VRINGH_IOV_ALLOCATED 0x8000000 109#define VRINGH_IOV_ALLOCATED 0x8000000
106 110
107/* Helpers for userspace vrings. */ 111/* Helpers for userspace vrings. */
108int vringh_init_user(struct vringh *vrh, u32 features, 112int vringh_init_user(struct vringh *vrh, u64 features,
109 unsigned int num, bool weak_barriers, 113 unsigned int num, bool weak_barriers,
110 struct vring_desc __user *desc, 114 struct vring_desc __user *desc,
111 struct vring_avail __user *avail, 115 struct vring_avail __user *avail,
@@ -167,7 +171,7 @@ bool vringh_notify_enable_user(struct vringh *vrh);
167void vringh_notify_disable_user(struct vringh *vrh); 171void vringh_notify_disable_user(struct vringh *vrh);
168 172
169/* Helpers for kernelspace vrings. */ 173/* Helpers for kernelspace vrings. */
170int vringh_init_kern(struct vringh *vrh, u32 features, 174int vringh_init_kern(struct vringh *vrh, u64 features,
171 unsigned int num, bool weak_barriers, 175 unsigned int num, bool weak_barriers,
172 struct vring_desc *desc, 176 struct vring_desc *desc,
173 struct vring_avail *avail, 177 struct vring_avail *avail,
@@ -222,4 +226,33 @@ static inline void vringh_notify(struct vringh *vrh)
222 vrh->notify(vrh); 226 vrh->notify(vrh);
223} 227}
224 228
229static inline u16 vringh16_to_cpu(const struct vringh *vrh, __virtio16 val)
230{
231 return __virtio16_to_cpu(vrh->little_endian, val);
232}
233
234static inline __virtio16 cpu_to_vringh16(const struct vringh *vrh, u16 val)
235{
236 return __cpu_to_virtio16(vrh->little_endian, val);
237}
238
239static inline u32 vringh32_to_cpu(const struct vringh *vrh, __virtio32 val)
240{
241 return __virtio32_to_cpu(vrh->little_endian, val);
242}
243
244static inline __virtio32 cpu_to_vringh32(const struct vringh *vrh, u32 val)
245{
246 return __cpu_to_virtio32(vrh->little_endian, val);
247}
248
249static inline u64 vringh64_to_cpu(const struct vringh *vrh, __virtio64 val)
250{
251 return __virtio64_to_cpu(vrh->little_endian, val);
252}
253
254static inline __virtio64 cpu_to_vringh64(const struct vringh *vrh, u64 val)
255{
256 return __cpu_to_virtio64(vrh->little_endian, val);
257}
225#endif /* _LINUX_VRINGH_H */ 258#endif /* _LINUX_VRINGH_H */