mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
virtio: Force use of power-of-two for descriptor ring sizes
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]>
This commit is contained in:
parent
1200e646ae
commit
42b36cc0ce
4 changed files with 25 additions and 14 deletions
|
|
@ -62,8 +62,8 @@ typedef uint8_t u8;
|
|||
#endif
|
||||
/* We can have up to 256 pages for devices. */
|
||||
#define DEVICE_PAGES 256
|
||||
/* This fits nicely in a single 4096-byte page. */
|
||||
#define VIRTQUEUE_NUM 127
|
||||
/* This will occupy 2 pages: it must be a power of 2. */
|
||||
#define VIRTQUEUE_NUM 128
|
||||
|
||||
/*L:120 verbose is both a global flag and a macro. The C preprocessor allows
|
||||
* this, and although I wouldn't recommend it, it works quite nicely here. */
|
||||
|
|
@ -1036,7 +1036,8 @@ static void add_virtqueue(struct device *dev, unsigned int num_descs,
|
|||
void *p;
|
||||
|
||||
/* First we need some pages for this virtqueue. */
|
||||
pages = (vring_size(num_descs) + getpagesize() - 1) / getpagesize();
|
||||
pages = (vring_size(num_descs, getpagesize()) + getpagesize() - 1)
|
||||
/ getpagesize();
|
||||
p = get_pages(pages);
|
||||
|
||||
/* Initialize the configuration. */
|
||||
|
|
@ -1045,7 +1046,7 @@ static void add_virtqueue(struct device *dev, unsigned int num_descs,
|
|||
vq->config.pfn = to_guest_phys(p) / getpagesize();
|
||||
|
||||
/* Initialize the vring. */
|
||||
vring_init(&vq->vring, num_descs, p);
|
||||
vring_init(&vq->vring, num_descs, p, getpagesize());
|
||||
|
||||
/* Add the configuration information to this device's descriptor. */
|
||||
add_desc_field(dev, VIRTIO_CONFIG_F_VIRTQUEUE,
|
||||
|
|
|
|||
Loading…
Reference in a new issue