aboutsummaryrefslogtreecommitdiff
path: root/include/linux/virtio_ring.h
AgeCommit message (Collapse)AuthorFilesLines
2017-05-02virtio: add context flag to find vqsMichael S. Tsirkin1-0/+3
Allows maintaining extra context per vq. For ease of use, passing in NULL is legal and disables the feature for all vqs. Includes fixes by Christian for s390, acked by Cornelia. Signed-off-by: Christian Borntraeger <[email protected]> Acked-by: Cornelia Huck <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]>
2016-03-02virtio: Add improved queue allocation APIAndy Lutomirski1-0/+35
This leaves vring_new_virtqueue alone for compatbility, but it adds two new improved APIs: vring_create_virtqueue: Creates a virtqueue backed by automatically allocated coherent memory. (Some day it this could be extended to support non-coherent memory, too, if there ends up being a platform on which it's worthwhile.) __vring_new_virtqueue: Creates a virtqueue with a manually-specified layout. This should allow mic_virtio to work much more cleanly. Signed-off-by: Andy Lutomirski <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]>
2016-01-12virtio_ring: use virt_store_mbMichael S. Tsirkin1-0/+11
We need a full barrier after writing out event index, using virt_store_mb there seems better than open-coding. As usual, we need a wrapper to account for strong barriers. It's tempting to use this in vhost as well, for that, we'll need a variant of smp_store_mb that works on __user pointers. Signed-off-by: Michael S. Tsirkin <[email protected]> Acked-by: Peter Zijlstra (Intel) <[email protected]>
2016-01-12virtio_ring: update weak barriers to use virt_xxxMichael S. Tsirkin1-21/+4
virtio ring uses smp_wmb on SMP and wmb on !SMP, the reason for the later being that it might be talking to another kernel on the same SMP machine. This is exactly what virt_xxx barriers do, so switch to these instead of homegrown ifdef hacks. Cc: Peter Zijlstra <[email protected]> Cc: Alexander Duyck <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]> Acked-by: Peter Zijlstra (Intel) <[email protected]>
2016-01-12Revert "virtio_ring: Update weak barriers to use dma_wmb/rmb"Michael S. Tsirkin1-4/+19
This reverts commit 9e1a27ea42691429e31f158cce6fc61bc79bb2e9. While that commit optimizes !CONFIG_SMP, it mixes up DMA and SMP concepts, making the code hard to figure out. A better way to optimize this is with the new __smp_XXX barriers. As a first step, go back to full rmb/wmb barriers for !SMP. We switch to __smp_XXX barriers in the next patch. Cc: Peter Zijlstra <[email protected]> Cc: Alexander Duyck <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]> Acked-by: Peter Zijlstra (Intel) <[email protected]>
2015-04-13virtio_ring: Update weak barriers to use dma_wmb/rmbAlexander Duyck1-19/+4
This change makes it so that instead of using smp_wmb/rmb which varies depending on the kernel configuration we can can use dma_wmb/rmb which for most architectures should be equal to or slightly more strict than smp_wmb/rmb. The advantage to this is that these barriers are available to uniprocessor builds as well so the performance should improve under such a configuration. Signed-off-by: Alexander Duyck <[email protected]> Signed-off-by: Rusty Russell <[email protected]>
2013-10-29virtio_ring: change host notification APIHeinz Graalfs1-1/+1
Currently a host kick error is silently ignored and not reflected in the virtqueue of a particular virtio device. Changing the notify API for guest->host notification seems to be one prerequisite in order to be able to handle such errors in the context where the kick is triggered. This patch changes the notify API. The notify function must return a bool return value. It returns false if the host notification failed. Signed-off-by: Heinz Graalfs <[email protected]> Signed-off-by: Rusty Russell <[email protected]>
2013-07-09virtio: include asm/barrier explicitlyMichael S. Tsirkin1-0/+1
virtio_ring.h uses mb() and friends, make it pull in asm/barrier.h itself, not rely on other headers to do it. Signed-off-by: Michael S. Tsirkin <[email protected]> Signed-off-by: Rusty Russell <[email protected]>
2013-03-20virtio_ring: expose virtio barriers for use in vringh.Rusty Russell1-0/+57
The host side of ring needs this logic too. Signed-off-by: Rusty Russell <[email protected]>
2012-10-13UAPI: (Scripted) Disintegrate include/linuxDavid Howells1-161/+2
Signed-off-by: David Howells <[email protected]> Acked-by: Arnd Bergmann <[email protected]> Acked-by: Thomas Gleixner <[email protected]> Acked-by: Michael Kerrisk <[email protected]> Acked-by: Paul E. McKenney <[email protected]> Acked-by: Dave Jones <[email protected]>
2012-09-28virtio-ring: move queue_index to vring_virtqueueJason Wang1-1/+2
Instead of storing the queue index in transport-specific virtio structs, this patch moves them to vring_virtqueue and introduces an helper to get the value. This lets drivers simplify their management and tracing of virtqueues. Signed-off-by: Jason Wang <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]> Signed-off-by: Rusty Russell <[email protected]>
2012-01-12virtio: harsher barriers for rpmsg.Rusty Russell1-0/+1
We were cheating with our barriers; using the smp ones rather than the real device ones. That was fine, until rpmsg came along, which is used to talk to a real device (a non-SMP CPU). Unfortunately, just putting back the real barriers (reverting d57ed95d) causes a performance regression on virtio-pci. In particular, Amos reports netbench's TCP_RR over virtio_net CPU utilization increased up to 35% while throughput went down by up to 14%. By comparison, this branch is in the noise. Reference: https://lkml.org/lkml/2011/12/11/22 Signed-off-by: Rusty Russell <[email protected]>
2011-11-02virtio: modify vring_init and vring_size to take account of the layout ↵Wang Sheng-Hui1-3/+3
containing *_event_idx Based on the layout description in the comments, take account of the *_event_idx in functions vring_init and vring_size. Signed-off-by: Wang Sheng-Hui <[email protected]> Signed-off-by: Rusty Russell <[email protected]>
2011-05-30virtio ring: inline function to check for eventsMichael S. Tsirkin1-0/+14
With the new used_event and avail_event and features, both host and guest need similar logic to check whether events are enabled, so it helps to put the common code in the header. Note that Xen has similar logic for notification hold-off in include/xen/interface/io/ring.h with req_event and req_prod corresponding to event_idx + 1 and new_idx respectively. +1 comes from the fact that req_event and req_prod in Xen start at 1, while event index in virtio starts at 0. Signed-off-by: Michael S. Tsirkin <[email protected]> Signed-off-by: Rusty Russell <[email protected]>
2011-05-30virtio: event index interfaceMichael S. Tsirkin1-1/+14
Define a new feature bit for the guest and host to utilize an event index (like Xen) instead if a flag bit to enable/disable interrupts and kicks. Signed-off-by: Michael S. Tsirkin <[email protected]> Signed-off-by: Rusty Russell <[email protected]>
2011-05-30virtio: add full three-clause BSD text to headers.Rusty Russell1-0/+23
It's unclear to me if it's important, but it's obviously causing my technical colleages some headaches and I'd hate such imprecision to slow virtio adoption. I've emailed this to all non-trivial contributors for approval, too. Signed-off-by: Rusty Russell <[email protected]> Acked-by: Grant Likely <[email protected]> Acked-by: Ryan Harper <[email protected]> Acked-by: Anthony Liguori <[email protected]> Acked-by: Eric Van Hensbergen <[email protected]> Acked-by: john cooper <[email protected]> Acked-by: Aneesh Kumar K.V <[email protected]> Acked-by: Christian Borntraeger <[email protected]> Acked-by: Fernando Luis Vazquez Cao <[email protected]>
2009-07-30lguest and virtio: cleanup struct definitions to Linux style.Rusty Russell1-8/+4
I've been doing this for years, and akpm picked me up on it about 12 months ago. lguest partly serves as example code, so let's do it Right. Also, remove two unused fields in struct vblk_info in the example launcher. Signed-off-by: Rusty Russell <[email protected]> Cc: Ingo Molnar <[email protected]>
2009-06-12virtio: indirect ring entries (VIRTIO_RING_F_INDIRECT_DESC)Mark McLoughlin1-0/+5
Add a new feature flag for indirect ring entries. These are ring entries which point to a table of buffer descriptors. The idea here is to increase the ring capacity by allowing a larger effective ring size whereby the ring size dictates the number of requests that may be outstanding, rather than the size of those requests. This should be most effective in the case of block I/O where we can potentially benefit by concurrently dispatching a large number of large requests. Even in the simple case of single segment block requests, this results in a threefold increase in ring capacity. Signed-off-by: Mark McLoughlin <[email protected]> Signed-off-by: Rusty Russell <[email protected]>
2009-06-12virtio: add names to virtqueue struct, mapping from devices to queues.Rusty Russell1-1/+2
Add a linked list of all virtqueues for a virtio device: this helps for debugging and is also needed for upcoming interface change. Also, add a "name" field for clearer debug messages. Signed-off-by: Rusty Russell <[email protected]>
2008-12-30virtio: hand virtio ring alignment as argument to vring_new_virtqueueRusty Russell1-0/+1
This allows each virtio user to hand in the alignment appropriate to their virtio_ring structures. Signed-off-by: Rusty Russell <[email protected]> Acked-by: Christian Borntraeger <[email protected]>
2008-12-30virtio: rename 'pagesize' arg to vring_init/vring_sizeRusty Russell1-6/+6
It's really the alignment desired for consumer/producer separation; historically this x86 pagesize, but with PowerPC it'll still be x86 pagesize. And in theory lguest could choose a different value. Signed-off-by: Rusty Russell <[email protected]>
2008-07-25virtio: Add transport feature handling stub for virtio_ring.Rusty Russell1-0/+2
To prepare for virtio_ring transport feature bits, hook in a call in all the users to manipulate them. This currently just clears all the bits, since it doesn't understand any features. Signed-off-by: Rusty Russell <[email protected]>
2008-02-04virtio: clarify NO_NOTIFY flag usageRusty Russell1-2/+6
The other side (host) can set the NO_NOTIFY flag as an optimization, to say "no need to kick me when you add things". Make it clear that this is advisory only; especially that we should always notify when the ring is full. Signed-off-by: Rusty Russell <[email protected]>
2008-02-04virtio: Fix vring_init/vring_size to take unsigned longAnthony Liguori1-2/+2
Using unsigned int resulted in silent truncation of the upper 32-bit on x86_64 resulting in an OOPS since the ring was being initialized wrong. Please reconsider my previous patch to just use PAGE_ALIGN(). Open coding this sort of stuff, no matter how simple it seems, is just asking for this sort of trouble. Signed-off-by: Anthony Liguori <[email protected]> Signed-off-by: Rusty Russell <[email protected]>
2008-02-04virtio: explicit enable_cb/disable_cb rather than callback return.Rusty Russell1-1/+1
It seems that virtio_net wants to disable callbacks (interrupts) before calling netif_rx_schedule(), so we can't use the return value to do so. Rename "restart" to "cb_enable" and introduce "cb_disable" hook: callback now returns void, rather than a boolean. Signed-off-by: Rusty Russell <[email protected]>
2007-11-12virtio: Force use of power-of-two for descriptor ring sizesRusty Russell1-8/+11
The virtio descriptor rings of size N-1 were nicely set up to be aligned to an N-byte boundary. But as Anthony Liguori points out, the free-running indices used by virtio require that the sizes be a power of 2, otherwise we get problems on wrap (demonstrated with lguest). So we replace the clever "2^n-1" scheme with a simple "align to page boundary" scheme: this means that all virtio rings take at least two pages, but it's safer than guessing cache alignment. Signed-off-by: Rusty Russell <[email protected]>
2007-11-12virtio: fix vring_init for 64 bitsAnthony Liguori1-2/+2
This patch fixes a typo in vring_init(). This happens to work today in lguest because the sizeof(struct vring_desc) is 16 and struct vring contains 3 pointers and an unsigned int so on 32-bit sizeof(struct vring_desc) == sizeof(struct vring). However, this is no longer true on 64-bit where the bug is exposed. Signed-off-by: Anthony Liguori <[email protected]> Signed-off-by: Rusty Russell <[email protected]>
2007-10-23Virtio helper routines for a descriptor ringbuffer implementationRusty Russell1-0/+119
These helper routines supply most of the virtqueue_ops for hypervisors which want to use a ring for virtio. Unlike the previous lguest implementation: 1) The rings are variable sized (2^n-1 elements). 2) They have an unfortunate limit of 65535 bytes per sg element. 3) The page numbers are always 64 bit (PAE anyone?) 4) They no longer place used[] on a separate page, just a separate cacheline. 5) We do a modulo on a variable. We could be tricky if we cared. 6) Interrupts and notifies are suppressed using flags within the rings. Users need only get the ring pages and provide a notify hook (KVM wants the guest to allocate the rings, lguest does it sanely). Signed-off-by: Rusty Russell <[email protected]> Cc: Dor Laor <[email protected]>