@@ -1193,7 +1193,7 @@ mod tests {
1193
1193
use vm_memory:: { GuestAddress , GuestMemoryMmap } ;
1194
1194
1195
1195
#[ test]
1196
- pub fn test_offset ( ) {
1196
+ fn test_offset ( ) {
1197
1197
assert_eq ! ( offset_of!( Descriptor , addr) , 0 ) ;
1198
1198
assert_eq ! ( offset_of!( Descriptor , len) , 8 ) ;
1199
1199
assert_eq ! ( offset_of!( Descriptor , flags) , 12 ) ;
@@ -1340,64 +1340,66 @@ mod tests {
1340
1340
}
1341
1341
}
1342
1342
1343
- #[ test]
1344
- fn test_queue_and_iterator ( ) {
1343
+ fn do_test_queue_and_iterator < QS : QueueStateT > ( ) {
1345
1344
let m = & GuestMemoryMmap :: < ( ) > :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1346
1345
let vq = MockSplitQueue :: new ( m, 16 ) ;
1347
1346
1348
- let mut q: Queue < _ , QueueState > = vq. as_queue ( m) ;
1347
+ let mut q: Queue < _ , QS > = vq. as_queue ( m) ;
1349
1348
1350
1349
// q is currently valid
1351
1350
assert ! ( q. is_valid( ) ) ;
1352
1351
1353
1352
// shouldn't be valid when not marked as ready
1354
- q. state . ready = false ;
1353
+ q. lock ( ) . ready = false ;
1355
1354
assert ! ( !q. is_valid( ) ) ;
1356
- q. state . ready = true ;
1355
+ q. lock ( ) . ready = true ;
1356
+
1357
+ let max_size = q. lock ( ) . max_size ;
1357
1358
1358
1359
// or when size > max_size
1359
- q. state . size = q . state . max_size << 1 ;
1360
+ q. lock ( ) . size = max_size << 1 ;
1360
1361
assert ! ( !q. is_valid( ) ) ;
1361
- q. state . size = q . state . max_size ;
1362
+ q. lock ( ) . size = max_size;
1362
1363
1363
1364
// or when size is 0
1364
- q. state . size = 0 ;
1365
+ q. lock ( ) . size = 0 ;
1365
1366
assert ! ( !q. is_valid( ) ) ;
1366
- q. state . size = q . state . max_size ;
1367
+ q. lock ( ) . size = max_size;
1367
1368
1368
1369
// or when size is not a power of 2
1369
- q. state . size = 11 ;
1370
+ q. lock ( ) . size = 11 ;
1370
1371
assert ! ( !q. is_valid( ) ) ;
1371
- q. state . size = q . state . max_size ;
1372
+ q. lock ( ) . size = max_size;
1372
1373
1373
1374
// or if the various addresses are off
1374
1375
1375
- q. state . desc_table = GuestAddress ( 0xffff_ffff ) ;
1376
+ q. lock ( ) . desc_table = GuestAddress ( 0xffff_ffff ) ;
1376
1377
assert ! ( !q. is_valid( ) ) ;
1377
- q. state . desc_table = GuestAddress ( 0x1001 ) ;
1378
+ q. lock ( ) . desc_table = GuestAddress ( 0x1001 ) ;
1378
1379
assert ! ( !q. is_valid( ) ) ;
1379
- q. state . desc_table = vq. desc_table_addr ( ) ;
1380
+ q. lock ( ) . desc_table = vq. desc_table_addr ( ) ;
1380
1381
1381
- q. state . avail_ring = GuestAddress ( 0xffff_ffff ) ;
1382
+ q. lock ( ) . avail_ring = GuestAddress ( 0xffff_ffff ) ;
1382
1383
assert ! ( !q. is_valid( ) ) ;
1383
- q. state . avail_ring = GuestAddress ( 0x1001 ) ;
1384
+ q. lock ( ) . avail_ring = GuestAddress ( 0x1001 ) ;
1384
1385
assert ! ( !q. is_valid( ) ) ;
1385
- q. state . avail_ring = vq. avail_addr ( ) ;
1386
+ q. lock ( ) . avail_ring = vq. avail_addr ( ) ;
1386
1387
1387
- q. state . used_ring = GuestAddress ( 0xffff_ffff ) ;
1388
+ q. lock ( ) . used_ring = GuestAddress ( 0xffff_ffff ) ;
1388
1389
assert ! ( !q. is_valid( ) ) ;
1389
- q. state . used_ring = GuestAddress ( 0x1001 ) ;
1390
+ q. lock ( ) . used_ring = GuestAddress ( 0x1001 ) ;
1390
1391
assert ! ( !q. is_valid( ) ) ;
1391
- q. state . used_ring = vq. used_addr ( ) ;
1392
+ q. lock ( ) . used_ring = vq. used_addr ( ) ;
1392
1393
1393
1394
{
1395
+ let mut qstate = q. lock ( ) ;
1394
1396
// an invalid queue should return an iterator with no next
1395
- q . state . ready = false ;
1396
- let mut i = q . iter ( ) . unwrap ( ) ;
1397
+ qstate . ready = false ;
1398
+ let mut i = qstate . iter ( ) . unwrap ( ) ;
1397
1399
assert ! ( i. next( ) . is_none( ) ) ;
1398
1400
}
1399
1401
1400
- q. state . ready = true ;
1402
+ q. lock ( ) . ready = true ;
1401
1403
1402
1404
// now let's create two simple descriptor chains
1403
1405
// the chains are (0, 1) and (2, 3, 4)
@@ -1416,7 +1418,8 @@ mod tests {
1416
1418
vq. avail ( ) . ring ( ) . ref_at ( 1 ) . store ( 2 ) ;
1417
1419
vq. avail ( ) . idx ( ) . store ( 2 ) ;
1418
1420
1419
- let mut i = q. iter ( ) . unwrap ( ) ;
1421
+ let mut qstate = q. lock ( ) ;
1422
+ let mut i = qstate. iter ( ) . unwrap ( ) ;
1420
1423
1421
1424
{
1422
1425
let mut c = i. next ( ) . unwrap ( ) ;
@@ -1443,7 +1446,7 @@ mod tests {
1443
1446
{
1444
1447
assert ! ( i. next( ) . is_none( ) ) ;
1445
1448
i. go_to_previous_position ( ) ;
1446
- let mut c = q . iter ( ) . unwrap ( ) . next ( ) . unwrap ( ) ;
1449
+ let mut c = qstate . iter ( ) . unwrap ( ) . next ( ) . unwrap ( ) ;
1447
1450
c. next ( ) . unwrap ( ) ;
1448
1451
c. next ( ) . unwrap ( ) ;
1449
1452
c. next ( ) . unwrap ( ) ;
@@ -1453,11 +1456,16 @@ mod tests {
1453
1456
}
1454
1457
1455
1458
#[ test]
1456
- fn test_descriptor_and_iterator ( ) {
1459
+ fn test_queue_and_iterator ( ) {
1460
+ do_test_queue_and_iterator :: < QueueState > ( ) ;
1461
+ do_test_queue_and_iterator :: < QueueStateSync > ( ) ;
1462
+ }
1463
+
1464
+ fn do_test_descriptor_and_iterator < QS : QueueStateT > ( ) {
1457
1465
let m = & GuestMemoryMmap :: < ( ) > :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1458
1466
let vq = MockSplitQueue :: new ( m, 16 ) ;
1459
1467
1460
- let mut q: Queue < _ , QueueState > = vq. as_queue ( m) ;
1468
+ let mut q: Queue < _ , QS > = vq. as_queue ( m) ;
1461
1469
1462
1470
// q is currently valid
1463
1471
assert ! ( q. is_valid( ) ) ;
@@ -1479,7 +1487,8 @@ mod tests {
1479
1487
vq. avail ( ) . ring ( ) . ref_at ( 2 ) . store ( 5 ) ;
1480
1488
vq. avail ( ) . idx ( ) . store ( 3 ) ;
1481
1489
1482
- let mut i = q. iter ( ) . unwrap ( ) ;
1490
+ let mut qstate = q. lock ( ) ;
1491
+ let mut i = qstate. iter ( ) . unwrap ( ) ;
1483
1492
1484
1493
{
1485
1494
let c = i. next ( ) . unwrap ( ) ;
@@ -1515,11 +1524,16 @@ mod tests {
1515
1524
}
1516
1525
1517
1526
#[ test]
1518
- fn test_add_used ( ) {
1527
+ fn test_descriptor_and_iterator ( ) {
1528
+ do_test_descriptor_and_iterator :: < QueueState > ( ) ;
1529
+ do_test_descriptor_and_iterator :: < QueueStateSync > ( ) ;
1530
+ }
1531
+
1532
+ fn do_test_add_used < QS : QueueStateT > ( ) {
1519
1533
let m = & GuestMemoryMmap :: < ( ) > :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1520
1534
let vq = MockSplitQueue :: new ( m, 16 ) ;
1521
1535
1522
- let mut q: Queue < _ , QueueState > = vq. as_queue ( m) ;
1536
+ let mut q: Queue < _ , QS > = vq. as_queue ( m) ;
1523
1537
1524
1538
assert_eq ! ( vq. used( ) . idx( ) . load( ) , 0 ) ;
1525
1539
@@ -1529,7 +1543,7 @@ mod tests {
1529
1543
1530
1544
// should be ok
1531
1545
q. add_used ( 1 , 0x1000 ) . unwrap ( ) ;
1532
- assert_eq ! ( q. state . next_used, Wrapping ( 1 ) ) ;
1546
+ assert_eq ! ( q. lock ( ) . next_used, Wrapping ( 1 ) ) ;
1533
1547
assert_eq ! ( vq. used( ) . idx( ) . load( ) , 1 ) ;
1534
1548
1535
1549
let x = vq. used ( ) . ring ( ) . ref_at ( 0 ) . load ( ) ;
@@ -1538,44 +1552,59 @@ mod tests {
1538
1552
}
1539
1553
1540
1554
#[ test]
1541
- fn test_reset_queue ( ) {
1555
+ fn test_add_used ( ) {
1556
+ do_test_add_used :: < QueueState > ( ) ;
1557
+ do_test_add_used :: < QueueStateSync > ( ) ;
1558
+ }
1559
+
1560
+ fn do_test_reset_queue < QS : QueueStateT > ( ) {
1542
1561
let m = & GuestMemoryMmap :: < ( ) > :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1543
1562
let vq = MockSplitQueue :: new ( m, 16 ) ;
1544
1563
1545
- let mut q: Queue < _ , QueueState > = vq. as_queue ( m) ;
1546
- q. state . size = 8 ;
1547
- q. state . ready = true ;
1548
- q. state . reset ( ) ;
1549
- assert_eq ! ( q. state. size, 16 ) ;
1550
- assert_eq ! ( q. state. ready, false ) ;
1564
+ let mut q: Queue < _ , QS > = vq. as_queue ( m) ;
1565
+ let mut qstate = q. lock ( ) ;
1566
+ qstate. size = 8 ;
1567
+ qstate. ready = true ;
1568
+ qstate. reset ( ) ;
1569
+ assert_eq ! ( qstate. size, 16 ) ;
1570
+ assert_eq ! ( qstate. ready, false ) ;
1551
1571
}
1552
1572
1553
1573
#[ test]
1554
- fn test_needs_notification ( ) {
1574
+ fn test_reset_queue ( ) {
1575
+ do_test_reset_queue :: < QueueState > ( ) ;
1576
+ do_test_reset_queue :: < QueueStateSync > ( ) ;
1577
+ }
1578
+
1579
+ fn do_test_needs_notification < QS : QueueStateT > ( ) {
1555
1580
let m = & GuestMemoryMmap :: < ( ) > :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1556
1581
let qsize = 16 ;
1557
1582
let vq = MockSplitQueue :: new ( m, qsize) ;
1558
1583
1559
- let mut q: Queue < _ , QueueState > = vq. as_queue ( m) ;
1584
+ let mut q: Queue < _ , QS > = vq. as_queue ( m) ;
1585
+
1560
1586
let avail_addr = vq. avail_addr ( ) ;
1561
1587
1562
1588
// It should always return true when EVENT_IDX isn't enabled.
1563
1589
for i in 0 ..qsize {
1564
- q. state . next_used = Wrapping ( i) ;
1590
+ q. lock ( ) . next_used = Wrapping ( i) ;
1565
1591
assert_eq ! ( q. needs_notification( ) . unwrap( ) , true ) ;
1566
1592
}
1567
1593
1568
1594
m. write_obj :: < u16 > ( 4 , avail_addr. unchecked_add ( 4 + qsize as u64 * 2 ) )
1569
1595
. unwrap ( ) ;
1570
- q. state . set_event_idx ( true ) ;
1596
+ q. lock ( ) . set_event_idx ( true ) ;
1571
1597
1572
1598
// Incrementing up to this value causes an `u16` to wrap back to 0.
1573
1599
let wrap = u32:: from ( u16:: MAX ) + 1 ;
1574
1600
1575
1601
for i in 0 ..wrap + 12 {
1576
- q. state . next_used = Wrapping ( i as u16 ) ;
1602
+ let mut qstate = q. lock ( ) ;
1603
+ qstate. next_used = Wrapping ( i as u16 ) ;
1577
1604
// Let's test wrapping around the maximum index value as well.
1578
- let expected = i == 5 || i == ( 5 + wrap) || q. state . signalled_used . is_none ( ) ;
1605
+ let expected = i == 5 || i == ( 5 + wrap) || qstate. signalled_used . is_none ( ) ;
1606
+ drop ( qstate) ;
1607
+
1579
1608
assert_eq ! ( q. needs_notification( ) . unwrap( ) , expected) ;
1580
1609
}
1581
1610
@@ -1589,22 +1618,27 @@ mod tests {
1589
1618
. unwrap ( ) ;
1590
1619
1591
1620
assert_eq ! ( q. needs_notification( ) . unwrap( ) , false ) ;
1592
- q. state . next_used = Wrapping ( 15 ) ;
1621
+ q. lock ( ) . next_used = Wrapping ( 15 ) ;
1593
1622
assert_eq ! ( q. needs_notification( ) . unwrap( ) , false ) ;
1594
- q. state . next_used = Wrapping ( 0 ) ;
1623
+ q. lock ( ) . next_used = Wrapping ( 0 ) ;
1595
1624
assert_eq ! ( q. needs_notification( ) . unwrap( ) , true ) ;
1596
1625
assert_eq ! ( q. needs_notification( ) . unwrap( ) , false ) ;
1597
1626
}
1598
1627
1599
1628
#[ test]
1600
- fn test_enable_disable_notification ( ) {
1629
+ fn test_needs_notification ( ) {
1630
+ do_test_needs_notification :: < QueueState > ( ) ;
1631
+ do_test_needs_notification :: < QueueStateSync > ( ) ;
1632
+ }
1633
+
1634
+ fn do_test_enable_disable_notification < QS : QueueStateT > ( ) {
1601
1635
let m = & GuestMemoryMmap :: < ( ) > :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1602
1636
let vq = MockSplitQueue :: new ( m, 16 ) ;
1603
1637
1604
- let mut q: Queue < _ , QueueState > = vq. as_queue ( m) ;
1638
+ let mut q: Queue < _ , QS > = vq. as_queue ( m) ;
1605
1639
let used_addr = vq. used_addr ( ) ;
1606
1640
1607
- assert_eq ! ( q. state . event_idx_enabled, false ) ;
1641
+ assert_eq ! ( q. lock ( ) . event_idx_enabled, false ) ;
1608
1642
1609
1643
q. enable_notification ( ) . unwrap ( ) ;
1610
1644
let v = m. read_obj :: < u16 > ( used_addr) . unwrap ( ) ;
@@ -1623,13 +1657,19 @@ mod tests {
1623
1657
m. write_obj :: < u16 > ( 2 , avail_addr. unchecked_add ( 2 ) ) . unwrap ( ) ;
1624
1658
1625
1659
assert_eq ! ( q. enable_notification( ) . unwrap( ) , true ) ;
1626
- q. state . next_avail = Wrapping ( 2 ) ;
1660
+ q. lock ( ) . next_avail = Wrapping ( 2 ) ;
1627
1661
assert_eq ! ( q. enable_notification( ) . unwrap( ) , false ) ;
1628
1662
1629
1663
m. write_obj :: < u16 > ( 8 , avail_addr. unchecked_add ( 2 ) ) . unwrap ( ) ;
1630
1664
1631
1665
assert_eq ! ( q. enable_notification( ) . unwrap( ) , true ) ;
1632
- q. state . next_avail = Wrapping ( 8 ) ;
1666
+ q. lock ( ) . next_avail = Wrapping ( 8 ) ;
1633
1667
assert_eq ! ( q. enable_notification( ) . unwrap( ) , false ) ;
1634
1668
}
1669
+
1670
+ #[ test]
1671
+ fn test_enable_disable_notification ( ) {
1672
+ do_test_enable_disable_notification :: < QueueState > ( ) ;
1673
+ do_test_enable_disable_notification :: < QueueStateSync > ( ) ;
1674
+ }
1635
1675
}
0 commit comments