diff options
| author | peter dunlap <Peter.Dunlap@Sun.COM> | 2009-11-20 10:19:25 -0700 |
|---|---|---|
| committer | peter dunlap <Peter.Dunlap@Sun.COM> | 2009-11-20 10:19:25 -0700 |
| commit | e617f2142235c62bb299718a60e6d2f79b6f472f (patch) | |
| tree | cf1870585debd3a0c1aea3e4285ce1699524d865 /usr/src | |
| parent | 188e166434dcdde5356d87fb06c169f15dc4dca9 (diff) | |
| download | illumos-joyent-e617f2142235c62bb299718a60e6d2f79b6f472f.tar.gz | |
6901972 recursive mutex enter from pppt_tgt_offline()
Diffstat (limited to 'usr/src')
| -rw-r--r-- | usr/src/uts/common/io/comstar/port/pppt/pppt.c | 11 | ||||
| -rw-r--r-- | usr/src/uts/common/io/comstar/port/pppt/pppt_tgt.c | 32 |
2 files changed, 28 insertions, 15 deletions
diff --git a/usr/src/uts/common/io/comstar/port/pppt/pppt.c b/usr/src/uts/common/io/comstar/port/pppt/pppt.c index 1fd99f8bcc..82094a9625 100644 --- a/usr/src/uts/common/io/comstar/port/pppt/pppt.c +++ b/usr/src/uts/common/io/comstar/port/pppt/pppt.c @@ -34,6 +34,7 @@ #include <sys/sysmacros.h> #include <sys/nvpair.h> #include <sys/door.h> +#include <sys/sdt.h> #include <sys/stmf.h> #include <sys/stmf_ioctl.h> @@ -1058,7 +1059,7 @@ pppt_sess_lookup_create(scsi_devid_desc_t *lport_devid, avl_add(&pppt_global.global_sess_list, ps); mutex_exit(&tgt->target_mutex); PPPT_GLOBAL_UNLOCK(); - PPPT_LOG(CE_NOTE, "New session %p", (void *)ps); + stmf_trace("pppt", "New session %p", (void *)ps); return (ps); } @@ -1086,7 +1087,7 @@ static void pppt_sess_destroy_task(void *ps_void) pppt_sess_t *ps = ps_void; stmf_scsi_session_t *ss; - PPPT_LOG(CE_NOTE, "Session destroy task %p", (void *)ps); + stmf_trace("pppt", "Session destroy task %p", (void *)ps); ss = ps->ps_stmf_sess; mutex_enter(&ps->ps_mutex); @@ -1101,7 +1102,7 @@ static void pppt_sess_destroy_task(void *ps_void) stmf_free(ps->ps_stmf_sess); kmem_free(ps, sizeof (*ps)); - PPPT_LOG(CE_NOTE, "Session destroy task complete %p", (void *)ps); + stmf_trace("pppt", "Session destroy task complete %p", (void *)ps); } int @@ -1170,7 +1171,7 @@ pppt_sess_close_locked(pppt_sess_t *ps) pppt_tgt_t *tgt = ps->ps_target; pppt_task_t *ptask; - PPPT_LOG(CE_NOTE, "Session close %p", (void *)ps); + stmf_trace("pppt", "Session close %p", (void *)ps); ASSERT(mutex_owned(&pppt_global.global_lock)); ASSERT(mutex_owned(&tgt->target_mutex)); @@ -1201,7 +1202,7 @@ pppt_sess_close_locked(pppt_sess_t *ps) (void) taskq_dispatch(pppt_global.global_sess_taskq, &pppt_sess_destroy_task, ps, KM_SLEEP); - PPPT_LOG(CE_NOTE, "Session close complete %p", (void *)ps); + stmf_trace("pppt", "Session close complete %p", (void *)ps); } pppt_task_t * diff --git a/usr/src/uts/common/io/comstar/port/pppt/pppt_tgt.c b/usr/src/uts/common/io/comstar/port/pppt/pppt_tgt.c index fbc9707b61..60408027dc 100644 --- a/usr/src/uts/common/io/comstar/port/pppt/pppt_tgt.c +++ b/usr/src/uts/common/io/comstar/port/pppt/pppt_tgt.c @@ -92,6 +92,9 @@ static void tgt_sm_deleting(pppt_tgt_t *tgt, tgt_event_ctx_t *ctx); static void +pppt_tgt_offline_task(void *arg); + +static void pppt_tgt_dereg_retry(void *arg); static void @@ -295,6 +298,12 @@ tgt_sm_event_locked(pppt_tgt_t *tgt, pppt_tgt_event_t event) { tgt_event_ctx_t *ctx; + event = (event < TE_MAX_EVENT) ? event : TE_UNDEFINED; + DTRACE_PROBE2(pppt__tgt__event, pppt_tgt_t *, tgt, + pppt_tgt_event_t, event); + stmf_trace("pppt", "pppt_tgt_event: tgt %p event %s(%d)", + (void *)tgt, pppt_te_name[event], event); + tgt->target_refcount++; ctx = kmem_zalloc(sizeof (*ctx), KM_SLEEP); @@ -329,10 +338,7 @@ tgt_sm_event_locked(pppt_tgt_t *tgt, pppt_tgt_event_t event) static void tgt_sm_event_dispatch(pppt_tgt_t *tgt, tgt_event_ctx_t *ctx) { - DTRACE_PROBE2(pppt__tgt__event, pppt_tgt_t *, tgt, - tgt_event_ctx_t *, ctx); - - PPPT_LOG(CE_NOTE, "tgt_sm_event_dispatch: tgt %p event %s(%d)", + stmf_trace("pppt", "pppt_tgt_event_dispatch: tgt %p event %s(%d)", (void *)tgt, pppt_te_name[ctx->te_ctx_event], ctx->te_ctx_event); /* State independent actions */ @@ -747,21 +753,26 @@ tgt_sm_deleting(pppt_tgt_t *tgt, tgt_event_ctx_t *ctx) } static void -pppt_tgt_offline(void *arg) +pppt_tgt_offline(pppt_tgt_t *tgt) +{ + (void) taskq_dispatch(pppt_global.global_dispatch_taskq, + pppt_tgt_offline_task, tgt, KM_SLEEP); +} + +static void +pppt_tgt_offline_task(void *arg) { pppt_tgt_t *tgt = arg; pppt_sess_t *ps, *next_ps; stmf_change_status_t scs; - PPPT_LOG(CE_NOTE, "pppt_tgt_offline %p", (void *)tgt); + stmf_trace("pppt", "pppt_tgt_offline %p", (void *)tgt); PPPT_GLOBAL_LOCK(); mutex_enter(&tgt->target_mutex); for (ps = avl_first(&tgt->target_sess_list); ps != NULL; ps = next_ps) { next_ps = AVL_NEXT(&tgt->target_sess_list, ps); mutex_enter(&ps->ps_mutex); - PPPT_LOG(CE_NOTE, "pppt_tgt_offline closing session %p(%d)", - (void *)ps, ps->ps_closed); if (!ps->ps_closed) { pppt_sess_close_locked(ps); } @@ -777,7 +788,7 @@ pppt_tgt_offline(void *arg) (void) stmf_ctl(STMF_CMD_LPORT_OFFLINE_COMPLETE, tgt->target_stmf_lport, &scs); - PPPT_LOG(CE_NOTE, "pppt_tgt_offline complete %p", (void *)tgt); + stmf_trace("pppt", "pppt_tgt_offline complete %p", (void *)tgt); } static void @@ -829,7 +840,8 @@ tgt_sm_new_state(pppt_tgt_t *tgt, tgt_event_ctx_t *ctx, new_state = (new_state < TS_MAX_STATE) ? new_state : TS_UNDEFINED; - PPPT_LOG(CE_NOTE, "tgt_sm_new_state: tgt %p, %s(%d) --> %s(%d)\n", + stmf_trace("pppt", "pppt_target_state_change: " + "tgt %p, %s(%d) --> %s(%d)\n", (void *) tgt, pppt_ts_name[tgt->target_state], tgt->target_state, pppt_ts_name[new_state], new_state); DTRACE_PROBE3(pppt__target__state__change, |
