summaryrefslogtreecommitdiffstats
path: root/sys/i4b/driver/i4b_trace.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/i4b/driver/i4b_trace.c')
-rw-r--r--sys/i4b/driver/i4b_trace.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/sys/i4b/driver/i4b_trace.c b/sys/i4b/driver/i4b_trace.c
index 0d10771..ff29c01 100644
--- a/sys/i4b/driver/i4b_trace.c
+++ b/sys/i4b/driver/i4b_trace.c
@@ -245,6 +245,7 @@ i4btrcattach()
#endif
#endif
trace_queue[i].ifq_maxlen = IFQ_MAXLEN;
+ mtx_init(&trace_queue[i].ifq_mtx, "i4b_trace", MTX_DEF);
device_state[i] = ST_IDLE;
}
}
@@ -317,12 +318,13 @@ get_trace_data_from_l1(i4b_trace_hdr_t *hdr, int len, char *buf)
unit = outunit;
}
- if(IF_QFULL(&trace_queue[unit]))
+ IF_LOCK(&trace_queue[unit]);
+ if(_IF_QFULL(&trace_queue[unit]))
{
struct mbuf *m1;
x = SPLI4B();
- IF_DEQUEUE(&trace_queue[unit], m1);
+ _IF_DEQUEUE(&trace_queue[unit], m1);
splx(x);
i4b_Bfreembuf(m1);
@@ -339,7 +341,8 @@ get_trace_data_from_l1(i4b_trace_hdr_t *hdr, int len, char *buf)
x = SPLI4B();
- IF_ENQUEUE(&trace_queue[unit], m);
+ _IF_ENQUEUE(&trace_queue[unit], m);
+ IF_UNLOCK(&trace_queue[unit]);
if(device_state[unit] & ST_WAITDATA)
{
@@ -441,21 +444,25 @@ i4btrcread(dev_t dev, struct uio * uio, int ioflag)
x = SPLI4B();
+ IF_LOCK(&trace_queue[unit]);
while(IF_QEMPTY(&trace_queue[unit]) && (device_state[unit] & ST_ISOPEN))
{
device_state[unit] |= ST_WAITDATA;
- if((error = tsleep((caddr_t) &trace_queue[unit],
+ if((error = msleep((caddr_t) &trace_queue[unit],
+ &trace_queue[unit].ifq_mtx,
TTIPRI | PCATCH,
"bitrc", 0 )) != 0)
{
device_state[unit] &= ~ST_WAITDATA;
+ IF_UNLOCK(&trace_queue[unit]);
splx(x);
return(error);
}
}
- IF_DEQUEUE(&trace_queue[unit], m);
+ _IF_DEQUEUE(&trace_queue[unit], m);
+ IF_UNLOCK(&trace_queue[unit]);
if(m && m->m_len)
error = uiomove(m->m_data, m->m_len, uio);
OpenPOWER on IntegriCloud