@@ -428,6 +428,32 @@ bool vhost_exceeds_weight(struct vhost_virtqueue *vq,
428
428
}
429
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
457
void vhost_dev_init (struct vhost_dev * dev ,
432
458
struct vhost_virtqueue * * vqs , int nvqs ,
433
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
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 ;
1279
-
1280
- return access_ok (desc , num * sizeof * desc ) &&
1281
- access_ok (avail ,
1282
- sizeof * avail + num * sizeof * avail -> ring + s ) &&
1283
- access_ok (used ,
1284
- sizeof * used + num * sizeof * used -> ring + s );
1304
+ return access_ok (desc , vhost_get_desc_size (vq , num )) &&
1305
+ access_ok (avail , vhost_get_avail_size (vq , num )) &&
1306
+ access_ok (used , vhost_get_used_size (vq , num ));
1285
1307
}
1286
1308
1287
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
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
1358
unsigned int num = vq -> num ;
1338
1359
1339
1360
if (!vq -> iotlb )
1340
1361
return 1 ;
1341
1362
1342
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
1365
iotlb_access_ok (vq , VHOST_ACCESS_RO , (u64 )(uintptr_t )vq -> avail ,
1345
- sizeof * vq -> avail +
1346
- num * sizeof (* vq -> avail -> ring ) + s ,
1366
+ vhost_get_avail_size (vq , num ),
1347
1367
VHOST_ADDR_AVAIL ) &&
1348
1368
iotlb_access_ok (vq , VHOST_ACCESS_WO , (u64 )(uintptr_t )vq -> used ,
1349
- sizeof * vq -> used +
1350
- num * sizeof (* vq -> used -> ring ) + s ,
1351
- VHOST_ADDR_USED );
1369
+ vhost_get_used_size (vq , num ), VHOST_ADDR_USED );
1352
1370
}
1353
1371
EXPORT_SYMBOL_GPL (vq_meta_prefetch );
1354
1372
@@ -1365,13 +1383,10 @@ EXPORT_SYMBOL_GPL(vhost_log_access_ok);
1365
1383
static bool vq_log_access_ok (struct vhost_virtqueue * vq ,
1366
1384
void __user * log_base )
1367
1385
{
1368
- size_t s = vhost_has_feature (vq , VIRTIO_RING_F_EVENT_IDX ) ? 2 : 0 ;
1369
-
1370
1386
return vq_memory_access_ok (log_base , vq -> umem ,
1371
1387
vhost_has_feature (vq , VHOST_F_LOG_ALL )) &&
1372
1388
(!vq -> log_used || log_access_ok (log_base , vq -> log_addr ,
1373
- sizeof * vq -> used +
1374
- vq -> num * sizeof * vq -> used -> ring + s ));
1389
+ vhost_get_used_size (vq , vq -> num )));
1375
1390
}
1376
1391
1377
1392
/* Can we start vq? */
0 commit comments