Loading drivers/vhost/vhost.c +33 −18 Original line number Original line Diff line number Diff line Loading @@ -428,6 +428,32 @@ bool vhost_exceeds_weight(struct vhost_virtqueue *vq, } } EXPORT_SYMBOL_GPL(vhost_exceeds_weight); EXPORT_SYMBOL_GPL(vhost_exceeds_weight); static size_t vhost_get_avail_size(struct vhost_virtqueue *vq, unsigned int num) { size_t event __maybe_unused = vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0; return sizeof(*vq->avail) + sizeof(*vq->avail->ring) * num + event; } static size_t vhost_get_used_size(struct vhost_virtqueue *vq, unsigned int num) { size_t event __maybe_unused = vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0; return sizeof(*vq->used) + sizeof(*vq->used->ring) * num + event; } static size_t vhost_get_desc_size(struct vhost_virtqueue *vq, unsigned int num) { return sizeof(*vq->desc) * num; } void vhost_dev_init(struct vhost_dev *dev, void vhost_dev_init(struct vhost_dev *dev, struct vhost_virtqueue **vqs, int nvqs, struct vhost_virtqueue **vqs, int nvqs, int iov_limit, int weight, int byte_weight) int iov_limit, int weight, int byte_weight) Loading Loading @@ -1275,13 +1301,9 @@ static bool vq_access_ok(struct vhost_virtqueue *vq, unsigned int num, struct vring_used __user *used) struct vring_used __user *used) { { size_t s __maybe_unused = vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0; return access_ok(desc, vhost_get_desc_size(vq, num)) && access_ok(avail, vhost_get_avail_size(vq, num)) && return access_ok(desc, num * sizeof *desc) && access_ok(used, vhost_get_used_size(vq, num)); access_ok(avail, sizeof *avail + num * sizeof *avail->ring + s) && access_ok(used, sizeof *used + num * sizeof *used->ring + s); } } static void vhost_vq_meta_update(struct vhost_virtqueue *vq, static void vhost_vq_meta_update(struct vhost_virtqueue *vq, Loading Loading @@ -1333,22 +1355,18 @@ static bool iotlb_access_ok(struct vhost_virtqueue *vq, int vq_meta_prefetch(struct vhost_virtqueue *vq) int vq_meta_prefetch(struct vhost_virtqueue *vq) { { size_t s = vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0; unsigned int num = vq->num; unsigned int num = vq->num; if (!vq->iotlb) if (!vq->iotlb) return 1; return 1; return iotlb_access_ok(vq, VHOST_ACCESS_RO, (u64)(uintptr_t)vq->desc, return iotlb_access_ok(vq, VHOST_ACCESS_RO, (u64)(uintptr_t)vq->desc, num * sizeof(*vq->desc), VHOST_ADDR_DESC) && vhost_get_desc_size(vq, num), VHOST_ADDR_DESC) && iotlb_access_ok(vq, VHOST_ACCESS_RO, (u64)(uintptr_t)vq->avail, iotlb_access_ok(vq, VHOST_ACCESS_RO, (u64)(uintptr_t)vq->avail, sizeof *vq->avail + vhost_get_avail_size(vq, num), num * sizeof(*vq->avail->ring) + s, VHOST_ADDR_AVAIL) && VHOST_ADDR_AVAIL) && iotlb_access_ok(vq, VHOST_ACCESS_WO, (u64)(uintptr_t)vq->used, iotlb_access_ok(vq, VHOST_ACCESS_WO, (u64)(uintptr_t)vq->used, sizeof *vq->used + vhost_get_used_size(vq, num), VHOST_ADDR_USED); num * sizeof(*vq->used->ring) + s, VHOST_ADDR_USED); } } EXPORT_SYMBOL_GPL(vq_meta_prefetch); EXPORT_SYMBOL_GPL(vq_meta_prefetch); Loading @@ -1365,13 +1383,10 @@ EXPORT_SYMBOL_GPL(vhost_log_access_ok); static bool vq_log_access_ok(struct vhost_virtqueue *vq, static bool vq_log_access_ok(struct vhost_virtqueue *vq, void __user *log_base) void __user *log_base) { { size_t s = vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0; return vq_memory_access_ok(log_base, vq->umem, return vq_memory_access_ok(log_base, vq->umem, vhost_has_feature(vq, VHOST_F_LOG_ALL)) && vhost_has_feature(vq, VHOST_F_LOG_ALL)) && (!vq->log_used || log_access_ok(log_base, vq->log_addr, (!vq->log_used || log_access_ok(log_base, vq->log_addr, sizeof *vq->used + vhost_get_used_size(vq, vq->num))); vq->num * sizeof *vq->used->ring + s)); } } /* Can we start vq? */ /* Can we start vq? */ Loading Loading
drivers/vhost/vhost.c +33 −18 Original line number Original line Diff line number Diff line Loading @@ -428,6 +428,32 @@ bool vhost_exceeds_weight(struct vhost_virtqueue *vq, } } EXPORT_SYMBOL_GPL(vhost_exceeds_weight); EXPORT_SYMBOL_GPL(vhost_exceeds_weight); static size_t vhost_get_avail_size(struct vhost_virtqueue *vq, unsigned int num) { size_t event __maybe_unused = vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0; return sizeof(*vq->avail) + sizeof(*vq->avail->ring) * num + event; } static size_t vhost_get_used_size(struct vhost_virtqueue *vq, unsigned int num) { size_t event __maybe_unused = vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0; return sizeof(*vq->used) + sizeof(*vq->used->ring) * num + event; } static size_t vhost_get_desc_size(struct vhost_virtqueue *vq, unsigned int num) { return sizeof(*vq->desc) * num; } void vhost_dev_init(struct vhost_dev *dev, void vhost_dev_init(struct vhost_dev *dev, struct vhost_virtqueue **vqs, int nvqs, struct vhost_virtqueue **vqs, int nvqs, int iov_limit, int weight, int byte_weight) int iov_limit, int weight, int byte_weight) Loading Loading @@ -1275,13 +1301,9 @@ static bool vq_access_ok(struct vhost_virtqueue *vq, unsigned int num, struct vring_used __user *used) struct vring_used __user *used) { { size_t s __maybe_unused = vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0; return access_ok(desc, vhost_get_desc_size(vq, num)) && access_ok(avail, vhost_get_avail_size(vq, num)) && return access_ok(desc, num * sizeof *desc) && access_ok(used, vhost_get_used_size(vq, num)); access_ok(avail, sizeof *avail + num * sizeof *avail->ring + s) && access_ok(used, sizeof *used + num * sizeof *used->ring + s); } } static void vhost_vq_meta_update(struct vhost_virtqueue *vq, static void vhost_vq_meta_update(struct vhost_virtqueue *vq, Loading Loading @@ -1333,22 +1355,18 @@ static bool iotlb_access_ok(struct vhost_virtqueue *vq, int vq_meta_prefetch(struct vhost_virtqueue *vq) int vq_meta_prefetch(struct vhost_virtqueue *vq) { { size_t s = vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0; unsigned int num = vq->num; unsigned int num = vq->num; if (!vq->iotlb) if (!vq->iotlb) return 1; return 1; return iotlb_access_ok(vq, VHOST_ACCESS_RO, (u64)(uintptr_t)vq->desc, return iotlb_access_ok(vq, VHOST_ACCESS_RO, (u64)(uintptr_t)vq->desc, num * sizeof(*vq->desc), VHOST_ADDR_DESC) && vhost_get_desc_size(vq, num), VHOST_ADDR_DESC) && iotlb_access_ok(vq, VHOST_ACCESS_RO, (u64)(uintptr_t)vq->avail, iotlb_access_ok(vq, VHOST_ACCESS_RO, (u64)(uintptr_t)vq->avail, sizeof *vq->avail + vhost_get_avail_size(vq, num), num * sizeof(*vq->avail->ring) + s, VHOST_ADDR_AVAIL) && VHOST_ADDR_AVAIL) && iotlb_access_ok(vq, VHOST_ACCESS_WO, (u64)(uintptr_t)vq->used, iotlb_access_ok(vq, VHOST_ACCESS_WO, (u64)(uintptr_t)vq->used, sizeof *vq->used + vhost_get_used_size(vq, num), VHOST_ADDR_USED); num * sizeof(*vq->used->ring) + s, VHOST_ADDR_USED); } } EXPORT_SYMBOL_GPL(vq_meta_prefetch); EXPORT_SYMBOL_GPL(vq_meta_prefetch); Loading @@ -1365,13 +1383,10 @@ EXPORT_SYMBOL_GPL(vhost_log_access_ok); static bool vq_log_access_ok(struct vhost_virtqueue *vq, static bool vq_log_access_ok(struct vhost_virtqueue *vq, void __user *log_base) void __user *log_base) { { size_t s = vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0; return vq_memory_access_ok(log_base, vq->umem, return vq_memory_access_ok(log_base, vq->umem, vhost_has_feature(vq, VHOST_F_LOG_ALL)) && vhost_has_feature(vq, VHOST_F_LOG_ALL)) && (!vq->log_used || log_access_ok(log_base, vq->log_addr, (!vq->log_used || log_access_ok(log_base, vq->log_addr, sizeof *vq->used + vhost_get_used_size(vq, vq->num))); vq->num * sizeof *vq->used->ring + s)); } } /* Can we start vq? */ /* Can we start vq? */ Loading