summaryrefslogtreecommitdiffstats
path: root/drivers/vhost/vhost.c
diff options
context:
space:
mode:
authorJason Wang <jasowang@redhat.com>2019-05-24 04:12:16 -0400
committerMichael S. Tsirkin <mst@redhat.com>2019-06-05 16:23:53 -0400
commit4942e8254d93b31ea14cf63a9dfd10a8112caafa (patch)
tree6bcaf63cd3e5e38f748c26012f76f1b75384ff4e /drivers/vhost/vhost.c
parent9b5e830b7120847da6c636af2d101f8380e73fa0 (diff)
vhost: introduce helpers to get the size of metadata area
To avoid code duplication since it will be used by kernel VA prefetching. Signed-off-by: Jason Wang <jasowang@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'drivers/vhost/vhost.c')
-rw-r--r--drivers/vhost/vhost.c51
1 files changed, 33 insertions, 18 deletions
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index a0f2fbf35a27..30afc79d551e 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -428,6 +428,32 @@ bool vhost_exceeds_weight(struct vhost_virtqueue *vq,
428} 428}
429EXPORT_SYMBOL_GPL(vhost_exceeds_weight); 429EXPORT_SYMBOL_GPL(vhost_exceeds_weight);
430 430
431static size_t vhost_get_avail_size(struct vhost_virtqueue *vq,
432 unsigned int num)
433{
434 size_t event __maybe_unused =
435 vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0;
436
437 return sizeof(*vq->avail) +
438 sizeof(*vq->avail->ring) * num + event;
439}
440
441static size_t vhost_get_used_size(struct vhost_virtqueue *vq,
442 unsigned int num)
443{
444 size_t event __maybe_unused =
445 vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0;
446
447 return sizeof(*vq->used) +
448 sizeof(*vq->used->ring) * num + event;
449}
450
451static size_t vhost_get_desc_size(struct vhost_virtqueue *vq,
452 unsigned int num)
453{
454 return sizeof(*vq->desc) * num;
455}
456
431void vhost_dev_init(struct vhost_dev *dev, 457void vhost_dev_init(struct vhost_dev *dev,
432 struct vhost_virtqueue **vqs, int nvqs, 458 struct vhost_virtqueue **vqs, int nvqs,
433 int iov_limit, int weight, int byte_weight) 459 int iov_limit, int weight, int byte_weight)
@@ -1275,13 +1301,9 @@ static bool vq_access_ok(struct vhost_virtqueue *vq, unsigned int num,
1275 struct vring_used __user *used) 1301 struct vring_used __user *used)
1276 1302
1277{ 1303{
1278 size_t s __maybe_unused = vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0; 1304 return access_ok(desc, vhost_get_desc_size(vq, num)) &&
1279 1305 access_ok(avail, vhost_get_avail_size(vq, num)) &&
1280 return access_ok(desc, num * sizeof *desc) && 1306 access_ok(used, vhost_get_used_size(vq, num));
1281 access_ok(avail,
1282 sizeof *avail + num * sizeof *avail->ring + s) &&
1283 access_ok(used,
1284 sizeof *used + num * sizeof *used->ring + s);
1285} 1307}
1286 1308
1287static void vhost_vq_meta_update(struct vhost_virtqueue *vq, 1309static void vhost_vq_meta_update(struct vhost_virtqueue *vq,
@@ -1333,22 +1355,18 @@ static bool iotlb_access_ok(struct vhost_virtqueue *vq,
1333 1355
1334int vq_meta_prefetch(struct vhost_virtqueue *vq) 1356int vq_meta_prefetch(struct vhost_virtqueue *vq)
1335{ 1357{
1336 size_t s = vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0;
1337 unsigned int num = vq->num; 1358 unsigned int num = vq->num;
1338 1359
1339 if (!vq->iotlb) 1360 if (!vq->iotlb)
1340 return 1; 1361 return 1;
1341 1362
1342 return iotlb_access_ok(vq, VHOST_ACCESS_RO, (u64)(uintptr_t)vq->desc, 1363 return iotlb_access_ok(vq, VHOST_ACCESS_RO, (u64)(uintptr_t)vq->desc,
1343 num * sizeof(*vq->desc), VHOST_ADDR_DESC) && 1364 vhost_get_desc_size(vq, num), VHOST_ADDR_DESC) &&
1344 iotlb_access_ok(vq, VHOST_ACCESS_RO, (u64)(uintptr_t)vq->avail, 1365 iotlb_access_ok(vq, VHOST_ACCESS_RO, (u64)(uintptr_t)vq->avail,
1345 sizeof *vq->avail + 1366 vhost_get_avail_size(vq, num),
1346 num * sizeof(*vq->avail->ring) + s,
1347 VHOST_ADDR_AVAIL) && 1367 VHOST_ADDR_AVAIL) &&
1348 iotlb_access_ok(vq, VHOST_ACCESS_WO, (u64)(uintptr_t)vq->used, 1368 iotlb_access_ok(vq, VHOST_ACCESS_WO, (u64)(uintptr_t)vq->used,
1349 sizeof *vq->used + 1369 vhost_get_used_size(vq, num), VHOST_ADDR_USED);
1350 num * sizeof(*vq->used->ring) + s,
1351 VHOST_ADDR_USED);
1352} 1370}
1353EXPORT_SYMBOL_GPL(vq_meta_prefetch); 1371EXPORT_SYMBOL_GPL(vq_meta_prefetch);
1354 1372
@@ -1365,13 +1383,10 @@ EXPORT_SYMBOL_GPL(vhost_log_access_ok);
1365static bool vq_log_access_ok(struct vhost_virtqueue *vq, 1383static bool vq_log_access_ok(struct vhost_virtqueue *vq,
1366 void __user *log_base) 1384 void __user *log_base)
1367{ 1385{
1368 size_t s = vhost_has_feature(vq, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0;
1369
1370 return vq_memory_access_ok(log_base, vq->umem, 1386 return vq_memory_access_ok(log_base, vq->umem,
1371 vhost_has_feature(vq, VHOST_F_LOG_ALL)) && 1387 vhost_has_feature(vq, VHOST_F_LOG_ALL)) &&
1372 (!vq->log_used || log_access_ok(log_base, vq->log_addr, 1388 (!vq->log_used || log_access_ok(log_base, vq->log_addr,
1373 sizeof *vq->used + 1389 vhost_get_used_size(vq, vq->num)));
1374 vq->num * sizeof *vq->used->ring + s));
1375} 1390}
1376 1391
1377/* Can we start vq? */ 1392/* Can we start vq? */