@@ -148,7 +148,7 @@ struct tcmu_dev {
148
148
size_t ring_size ;
149
149
150
150
struct mutex cmdr_lock ;
151
- struct list_head cmdr_queue ;
151
+ struct list_head qfull_queue ;
152
152
153
153
uint32_t dbi_max ;
154
154
uint32_t dbi_thresh ;
@@ -159,6 +159,7 @@ struct tcmu_dev {
159
159
160
160
struct timer_list cmd_timer ;
161
161
unsigned int cmd_time_out ;
162
+ struct list_head inflight_queue ;
162
163
163
164
struct timer_list qfull_timer ;
164
165
int qfull_time_out ;
@@ -179,7 +180,7 @@ struct tcmu_dev {
179
180
struct tcmu_cmd {
180
181
struct se_cmd * se_cmd ;
181
182
struct tcmu_dev * tcmu_dev ;
182
- struct list_head cmdr_queue_entry ;
183
+ struct list_head queue_entry ;
183
184
184
185
uint16_t cmd_id ;
185
186
@@ -192,6 +193,7 @@ struct tcmu_cmd {
192
193
unsigned long deadline ;
193
194
194
195
#define TCMU_CMD_BIT_EXPIRED 0
196
+ #define TCMU_CMD_BIT_INFLIGHT 1
195
197
unsigned long flags ;
196
198
};
197
199
/*
@@ -586,7 +588,7 @@ static struct tcmu_cmd *tcmu_alloc_cmd(struct se_cmd *se_cmd)
586
588
if (!tcmu_cmd )
587
589
return NULL ;
588
590
589
- INIT_LIST_HEAD (& tcmu_cmd -> cmdr_queue_entry );
591
+ INIT_LIST_HEAD (& tcmu_cmd -> queue_entry );
590
592
tcmu_cmd -> se_cmd = se_cmd ;
591
593
tcmu_cmd -> tcmu_dev = udev ;
592
594
@@ -915,11 +917,13 @@ static int tcmu_setup_cmd_timer(struct tcmu_cmd *tcmu_cmd, unsigned int tmo,
915
917
return 0 ;
916
918
917
919
tcmu_cmd -> deadline = round_jiffies_up (jiffies + msecs_to_jiffies (tmo ));
918
- mod_timer (timer , tcmu_cmd -> deadline );
920
+ if (!timer_pending (timer ))
921
+ mod_timer (timer , tcmu_cmd -> deadline );
922
+
919
923
return 0 ;
920
924
}
921
925
922
- static int add_to_cmdr_queue (struct tcmu_cmd * tcmu_cmd )
926
+ static int add_to_qfull_queue (struct tcmu_cmd * tcmu_cmd )
923
927
{
924
928
struct tcmu_dev * udev = tcmu_cmd -> tcmu_dev ;
925
929
unsigned int tmo ;
@@ -942,7 +946,7 @@ static int add_to_cmdr_queue(struct tcmu_cmd *tcmu_cmd)
942
946
if (ret )
943
947
return ret ;
944
948
945
- list_add_tail (& tcmu_cmd -> cmdr_queue_entry , & udev -> cmdr_queue );
949
+ list_add_tail (& tcmu_cmd -> queue_entry , & udev -> qfull_queue );
946
950
pr_debug ("adding cmd %u on dev %s to ring space wait queue\n" ,
947
951
tcmu_cmd -> cmd_id , udev -> name );
948
952
return 0 ;
@@ -999,7 +1003,7 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err)
999
1003
base_command_size = tcmu_cmd_get_base_cmd_size (tcmu_cmd -> dbi_cnt );
1000
1004
command_size = tcmu_cmd_get_cmd_size (tcmu_cmd , base_command_size );
1001
1005
1002
- if (!list_empty (& udev -> cmdr_queue ))
1006
+ if (!list_empty (& udev -> qfull_queue ))
1003
1007
goto queue ;
1004
1008
1005
1009
mb = udev -> mb_addr ;
@@ -1096,13 +1100,16 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err)
1096
1100
UPDATE_HEAD (mb -> cmd_head , command_size , udev -> cmdr_size );
1097
1101
tcmu_flush_dcache_range (mb , sizeof (* mb ));
1098
1102
1103
+ list_add_tail (& tcmu_cmd -> queue_entry , & udev -> inflight_queue );
1104
+ set_bit (TCMU_CMD_BIT_INFLIGHT , & tcmu_cmd -> flags );
1105
+
1099
1106
/* TODO: only if FLUSH and FUA? */
1100
1107
uio_event_notify (& udev -> uio_info );
1101
1108
1102
1109
return 0 ;
1103
1110
1104
1111
queue :
1105
- if (add_to_cmdr_queue (tcmu_cmd )) {
1112
+ if (add_to_qfull_queue (tcmu_cmd )) {
1106
1113
* scsi_err = TCM_OUT_OF_RESOURCES ;
1107
1114
return -1 ;
1108
1115
}
@@ -1145,6 +1152,8 @@ static void tcmu_handle_completion(struct tcmu_cmd *cmd, struct tcmu_cmd_entry *
1145
1152
if (test_bit (TCMU_CMD_BIT_EXPIRED , & cmd -> flags ))
1146
1153
goto out ;
1147
1154
1155
+ list_del_init (& cmd -> queue_entry );
1156
+
1148
1157
tcmu_cmd_reset_dbi_cur (cmd );
1149
1158
1150
1159
if (entry -> hdr .uflags & TCMU_UFLAG_UNKNOWN_OP ) {
@@ -1194,9 +1203,29 @@ static void tcmu_handle_completion(struct tcmu_cmd *cmd, struct tcmu_cmd_entry *
1194
1203
tcmu_free_cmd (cmd );
1195
1204
}
1196
1205
1206
+ static void tcmu_set_next_deadline (struct list_head * queue ,
1207
+ struct timer_list * timer )
1208
+ {
1209
+ struct tcmu_cmd * tcmu_cmd , * tmp_cmd ;
1210
+ unsigned long deadline = 0 ;
1211
+
1212
+ list_for_each_entry_safe (tcmu_cmd , tmp_cmd , queue , queue_entry ) {
1213
+ if (!time_after (jiffies , tcmu_cmd -> deadline )) {
1214
+ deadline = tcmu_cmd -> deadline ;
1215
+ break ;
1216
+ }
1217
+ }
1218
+
1219
+ if (deadline )
1220
+ mod_timer (timer , deadline );
1221
+ else
1222
+ del_timer (timer );
1223
+ }
1224
+
1197
1225
static unsigned int tcmu_handle_completions (struct tcmu_dev * udev )
1198
1226
{
1199
1227
struct tcmu_mailbox * mb ;
1228
+ struct tcmu_cmd * cmd ;
1200
1229
int handled = 0 ;
1201
1230
1202
1231
if (test_bit (TCMU_DEV_BIT_BROKEN , & udev -> flags )) {
@@ -1210,7 +1239,6 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev)
1210
1239
while (udev -> cmdr_last_cleaned != READ_ONCE (mb -> cmd_tail )) {
1211
1240
1212
1241
struct tcmu_cmd_entry * entry = (void * ) mb + CMDR_OFF + udev -> cmdr_last_cleaned ;
1213
- struct tcmu_cmd * cmd ;
1214
1242
1215
1243
tcmu_flush_dcache_range (entry , sizeof (* entry ));
1216
1244
@@ -1243,7 +1271,7 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev)
1243
1271
/* no more pending commands */
1244
1272
del_timer (& udev -> cmd_timer );
1245
1273
1246
- if (list_empty (& udev -> cmdr_queue )) {
1274
+ if (list_empty (& udev -> qfull_queue )) {
1247
1275
/*
1248
1276
* no more pending or waiting commands so try to
1249
1277
* reclaim blocks if needed.
@@ -1252,6 +1280,8 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev)
1252
1280
tcmu_global_max_blocks )
1253
1281
schedule_delayed_work (& tcmu_unmap_work , 0 );
1254
1282
}
1283
+ } else if (udev -> cmd_time_out ) {
1284
+ tcmu_set_next_deadline (& udev -> inflight_queue , & udev -> cmd_timer );
1255
1285
}
1256
1286
1257
1287
return handled ;
@@ -1271,7 +1301,7 @@ static int tcmu_check_expired_cmd(int id, void *p, void *data)
1271
1301
if (!time_after (jiffies , cmd -> deadline ))
1272
1302
return 0 ;
1273
1303
1274
- is_running = list_empty ( & cmd -> cmdr_queue_entry );
1304
+ is_running = test_bit ( TCMU_CMD_BIT_INFLIGHT , & cmd -> flags );
1275
1305
se_cmd = cmd -> se_cmd ;
1276
1306
1277
1307
if (is_running ) {
@@ -1288,12 +1318,11 @@ static int tcmu_check_expired_cmd(int id, void *p, void *data)
1288
1318
*/
1289
1319
scsi_status = SAM_STAT_CHECK_CONDITION ;
1290
1320
} else {
1291
- list_del_init (& cmd -> cmdr_queue_entry );
1292
-
1293
1321
idr_remove (& udev -> commands , id );
1294
1322
tcmu_free_cmd (cmd );
1295
1323
scsi_status = SAM_STAT_TASK_SET_FULL ;
1296
1324
}
1325
+ list_del_init (& cmd -> queue_entry );
1297
1326
1298
1327
pr_debug ("Timing out cmd %u on dev %s that is %s.\n" ,
1299
1328
id , udev -> name , is_running ? "inflight" : "queued" );
@@ -1372,7 +1401,8 @@ static struct se_device *tcmu_alloc_device(struct se_hba *hba, const char *name)
1372
1401
1373
1402
INIT_LIST_HEAD (& udev -> node );
1374
1403
INIT_LIST_HEAD (& udev -> timedout_entry );
1375
- INIT_LIST_HEAD (& udev -> cmdr_queue );
1404
+ INIT_LIST_HEAD (& udev -> qfull_queue );
1405
+ INIT_LIST_HEAD (& udev -> inflight_queue );
1376
1406
idr_init (& udev -> commands );
1377
1407
1378
1408
timer_setup (& udev -> qfull_timer , tcmu_qfull_timedout , 0 );
@@ -1383,23 +1413,23 @@ static struct se_device *tcmu_alloc_device(struct se_hba *hba, const char *name)
1383
1413
return & udev -> se_dev ;
1384
1414
}
1385
1415
1386
- static bool run_cmdr_queue (struct tcmu_dev * udev , bool fail )
1416
+ static bool run_qfull_queue (struct tcmu_dev * udev , bool fail )
1387
1417
{
1388
1418
struct tcmu_cmd * tcmu_cmd , * tmp_cmd ;
1389
1419
LIST_HEAD (cmds );
1390
1420
bool drained = true;
1391
1421
sense_reason_t scsi_ret ;
1392
1422
int ret ;
1393
1423
1394
- if (list_empty (& udev -> cmdr_queue ))
1424
+ if (list_empty (& udev -> qfull_queue ))
1395
1425
return true;
1396
1426
1397
1427
pr_debug ("running %s's cmdr queue forcefail %d\n" , udev -> name , fail );
1398
1428
1399
- list_splice_init (& udev -> cmdr_queue , & cmds );
1429
+ list_splice_init (& udev -> qfull_queue , & cmds );
1400
1430
1401
- list_for_each_entry_safe (tcmu_cmd , tmp_cmd , & cmds , cmdr_queue_entry ) {
1402
- list_del_init (& tcmu_cmd -> cmdr_queue_entry );
1431
+ list_for_each_entry_safe (tcmu_cmd , tmp_cmd , & cmds , queue_entry ) {
1432
+ list_del_init (& tcmu_cmd -> queue_entry );
1403
1433
1404
1434
pr_debug ("removing cmd %u on dev %s from queue\n" ,
1405
1435
tcmu_cmd -> cmd_id , udev -> name );
@@ -1437,14 +1467,13 @@ static bool run_cmdr_queue(struct tcmu_dev *udev, bool fail)
1437
1467
* cmd was requeued, so just put all cmds back in
1438
1468
* the queue
1439
1469
*/
1440
- list_splice_tail (& cmds , & udev -> cmdr_queue );
1470
+ list_splice_tail (& cmds , & udev -> qfull_queue );
1441
1471
drained = false;
1442
- goto done ;
1472
+ break ;
1443
1473
}
1444
1474
}
1445
- if (list_empty (& udev -> cmdr_queue ))
1446
- del_timer (& udev -> qfull_timer );
1447
- done :
1475
+
1476
+ tcmu_set_next_deadline (& udev -> qfull_queue , & udev -> qfull_timer );
1448
1477
return drained ;
1449
1478
}
1450
1479
@@ -1454,7 +1483,7 @@ static int tcmu_irqcontrol(struct uio_info *info, s32 irq_on)
1454
1483
1455
1484
mutex_lock (& udev -> cmdr_lock );
1456
1485
tcmu_handle_completions (udev );
1457
- run_cmdr_queue (udev , false);
1486
+ run_qfull_queue (udev , false);
1458
1487
mutex_unlock (& udev -> cmdr_lock );
1459
1488
1460
1489
return 0 ;
@@ -1982,7 +2011,7 @@ static void tcmu_block_dev(struct tcmu_dev *udev)
1982
2011
/* complete IO that has executed successfully */
1983
2012
tcmu_handle_completions (udev );
1984
2013
/* fail IO waiting to be queued */
1985
- run_cmdr_queue (udev , true);
2014
+ run_qfull_queue (udev , true);
1986
2015
1987
2016
unlock :
1988
2017
mutex_unlock (& udev -> cmdr_lock );
@@ -1997,7 +2026,7 @@ static void tcmu_reset_ring(struct tcmu_dev *udev, u8 err_level)
1997
2026
mutex_lock (& udev -> cmdr_lock );
1998
2027
1999
2028
idr_for_each_entry (& udev -> commands , cmd , i ) {
2000
- if (!list_empty ( & cmd -> cmdr_queue_entry ))
2029
+ if (!test_bit ( TCMU_CMD_BIT_INFLIGHT , & cmd -> flags ))
2001
2030
continue ;
2002
2031
2003
2032
pr_debug ("removing cmd %u on dev %s from ring (is expired %d)\n" ,
@@ -2006,6 +2035,7 @@ static void tcmu_reset_ring(struct tcmu_dev *udev, u8 err_level)
2006
2035
2007
2036
idr_remove (& udev -> commands , i );
2008
2037
if (!test_bit (TCMU_CMD_BIT_EXPIRED , & cmd -> flags )) {
2038
+ list_del_init (& cmd -> queue_entry );
2009
2039
if (err_level == 1 ) {
2010
2040
/*
2011
2041
* Userspace was not able to start the
@@ -2666,6 +2696,10 @@ static void check_timedout_devices(void)
2666
2696
2667
2697
mutex_lock (& udev -> cmdr_lock );
2668
2698
idr_for_each (& udev -> commands , tcmu_check_expired_cmd , NULL );
2699
+
2700
+ tcmu_set_next_deadline (& udev -> inflight_queue , & udev -> cmd_timer );
2701
+ tcmu_set_next_deadline (& udev -> qfull_queue , & udev -> qfull_timer );
2702
+
2669
2703
mutex_unlock (& udev -> cmdr_lock );
2670
2704
2671
2705
spin_lock_bh (& timed_out_udevs_lock );
0 commit comments