~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/virtio_ring.h

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 #ifndef _LINUX_VIRTIO_RING_H
  3 #define _LINUX_VIRTIO_RING_H
  4 
  5 #include <asm/barrier.h>
  6 #include <linux/irqreturn.h>
  7 #include <uapi/linux/virtio_ring.h>
  8 
  9 /*
 10  * Barriers in virtio are tricky.  Non-SMP virtio guests can't assume
 11  * they're not on an SMP host system, so they need to assume real
 12  * barriers.  Non-SMP virtio hosts could skip the barriers, but does
 13  * anyone care?
 14  *
 15  * For virtio_pci on SMP, we don't need to order with respect to MMIO
 16  * accesses through relaxed memory I/O windows, so virt_mb() et al are
 17  * sufficient.
 18  *
 19  * For using virtio to talk to real devices (eg. other heterogeneous
 20  * CPUs) we do need real barriers.  In theory, we could be using both
 21  * kinds of virtio, so it's a runtime decision, and the branch is
 22  * actually quite cheap.
 23  */
 24 
 25 static inline void virtio_mb(bool weak_barriers)
 26 {
 27         if (weak_barriers)
 28                 virt_mb();
 29         else
 30                 mb();
 31 }
 32 
 33 static inline void virtio_rmb(bool weak_barriers)
 34 {
 35         if (weak_barriers)
 36                 virt_rmb();
 37         else
 38                 dma_rmb();
 39 }
 40 
 41 static inline void virtio_wmb(bool weak_barriers)
 42 {
 43         if (weak_barriers)
 44                 virt_wmb();
 45         else
 46                 dma_wmb();
 47 }
 48 
 49 #define virtio_store_mb(weak_barriers, p, v) \
 50 do { \
 51         if (weak_barriers) { \
 52                 virt_store_mb(*p, v); \
 53         } else { \
 54                 WRITE_ONCE(*p, v); \
 55                 mb(); \
 56         } \
 57 } while (0) \
 58 
 59 struct virtio_device;
 60 struct virtqueue;
 61 struct device;
 62 
 63 /*
 64  * Creates a virtqueue and allocates the descriptor ring.  If
 65  * may_reduce_num is set, then this may allocate a smaller ring than
 66  * expected.  The caller should query virtqueue_get_vring_size to learn
 67  * the actual size of the ring.
 68  */
 69 struct virtqueue *vring_create_virtqueue(unsigned int index,
 70                                          unsigned int num,
 71                                          unsigned int vring_align,
 72                                          struct virtio_device *vdev,
 73                                          bool weak_barriers,
 74                                          bool may_reduce_num,
 75                                          bool ctx,
 76                                          bool (*notify)(struct virtqueue *vq),
 77                                          void (*callback)(struct virtqueue *vq),
 78                                          const char *name);
 79 
 80 /*
 81  * Creates a virtqueue and allocates the descriptor ring with per
 82  * virtqueue DMA device.
 83  */
 84 struct virtqueue *vring_create_virtqueue_dma(unsigned int index,
 85                                              unsigned int num,
 86                                              unsigned int vring_align,
 87                                              struct virtio_device *vdev,
 88                                              bool weak_barriers,
 89                                              bool may_reduce_num,
 90                                              bool ctx,
 91                                              bool (*notify)(struct virtqueue *vq),
 92                                              void (*callback)(struct virtqueue *vq),
 93                                              const char *name,
 94                                              struct device *dma_dev);
 95 
 96 /*
 97  * Creates a virtqueue with a standard layout but a caller-allocated
 98  * ring.
 99  */
100 struct virtqueue *vring_new_virtqueue(unsigned int index,
101                                       unsigned int num,
102                                       unsigned int vring_align,
103                                       struct virtio_device *vdev,
104                                       bool weak_barriers,
105                                       bool ctx,
106                                       void *pages,
107                                       bool (*notify)(struct virtqueue *vq),
108                                       void (*callback)(struct virtqueue *vq),
109                                       const char *name);
110 
111 /*
112  * Destroys a virtqueue.  If created with vring_create_virtqueue, this
113  * also frees the ring.
114  */
115 void vring_del_virtqueue(struct virtqueue *vq);
116 
117 /* Filter out transport-specific feature bits. */
118 void vring_transport_features(struct virtio_device *vdev);
119 
120 irqreturn_t vring_interrupt(int irq, void *_vq);
121 
122 u32 vring_notification_data(struct virtqueue *_vq);
123 #endif /* _LINUX_VIRTIO_RING_H */
124 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php