Sunday September 27, 2009 
Courtesy of a guest list place won via Suzanne Vega.com, my wife and I enjoyed Suzanne's live London gig last night.
The show was a part of the itunes live festival.
http://www.ituneslive.co.uk/suzannevega/
I've been a great fan of Suzanne's erudite lyrics and quirky vocal style since her first Album, Her latest Beauty and Crime is yet another classic example.

Having started the X.25 product, the associated IP over X.25 NIC was tested, then I started the D script and waited for all the DTrace probes to be established. It was time to gather the data, by stopping the IP over X.25 device.
#!/usr/sbin/dtrace -s
inline int M_IOCTL = 0x0e; /* ioctl; set/get params */
inline int M_IOCACK = 0x81; /* acknowledge ioctl */
inline int M_IOCNAK = 0x82; /* negative ioctl acknowledge */
fbt::strdoioctl:entry
/ execname == "x25netd" / /* All Streams ioctls sent by x25netd */
{
/* Separator */
printf("\n");
}
fbt::strdoioctl:entry
/ execname == "x25netd" / /* All Streams ioctls sent by x25netd */
{
icp = (struct strioctl *) arg1;
printf("IOCTL %d (0x%x), length %d", icp->ic_cmd, icp->ic_cmd, icp->ic_len);
}
fbt::strdoioctl:return
/ execname == "x25netd" / /* Return code in arg1 */
{
printf("RETURN=%d errno=%d pid=%d", arg1, errno, pid);
}
fbt::munlink:return
/ execname == "x25netd" / /* munlink() returns?? */
{
printf("RETURN=%d errno=%d pid=%d", arg1, errno, pid);
}
fbt::putiocd:return
/ execname == "x25netd" /
{
printf("RETURN=%d errno=%d pid=%d", arg1, errno, pid);
}
fbt::putnext:entry
/ execname == "x25netd" && (((mblk_t *) arg1)->b_datap->db_type == M_IOCTL)/
{
iocp = (struct iocblk *) ((mblk_t *) arg1)->b_rptr;
printf(" putnext msg from: %s:: M_IOCTL ioctl %d (0x%x) count %d",
(stringof((queue_t *) arg0)->q_qinfo->qi_minfo->mi_idname),
iocp->ioc_cmd, iocp->ioc_cmd, iocp->ioc_count);
}
fbt::putnext:entry
/ execname == "x25netd" && (((mblk_t *) arg1)->b_datap->db_type == M_IOCACK)/
{
iocp = (struct iocblk *) ((mblk_t *) arg1)->b_rptr;
printf(" putnext msg from: %s:: M_IOCACK ioctl %d (0x%x) count %d",
(stringof((queue_t *) arg0)->q_qinfo->qi_minfo->mi_idname),
iocp->ioc_cmd, iocp->ioc_cmd, iocp->ioc_count);
}
fbt::putnext:entry
/ execname == "x25netd" && (((mblk_t *) arg1)->b_datap->db_type == M_IOCNAK)/
{
iocp = (struct iocblk *) ((mblk_t *) arg1)->b_rptr;
printf(" putnext msg from: %s:: M_IOCNAK ioctl %d (0x%x) count %d",
(stringof((queue_t *) arg0)->q_qinfo->qi_minfo->mi_idname),
iocp->ioc_cmd, iocp->ioc_cmd, iocp->ioc_count);
}
fbt::strgeterr:return
/ execname == "x25netd" /
{
printf("RETURN=%d errno=%d pid=%d", arg1, errno, pid);
}
fbt:ixe:ixewput:entry /* What M_IOCTLs arrive in ixe */
/ execname == "x25netd" && ((mblk_t *) arg1)->b_datap->db_type == M_IOCTL /
{
iocp = (struct iocblk *) ((mblk_t *) arg1)->b_rptr;
printf(" ixe M_IOCTL %d (0x%x) received, count %d", iocp->ioc_cmd,
iocp->ioc_cmd, iocp->ioc_count);
}
0 13220 strdoioctl:entryFrom this it was apparent that the munlink was actually SUCCEEDING, but that the I_UNLINK ioctl was being NAK'ed by the IP module and never reaching the ixe driver.
0 13220 strdoioctl:entry IOCTL 21261 (0x530d), length 24
0 11497 putiocd:return RETURN=0 errno=0 pid=1763
0 3511 putnext:entry putnext msg from: strwhead:: M_IOCTL ioctl 21261 (0x530d) count 24
0 3511 putnext:entry putnext msg from: ip:: M_IOCNAK ioctl 21261 (0x530d) count 0
0 13221 strdoioctl:return RETURN=22 errno=0 pid=1763
0 9815 munlink:return RETURN=0 errno=0 pid=1763
error = strdoioctl(stp, &strioc, NULL, FNATIVE,This allowed code later in munlink() to destroy the Streams linkage despite the failure of the ioctl. The special case doesn't seem like a good idea, however the root cause of this problem is elsewhere.
K_TO_K | STR_NOERROR | STR_NOSIG, crp, rvalp);
/*
* If there was an error and this is not called via strclose,
* return to the user. Otherwise, pretend there was no error
* and close the link.
*/
if (error) {
if (flag & LINKCLOSE) {
cmn_err(CE_WARN, "KERNEL: munlink: could not perform "
"unlink ioctl, closing anyway (%d)\n", error);
} else {
link_rempassthru(passq);
mutex_enter(&stpdown->sd_lock);
stpdown->sd_flag &= ~STRPLUMB;
cv_broadcast(&stpdown->sd_monitor);
mutex_exit(&stpdown->sd_lock);
mutex_exit(&muxifier);
return (error);
}
}
An Australian born and raised European compu-nomad, I've found my way to the U.K. this last year, following a five year stint in France.
A hardware engineer by training, with a background servicing digital radar for the Australian Airforce, I did some mainframe CE and data communications work, as well as chip and transistor changing, before joining Sun in December 1987.
Sun is the only kind of envoronment I can survive for that long, I'm not generally one to stay in any place longer that 5 years, but in Sun I've swapped roles every 4 years or so, and pretty much picked and chosen what I want to do and when. (Recessions and burst bubbles aside the choice of time and place has been mine).
So having done hardware, training, people management and tech management in Australia I chose to go to France in a software sustaining role on Streams based data comminications products.
Two main factors drove that decision, providing an education money can't buy for my then 2 year old daughter, and filling that little hole in my CV around C code. While in France I ran several trainings in Sparc crash dump analysis and did some little dabbling back in technology management.
That much aside, welcome to my blog. I plan to update on what I'm working on
occasionally
, along with a little home spun philosophy.