summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorpeter dunlap <Peter.Dunlap@Sun.COM>2009-11-20 10:19:25 -0700
committerpeter dunlap <Peter.Dunlap@Sun.COM>2009-11-20 10:19:25 -0700
commite617f2142235c62bb299718a60e6d2f79b6f472f (patch)
treecf1870585debd3a0c1aea3e4285ce1699524d865 /usr/src
parent188e166434dcdde5356d87fb06c169f15dc4dca9 (diff)
downloadillumos-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.c11
-rw-r--r--usr/src/uts/common/io/comstar/port/pppt/pppt_tgt.c32
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,