diff options
-rw-r--r-- | drivers/s390/scsi/zfcp_dbf.c | 51 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_def.h | 12 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_erp.c | 9 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_ext.h | 3 |
4 files changed, 75 insertions, 0 deletions
diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c index e7712eb13ee..5a4b1e9a8b5 100644 --- a/drivers/s390/scsi/zfcp_dbf.c +++ b/drivers/s390/scsi/zfcp_dbf.c | |||
@@ -521,9 +521,19 @@ static struct debug_view zfcp_hba_dbf_view = { | |||
521 | }; | 521 | }; |
522 | 522 | ||
523 | static const char *zfcp_rec_dbf_tags[] = { | 523 | static const char *zfcp_rec_dbf_tags[] = { |
524 | [ZFCP_REC_DBF_ID_THREAD] = "thread", | ||
524 | }; | 525 | }; |
525 | 526 | ||
526 | static const char *zfcp_rec_dbf_ids[] = { | 527 | static const char *zfcp_rec_dbf_ids[] = { |
528 | [1] = "new", | ||
529 | [2] = "ready", | ||
530 | [3] = "kill", | ||
531 | [4] = "down sleep", | ||
532 | [5] = "down wakeup", | ||
533 | [6] = "down sleep ecd", | ||
534 | [7] = "down wakeup ecd", | ||
535 | [8] = "down sleep epd", | ||
536 | [9] = "down wakeup epd", | ||
527 | }; | 537 | }; |
528 | 538 | ||
529 | static int zfcp_rec_dbf_view_format(debug_info_t *id, struct debug_view *view, | 539 | static int zfcp_rec_dbf_view_format(debug_info_t *id, struct debug_view *view, |
@@ -536,6 +546,12 @@ static int zfcp_rec_dbf_view_format(debug_info_t *id, struct debug_view *view, | |||
536 | zfcp_dbf_outs(&p, "hint", zfcp_rec_dbf_ids[r->id2]); | 546 | zfcp_dbf_outs(&p, "hint", zfcp_rec_dbf_ids[r->id2]); |
537 | zfcp_dbf_out(&p, "id", "%d", r->id2); | 547 | zfcp_dbf_out(&p, "id", "%d", r->id2); |
538 | switch (r->id) { | 548 | switch (r->id) { |
549 | case ZFCP_REC_DBF_ID_THREAD: | ||
550 | zfcp_dbf_out(&p, "sema", "%d", r->u.thread.sema); | ||
551 | zfcp_dbf_out(&p, "total", "%d", r->u.thread.total); | ||
552 | zfcp_dbf_out(&p, "ready", "%d", r->u.thread.ready); | ||
553 | zfcp_dbf_out(&p, "running", "%d", r->u.thread.running); | ||
554 | break; | ||
539 | } | 555 | } |
540 | sprintf(p, "\n"); | 556 | sprintf(p, "\n"); |
541 | return (p - buf) + 1; | 557 | return (p - buf) + 1; |
@@ -550,6 +566,41 @@ static struct debug_view zfcp_rec_dbf_view = { | |||
550 | NULL | 566 | NULL |
551 | }; | 567 | }; |
552 | 568 | ||
569 | /** | ||
570 | * zfcp_rec_dbf_event_thread - trace event related to recovery thread operation | ||
571 | * @id2: identifier for event | ||
572 | * @adapter: adapter | ||
573 | * @lock: non-zero value indicates that erp_lock has not yet been acquired | ||
574 | */ | ||
575 | void zfcp_rec_dbf_event_thread(u8 id2, struct zfcp_adapter *adapter, int lock) | ||
576 | { | ||
577 | struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf; | ||
578 | unsigned long flags = 0; | ||
579 | struct list_head *entry; | ||
580 | unsigned ready = 0, running = 0, total; | ||
581 | |||
582 | if (lock) | ||
583 | read_lock_irqsave(&adapter->erp_lock, flags); | ||
584 | list_for_each(entry, &adapter->erp_ready_head) | ||
585 | ready++; | ||
586 | list_for_each(entry, &adapter->erp_running_head) | ||
587 | running++; | ||
588 | total = adapter->erp_total_count; | ||
589 | if (lock) | ||
590 | read_unlock_irqrestore(&adapter->erp_lock, flags); | ||
591 | |||
592 | spin_lock_irqsave(&adapter->rec_dbf_lock, flags); | ||
593 | memset(r, 0, sizeof(*r)); | ||
594 | r->id = ZFCP_REC_DBF_ID_THREAD; | ||
595 | r->id2 = id2; | ||
596 | r->u.thread.sema = atomic_read(&adapter->erp_ready_sem.count); | ||
597 | r->u.thread.total = total; | ||
598 | r->u.thread.ready = ready; | ||
599 | r->u.thread.running = running; | ||
600 | debug_event(adapter->rec_dbf, 5, r, sizeof(*r)); | ||
601 | spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags); | ||
602 | } | ||
603 | |||
553 | static void | 604 | static void |
554 | _zfcp_san_dbf_event_common_ct(const char *tag, struct zfcp_fsf_req *fsf_req, | 605 | _zfcp_san_dbf_event_common_ct(const char *tag, struct zfcp_fsf_req *fsf_req, |
555 | u32 s_id, u32 d_id, void *buffer, int buflen) | 606 | u32 s_id, u32 d_id, void *buffer, int buflen) |
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index f29bee52848..332c83eba6c 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h | |||
@@ -279,13 +279,25 @@ struct zfcp_erp_dbf_record { | |||
279 | u8 dummy[16]; | 279 | u8 dummy[16]; |
280 | } __attribute__ ((packed)); | 280 | } __attribute__ ((packed)); |
281 | 281 | ||
282 | struct zfcp_rec_dbf_record_thread { | ||
283 | u32 sema; | ||
284 | u32 total; | ||
285 | u32 ready; | ||
286 | u32 running; | ||
287 | } __attribute__ ((packed)); | ||
288 | |||
282 | struct zfcp_rec_dbf_record { | 289 | struct zfcp_rec_dbf_record { |
283 | u8 id; | 290 | u8 id; |
284 | u8 id2; | 291 | u8 id2; |
285 | union { | 292 | union { |
293 | struct zfcp_rec_dbf_record_thread thread; | ||
286 | } u; | 294 | } u; |
287 | } __attribute__ ((packed)); | 295 | } __attribute__ ((packed)); |
288 | 296 | ||
297 | enum { | ||
298 | ZFCP_REC_DBF_ID_THREAD, | ||
299 | }; | ||
300 | |||
289 | struct zfcp_hba_dbf_record_response { | 301 | struct zfcp_hba_dbf_record_response { |
290 | u32 fsf_command; | 302 | u32 fsf_command; |
291 | u64 fsf_reqid; | 303 | u64 fsf_reqid; |
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index 2dc8110ebf7..f9383f06816 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
@@ -788,6 +788,7 @@ zfcp_erp_action_ready(struct zfcp_erp_action *erp_action) | |||
788 | 788 | ||
789 | zfcp_erp_action_to_ready(erp_action); | 789 | zfcp_erp_action_to_ready(erp_action); |
790 | up(&adapter->erp_ready_sem); | 790 | up(&adapter->erp_ready_sem); |
791 | zfcp_rec_dbf_event_thread(2, adapter, 0); | ||
791 | } | 792 | } |
792 | 793 | ||
793 | /* | 794 | /* |
@@ -1027,6 +1028,7 @@ zfcp_erp_thread_kill(struct zfcp_adapter *adapter) | |||
1027 | 1028 | ||
1028 | atomic_set_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL, &adapter->status); | 1029 | atomic_set_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL, &adapter->status); |
1029 | up(&adapter->erp_ready_sem); | 1030 | up(&adapter->erp_ready_sem); |
1031 | zfcp_rec_dbf_event_thread(2, adapter, 1); | ||
1030 | 1032 | ||
1031 | wait_event(adapter->erp_thread_wqh, | 1033 | wait_event(adapter->erp_thread_wqh, |
1032 | !atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, | 1034 | !atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, |
@@ -1084,7 +1086,9 @@ zfcp_erp_thread(void *data) | |||
1084 | * no action in 'ready' queue to be processed and | 1086 | * no action in 'ready' queue to be processed and |
1085 | * thread is not to be killed | 1087 | * thread is not to be killed |
1086 | */ | 1088 | */ |
1089 | zfcp_rec_dbf_event_thread(4, adapter, 1); | ||
1087 | down_interruptible(&adapter->erp_ready_sem); | 1090 | down_interruptible(&adapter->erp_ready_sem); |
1091 | zfcp_rec_dbf_event_thread(5, adapter, 1); | ||
1088 | debug_text_event(adapter->erp_dbf, 5, "a_th_woken"); | 1092 | debug_text_event(adapter->erp_dbf, 5, "a_th_woken"); |
1089 | } | 1093 | } |
1090 | 1094 | ||
@@ -2150,7 +2154,9 @@ zfcp_erp_adapter_strategy_open_fsf_xconfig(struct zfcp_erp_action *erp_action) | |||
2150 | * _must_ be the one belonging to the 'exchange config | 2154 | * _must_ be the one belonging to the 'exchange config |
2151 | * data' request. | 2155 | * data' request. |
2152 | */ | 2156 | */ |
2157 | zfcp_rec_dbf_event_thread(6, adapter, 1); | ||
2153 | down(&adapter->erp_ready_sem); | 2158 | down(&adapter->erp_ready_sem); |
2159 | zfcp_rec_dbf_event_thread(7, adapter, 1); | ||
2154 | if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) { | 2160 | if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) { |
2155 | ZFCP_LOG_INFO("error: exchange of configuration data " | 2161 | ZFCP_LOG_INFO("error: exchange of configuration data " |
2156 | "for adapter %s timed out\n", | 2162 | "for adapter %s timed out\n", |
@@ -2207,7 +2213,9 @@ zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *erp_action) | |||
2207 | debug_text_event(adapter->erp_dbf, 6, "a_xport_ok"); | 2213 | debug_text_event(adapter->erp_dbf, 6, "a_xport_ok"); |
2208 | 2214 | ||
2209 | ret = ZFCP_ERP_SUCCEEDED; | 2215 | ret = ZFCP_ERP_SUCCEEDED; |
2216 | zfcp_rec_dbf_event_thread(8, adapter, 1); | ||
2210 | down(&adapter->erp_ready_sem); | 2217 | down(&adapter->erp_ready_sem); |
2218 | zfcp_rec_dbf_event_thread(9, adapter, 1); | ||
2211 | if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) { | 2219 | if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) { |
2212 | ZFCP_LOG_INFO("error: exchange port data timed out (adapter " | 2220 | ZFCP_LOG_INFO("error: exchange port data timed out (adapter " |
2213 | "%s)\n", zfcp_get_busid_by_adapter(adapter)); | 2221 | "%s)\n", zfcp_get_busid_by_adapter(adapter)); |
@@ -3091,6 +3099,7 @@ zfcp_erp_action_enqueue(int action, | |||
3091 | /* finally put it into 'ready' queue and kick erp thread */ | 3099 | /* finally put it into 'ready' queue and kick erp thread */ |
3092 | list_add_tail(&erp_action->list, &adapter->erp_ready_head); | 3100 | list_add_tail(&erp_action->list, &adapter->erp_ready_head); |
3093 | up(&adapter->erp_ready_sem); | 3101 | up(&adapter->erp_ready_sem); |
3102 | zfcp_rec_dbf_event_thread(1, adapter, 0); | ||
3094 | retval = 0; | 3103 | retval = 0; |
3095 | out: | 3104 | out: |
3096 | return retval; | 3105 | return retval; |
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index 06b1079b7f3..f64951ba98c 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h | |||
@@ -164,6 +164,9 @@ extern void zfcp_erp_port_access_changed(struct zfcp_port *); | |||
164 | extern void zfcp_erp_unit_access_changed(struct zfcp_unit *); | 164 | extern void zfcp_erp_unit_access_changed(struct zfcp_unit *); |
165 | 165 | ||
166 | /******************************** AUX ****************************************/ | 166 | /******************************** AUX ****************************************/ |
167 | extern void zfcp_rec_dbf_event_thread(u8 id, struct zfcp_adapter *adapter, | ||
168 | int lock); | ||
169 | |||
167 | extern void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *); | 170 | extern void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *); |
168 | extern void zfcp_hba_dbf_event_fsf_unsol(const char *, struct zfcp_adapter *, | 171 | extern void zfcp_hba_dbf_event_fsf_unsol(const char *, struct zfcp_adapter *, |
169 | struct fsf_status_read_buffer *); | 172 | struct fsf_status_read_buffer *); |