diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-01-02 15:07:50 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-01-02 15:07:50 -0500 |
| commit | d7e19bd882c23109853ac67f414024c816edc8b9 (patch) | |
| tree | 9a302460f9aaa477d8203bd681261e1c1960aa4a | |
| parent | 5e0f872c7d7e371fbdf09e864eddd24bddfda8fe (diff) | |
| parent | 5d9a07b0de512b77bf28d2401e5fe3351f00a240 (diff) | |
Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
Pull vhost cleanup and virtio bugfix
"There's a single change here, fixing a vhost bug where vhost
initialization fails due to used ring alignment check being too
strict"
* tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost:
vhost: relax used address alignment
virtio_ring: document alignment requirements
| -rw-r--r-- | drivers/vhost/vhost.c | 10 | ||||
| -rw-r--r-- | include/uapi/linux/virtio_ring.h | 7 |
2 files changed, 14 insertions, 3 deletions
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index ed71b5347a76..cb807d0ea498 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c | |||
| @@ -713,9 +713,13 @@ long vhost_vring_ioctl(struct vhost_dev *d, int ioctl, void __user *argp) | |||
| 713 | r = -EFAULT; | 713 | r = -EFAULT; |
| 714 | break; | 714 | break; |
| 715 | } | 715 | } |
| 716 | if ((a.avail_user_addr & (sizeof *vq->avail->ring - 1)) || | 716 | |
| 717 | (a.used_user_addr & (sizeof *vq->used->ring - 1)) || | 717 | /* Make sure it's safe to cast pointers to vring types. */ |
| 718 | (a.log_guest_addr & (sizeof *vq->used->ring - 1))) { | 718 | BUILD_BUG_ON(__alignof__ *vq->avail > VRING_AVAIL_ALIGN_SIZE); |
| 719 | BUILD_BUG_ON(__alignof__ *vq->used > VRING_USED_ALIGN_SIZE); | ||
| 720 | if ((a.avail_user_addr & (VRING_AVAIL_ALIGN_SIZE - 1)) || | ||
| 721 | (a.used_user_addr & (VRING_USED_ALIGN_SIZE - 1)) || | ||
| 722 | (a.log_guest_addr & (sizeof(u64) - 1))) { | ||
| 719 | r = -EINVAL; | 723 | r = -EINVAL; |
| 720 | break; | 724 | break; |
| 721 | } | 725 | } |
diff --git a/include/uapi/linux/virtio_ring.h b/include/uapi/linux/virtio_ring.h index 61c818a7fe70..a3318f31e8e7 100644 --- a/include/uapi/linux/virtio_ring.h +++ b/include/uapi/linux/virtio_ring.h | |||
| @@ -101,6 +101,13 @@ struct vring { | |||
| 101 | struct vring_used *used; | 101 | struct vring_used *used; |
| 102 | }; | 102 | }; |
| 103 | 103 | ||
| 104 | /* Alignment requirements for vring elements. | ||
| 105 | * When using pre-virtio 1.0 layout, these fall out naturally. | ||
| 106 | */ | ||
| 107 | #define VRING_AVAIL_ALIGN_SIZE 2 | ||
| 108 | #define VRING_USED_ALIGN_SIZE 4 | ||
| 109 | #define VRING_DESC_ALIGN_SIZE 16 | ||
| 110 | |||
| 104 | /* The standard layout for the ring is a continuous chunk of memory which looks | 111 | /* The standard layout for the ring is a continuous chunk of memory which looks |
| 105 | * like this. We assume num is a power of 2. | 112 | * like this. We assume num is a power of 2. |
| 106 | * | 113 | * |
