@@ -1119,6 +1119,8 @@ static struct se_device *tcmu_alloc_device(struct se_hba *hba, const char *name)
1119
1119
init_waitqueue_head (& udev -> nl_cmd_wq );
1120
1120
spin_lock_init (& udev -> nl_cmd_lock );
1121
1121
1122
+ INIT_RADIX_TREE (& udev -> data_blocks , GFP_KERNEL );
1123
+
1122
1124
return & udev -> se_dev ;
1123
1125
}
1124
1126
@@ -1287,10 +1289,54 @@ static void tcmu_dev_call_rcu(struct rcu_head *p)
1287
1289
kfree (udev );
1288
1290
}
1289
1291
1292
+ static int tcmu_check_and_free_pending_cmd (struct tcmu_cmd * cmd )
1293
+ {
1294
+ if (test_bit (TCMU_CMD_BIT_EXPIRED , & cmd -> flags )) {
1295
+ kmem_cache_free (tcmu_cmd_cache , cmd );
1296
+ return 0 ;
1297
+ }
1298
+ return - EINVAL ;
1299
+ }
1300
+
1301
+ static void tcmu_blocks_release (struct tcmu_dev * udev )
1302
+ {
1303
+ int i ;
1304
+ struct page * page ;
1305
+
1306
+ /* Try to release all block pages */
1307
+ mutex_lock (& udev -> cmdr_lock );
1308
+ for (i = 0 ; i <= udev -> dbi_max ; i ++ ) {
1309
+ page = radix_tree_delete (& udev -> data_blocks , i );
1310
+ if (page ) {
1311
+ __free_page (page );
1312
+ atomic_dec (& global_db_count );
1313
+ }
1314
+ }
1315
+ mutex_unlock (& udev -> cmdr_lock );
1316
+ }
1317
+
1290
1318
static void tcmu_dev_kref_release (struct kref * kref )
1291
1319
{
1292
1320
struct tcmu_dev * udev = container_of (kref , struct tcmu_dev , kref );
1293
1321
struct se_device * dev = & udev -> se_dev ;
1322
+ struct tcmu_cmd * cmd ;
1323
+ bool all_expired = true;
1324
+ int i ;
1325
+
1326
+ vfree (udev -> mb_addr );
1327
+ udev -> mb_addr = NULL ;
1328
+
1329
+ /* Upper layer should drain all requests before calling this */
1330
+ spin_lock_irq (& udev -> commands_lock );
1331
+ idr_for_each_entry (& udev -> commands , cmd , i ) {
1332
+ if (tcmu_check_and_free_pending_cmd (cmd ) != 0 )
1333
+ all_expired = false;
1334
+ }
1335
+ idr_destroy (& udev -> commands );
1336
+ spin_unlock_irq (& udev -> commands_lock );
1337
+ WARN_ON (!all_expired );
1338
+
1339
+ tcmu_blocks_release (udev );
1294
1340
1295
1341
call_rcu (& dev -> rcu_head , tcmu_dev_call_rcu );
1296
1342
}
@@ -1483,8 +1529,6 @@ static int tcmu_configure_device(struct se_device *dev)
1483
1529
WARN_ON (udev -> data_size % PAGE_SIZE );
1484
1530
WARN_ON (udev -> data_size % DATA_BLOCK_SIZE );
1485
1531
1486
- INIT_RADIX_TREE (& udev -> data_blocks , GFP_KERNEL );
1487
-
1488
1532
info -> version = __stringify (TCMU_MAILBOX_VERSION );
1489
1533
1490
1534
info -> mem [0 ].name = "tcm-user command & data buffer" ;
@@ -1534,44 +1578,19 @@ static int tcmu_configure_device(struct se_device *dev)
1534
1578
uio_unregister_device (& udev -> uio_info );
1535
1579
err_register :
1536
1580
vfree (udev -> mb_addr );
1581
+ udev -> mb_addr = NULL ;
1537
1582
err_vzalloc :
1538
1583
kfree (info -> name );
1539
1584
info -> name = NULL ;
1540
1585
1541
1586
return ret ;
1542
1587
}
1543
1588
1544
- static int tcmu_check_and_free_pending_cmd (struct tcmu_cmd * cmd )
1545
- {
1546
- if (test_bit (TCMU_CMD_BIT_EXPIRED , & cmd -> flags )) {
1547
- kmem_cache_free (tcmu_cmd_cache , cmd );
1548
- return 0 ;
1549
- }
1550
- return - EINVAL ;
1551
- }
1552
-
1553
1589
static bool tcmu_dev_configured (struct tcmu_dev * udev )
1554
1590
{
1555
1591
return udev -> uio_info .uio_dev ? true : false;
1556
1592
}
1557
1593
1558
- static void tcmu_blocks_release (struct tcmu_dev * udev )
1559
- {
1560
- int i ;
1561
- struct page * page ;
1562
-
1563
- /* Try to release all block pages */
1564
- mutex_lock (& udev -> cmdr_lock );
1565
- for (i = 0 ; i <= udev -> dbi_max ; i ++ ) {
1566
- page = radix_tree_delete (& udev -> data_blocks , i );
1567
- if (page ) {
1568
- __free_page (page );
1569
- atomic_dec (& global_db_count );
1570
- }
1571
- }
1572
- mutex_unlock (& udev -> cmdr_lock );
1573
- }
1574
-
1575
1594
static void tcmu_free_device (struct se_device * dev )
1576
1595
{
1577
1596
struct tcmu_dev * udev = TCMU_DEV (dev );
@@ -1583,30 +1602,13 @@ static void tcmu_free_device(struct se_device *dev)
1583
1602
static void tcmu_destroy_device (struct se_device * dev )
1584
1603
{
1585
1604
struct tcmu_dev * udev = TCMU_DEV (dev );
1586
- struct tcmu_cmd * cmd ;
1587
- bool all_expired = true;
1588
- int i ;
1589
1605
1590
1606
del_timer_sync (& udev -> timeout );
1591
1607
1592
1608
mutex_lock (& root_udev_mutex );
1593
1609
list_del (& udev -> node );
1594
1610
mutex_unlock (& root_udev_mutex );
1595
1611
1596
- vfree (udev -> mb_addr );
1597
-
1598
- /* Upper layer should drain all requests before calling this */
1599
- spin_lock_irq (& udev -> commands_lock );
1600
- idr_for_each_entry (& udev -> commands , cmd , i ) {
1601
- if (tcmu_check_and_free_pending_cmd (cmd ) != 0 )
1602
- all_expired = false;
1603
- }
1604
- idr_destroy (& udev -> commands );
1605
- spin_unlock_irq (& udev -> commands_lock );
1606
- WARN_ON (!all_expired );
1607
-
1608
- tcmu_blocks_release (udev );
1609
-
1610
1612
tcmu_netlink_event (udev , TCMU_CMD_REMOVED_DEVICE , 0 , NULL );
1611
1613
1612
1614
uio_unregister_device (& udev -> uio_info );
0 commit comments