diff options
author | Jason Wang <jasowang@redhat.com> | 2019-05-24 04:12:16 -0400 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2019-06-05 16:23:53 -0400 |
commit | 4942e8254d93b31ea14cf63a9dfd10a8112caafa (patch) | |
tree | 6bcaf63cd3e5e38f748c26012f76f1b75384ff4e /drivers/vhost/vhost.c | |
parent | 9b5e830b7120847da6c636af2d101f8380e73fa0 (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.c | 51 |
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 | } |
429 | EXPORT_SYMBOL_GPL(vhost_exceeds_weight); | 429 | EXPORT_SYMBOL_GPL(vhost_exceeds_weight); |
430 | 430 | ||
431 | static 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 | |||
441 | static 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 | |||
451 | static size_t vhost_get_desc_size(struct vhost_virtqueue *vq, | ||
452 | unsigned int num) | ||
453 | { | ||
454 | return sizeof(*vq->desc) * num; | ||
455 | } | ||
456 | |||
431 | void vhost_dev_init(struct vhost_dev *dev, | 457 | void 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 | ||
1287 | static void vhost_vq_meta_update(struct vhost_virtqueue *vq, | 1309 | static void vhost_vq_meta_update(struct vhost_virtqueue *vq, |
@@ -1333,22 +1355,18 @@ static bool iotlb_access_ok(struct vhost_virtqueue *vq, | |||
1333 | 1355 | ||
1334 | int vq_meta_prefetch(struct vhost_virtqueue *vq) | 1356 | int 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 | } |
1353 | EXPORT_SYMBOL_GPL(vq_meta_prefetch); | 1371 | EXPORT_SYMBOL_GPL(vq_meta_prefetch); |
1354 | 1372 | ||
@@ -1365,13 +1383,10 @@ EXPORT_SYMBOL_GPL(vhost_log_access_ok); | |||
1365 | static bool vq_log_access_ok(struct vhost_virtqueue *vq, | 1383 | static 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? */ |