{anchor:top}
h1. {anchor:CHP-srp} {{srp}} Provider
The {{srp}} provider provides probes for tracing srp port provider activity.
This is a kernel provider built into the COMSTAR srp target port provider.
h2. {anchor:CHP-srp-Probes} Probes
h3. {anchor:CHP-srp-Probes-Overview} Probes Overview
|| SRP events Event || Probes ||
| Service up/down | {{srp:::service-up{}}}, {{{}srp:::service-down}} |
| Remote Port login/logout | {{srp:::login-command}}, {{srp:::login-response}}, {{srp:::logout-command}} |
| SRP command/response | {{srp:::task-command}}, {{srp:::task-response}} |
| SCSI command/response | {{srp:::scsi-command}}, {{srp:::scsi-response}} |
| Data transfer | {{srp:::xfer-start}}, {{srp:::xfer-done}} |
For all of the providers below, string fields which are not known contain the string "<unknown>". Integer fields which are not known contain 0.
[Top|#top]
h3. {anchor:CHP-srp-Service-Event-Probes} Service up/down Event Probes
{{srp:::service-up{}}} and {{{}srp:::service-down}} trace SRP target online and offline events.
Remote port information ({{ci_remote}}) is unavailable for both probes.
|| Probes || Variable || Type || Description ||
|srp:::service-up
srp:::service-down | {{args\[0\]}} | {{conninfo_t *}} | connection information |
|srp:::service-up
srp:::service-down | {{args\[1\]}} | {{srp_portinfo_t *}} | local and remote port information |
h3. {anchor:CHP-srp-Login-Logout-Event-Probes} Remote Port Login/Logout Event Probes
|| Probes || Variable || Type || Description ||
| srp:::login-command
srp:::login-response
srp:::logout-command | {{args\[0\]}} | {{conninfo_t *}} | connection information |
|srp:::login-command
srp:::login-response
srp:::logout-command | {{args\[1\]}} | {{srp_portinfo_t *}} | local and remote port information |
|srp:::login-command
srp:::login-response | {{args\[2\]}} | {{srp_logininfo_t *}} | login command/response information |
[Top|#top]
h3. {anchor:CHP-srp-task-Command-Event-Probes} SRP Command Event Probes
|| Probes || Variable || Type || Description ||
| srp:::task-command
srp:::task-response | {{args\[0\]}} | {{conninfo_t *}} | connection information |
| srp:::task-command
srp:::task-response | {{args\[1\]}} | {{srp_portinfo_t *}} | local and remote port info |
| srp:::scsi-response
srp:::scsi-command| {{args\[2\]}} | {{srp_taskinfo_t *}} | srp task information |
[Top|#top]
h3. {anchor:CHP-srp-SCSI-Command-Event-Probes} SCSI Command Event Probes
|| Probes || Variable || Type || Description ||
| srp:::scsi-command
srp:::scsi-response | {{args\[0\]}} | {{conninfo_t *}} | connection information |
| srp:::scsi-command
srp:::scsi-response | {{args\[1\]}} | {{srp_portinfo_t *}} | local and remote port info |
| srp:::scsi-command | {{args\[2\]}} | {{scsicmd_t *}} | SCSI command block (cdb) |
| srp:::scsi-response | {{args\[2\]}} | {{srp_taskinfo_t *}} | srp task information |
| srp:::scsi-command| {{args\[3\]}} | {{srp_taskinfo_t *}} | srp task information |
[Top|#top]
h3. {anchor:CHP-srp-Data-Transfer-Probes} Data Transfer Probes
|| Probes || Variable || Type || Description ||
| srp:::xfer-start
srp:::xfer-done | {{args\[0\]}} | {{conninfo_t *}} | connection information |
| srp:::xfer-start
srp:::xfer-done | {{args\[1\]}} | {{fc_port_info_t *}} | local port information |
| srp:::xfer-start
srp:::xfer-done | {{args\[2\]}} | {{xferinfo_t *}} | RDMA transfer information |
| srp:::xfer-start
srp:::xfer-done | {{args\[3\]}} | {{srp_taskinfo_t *}} | srp task information |
[Top|#top]
h2. {anchor:CHP-fc-Types} Types
{info:title=Common types}
{{scsicmd_t}}, {{conninfo_t}} and {{xferinfo_t}} are common types which are used by other providers.
{info}
{{scsicmd_t}}
{noformat}
typedef struct scsicmd {
uint64_t ic_len; /* CDB length */
uint8_t *ic_cdb; /* CDB data */
} scsicmd_t;
{noformat}
{{conninfo_t}}
{noformat}
typedef struct conninfo {
string ci_local; /* GID of the local HCA */
string ci_remote; /* GID of the remote HCA */
string ci_protocol; /* protocol ("ib") */
} conninfo_t;
{noformat}
{{srp_portinfo_t}}
{noformat}
typedef struct srp_portinfo {
/* initiator */
string pi_initiator; /* Initiator: eui.xxxxxxxxxxxxxxx */
string pi_i_sid; /* Initiator seiion id */
/* target */
string pi_target; /* Target: eui.xxxxxxxxxxxxxxx */
string pi_t_sid; /* Target session id */
uintptr_t pi_chan_id; /* Channel identifier */
} srp_portinfo_t;
{noformat}
{{srp_logininfo_t}}
{noformat}
typedef struct srp_logininfo {
uint64_t li_task_tag; /* SRP task tag */
uint32_t li_max_it_iu_len; /* Maxium iu length that initiator can
send to target */
uint32_t li_max_ti_iu_len; /* Maxium iu length that target can
send to initiator */
uint32_t li_request_limit; /* Maximun number of SRP requests
that initiator can send on a channel */
uint32_t reason_code; /* Reason code */
} srp_logininfo_t;
{noformat}
{{srp_taskinfo_t}}
{noformat}
typedef struct srp_taskinfo {
uint64_t ti_task_tag; /* SRP task tag */
uint64_t ti_lun; /* Target logical unit number */
uint8_t ti_function; /* Task management function */
uint32_t ti_req_limit_delta; /* Increment of channel's request limit */
uint8_t ti_flag; /* bit 2:DOOVER 3:DOUNDER 4:DIOVER 5:DIUNDER */
uint32_t ti_do_resid_cnt; /* Data-out residual count */
uint32_t ti_di_resid_cnt; /* Data-in residual count */
uint8_t ti_status; /* Status of this task */
} srp_taskinfo_t;
{noformat}
{{xferinfo_t}}
{noformat}
typedef struct xferinfo {
uintptr_t xfer_laddr; /* Local buffer address */
uint32_t xfer_loffset; /* Relative offset from local buffer */
uint32_t xfer_lkey; /* Access control to local memory */
uintptr_t xfer_raddr; /* Remote virtual address */
uint32_t xfer_roffset; /* Offset from the remote address */
uint32_t xfer_rkey; /* Access control to remote address */
uint32_t xfer_len; /* Transfer length */
uint8_t xfer_type; /* 0: read; 1: write; */
} xferinfo_t;
{noformat}
[Top|#top]
h2. {anchor:CHP-fc-Examples} Examples
h6. service.d
This is a simple script to produce a report of target online/offline evenets.
{noformat}
#!/usr/sbin/dtrace -s
#pragma D option quiet
dtrace:::BEGIN
{
printf("Tracing... Hit Ctrl-C to end.\n\n");
printf("%-14s %-35s %-20s\n", "SRP EVENT", "LOCAL PORT", "EUI NAME");
};
srp:::service-up
{
printf("%-14s %-35s %-20s\n", probename, args[0]->ci_local, args[1]->pi_target);
}
srp:::service-down
{
printf("%-14s %-35s %-20s\n", probename, args[0]->ci_local, args[1]->pi_target);
}
{noformat}
This output shows the host and the number of iSCSI operations:
{noformat}
thump1## dtrace -s ~/src/service.d
Tracing... Hit Ctrl-C to end.
^C
SRP EVENT LOCAL PORT EUI NAME
service-down fe80000000000000:0003ba0001004d31 eui.0003BA0001004D30
service-down fe80000000000000:0003ba0001004d32 eui.0003BA0001004D30
service-up fe80000000000000:0003ba0001004d31 eui.0003BA0001004D30
service-up fe80000000000000:0003ba0001004d32 eui.0003BA0001004D30
thump1##
{noformat}
The fields are:
|| field || description ||
| {{SRP EVENT}} | srp event type |
| {{LOCAL PORT}} | GID of the local port |
| {{EUI NAME}} | EUI name of the local port|
h6. srpwho.d
This is a simple script to produce a report of the remote HCA port and a count of srp events. This is intended to provide a quick summary of srp activity when run on the SRP target server:
{noformat}
#!/usr/sbin/dtrace -s
#pragma D option quiet
dtrace:::BEGIN
{
printf("Tracing... Hit Ctrl-C to end.\n");
}
srp:::login-command,
srp:::login-response,
srp:::task-command,
srp:::task-response,
srp:::scsi-command,
srp:::scsi-response,
srp:::xfer-start,
srp:::xfer-done
{
@events[args[0]->ci_remote, probename] = count();
}
dtrace:::END
{
printf(" %-33s %14s %8s\n", "REMOTE GID", "iSCSI EVENT", "COUNT");
printa(" %-33s %14s %@8d\n", @events);
}
{noformat}
This output shows the host and the number of iSCSI operations:
{noformat}
thump1## dtrace -s ./srpwho.d
Tracing... Hit Ctrl-C to end.
^C
REMOTE GID iSCSI EVENT COUNT
fe80000000000000:0003ba000100386d login-command 1
fe80000000000000:0003ba000100386d login-response 1
fe80000000000000:0003ba0001003851 login-command 2
fe80000000000000:0003ba0001003851 login-response 2
fe80000000000000:0003ba0001003852 login-command 2
fe80000000000000:0003ba0001003852 login-response 2
fe80000000000000:0003ba0001004d32 xfer-done 9
fe80000000000000:0003ba0001004d32 xfer-start 9
fe80000000000000:0003ba0001004d31 xfer-done 18
fe80000000000000:0003ba0001004d31 xfer-start 18
fe80000000000000:0003ba0001004d32 scsi-command 22
fe80000000000000:0003ba0001004d32 scsi-response 22
fe80000000000000:0003ba0001004d32 task-command 22
fe80000000000000:0003ba0001004d32 task-response 22
fe80000000000000:0003ba0001004d31 scsi-command 42
fe80000000000000:0003ba0001004d31 scsi-response 42
fe80000000000000:0003ba0001004d31 task-command 42
fe80000000000000:0003ba0001004d31 task-response 42
{noformat}
The fields are:
|| field || description ||
| {{REMOTE GID}} | GID of the client HCA port |
| {{SRP EVENT}} | srp event type |
| {{COUNT}} | Number of events traced |
h6. srpsnoop.d
This is a simple script to snoop srp events when run on a srp target server.
{noformat}
#!/usr/sbin/dtrace -s
#pragma D option quiet
#pragma D option switchrate=10
dtrace:::BEGIN
{
printf("%17s %3s %-40s %-14s %6s %10s %6s\n", "TIMESTAMP",
"CPU", "REMOTE GID", "EVENT", "BYTES", "TAG", "SCSIOP");
/*
* SCSI opcode to string translation hash. This is from
* /usrp/include/sys/scsi/generic/commands.h. If you would
* rather all hex, comment this out.
*/
scsiop[0x08] = "read";
scsiop[0x0a] = "write";
scsiop[0x0b] = "seek";
scsiop[0x28] = "read(10)";
scsiop[0x2a] = "write(10)";
scsiop[0x2b] = "seek(10)";
}
srp:::login-*
{
printf("%17d %3d %-40s %-14s %17d -\n", timestamp, cpu, args[0]->ci_remote,
probename, args[2]->li_task_tag);
}
srp:::task-command,
srp:::task-response,
srp:::scsi-response
{
printf("%17d %3d %-40s %-14s %6d %10d -\n", timestamp, cpu, args[0]->ci_remote,
probename, 0, args[2]->ti_task_tag);
}
srp:::scsi-command
/scsiop[args[2]->ic_cdb[0]] != NULL/
{
printf("%17d %3d %-40s %-14s %6d %10d %s\n", timestamp, cpu, args[0]->ci_remote,
probename, 0, args[3]->ti_task_tag, scsiop[args[2]->ic_cdb[0]]);
}
srp:::scsi-command
/scsiop[args[2]->ic_cdb[0]] == NULL/
{
printf("%17d %3d %-40s %-14s %6d %10d 0x%x\n", timestamp, cpu, args[0]->ci_remote,
probename, 0, args[3]->ti_task_tag, args[2]->ic_cdb[0]);
}
srp:::xfer-start,
srp:::xfer-done
{
printf("%17d %3d %-40s %-14s %6d %10d %s\n", timestamp, cpu, args[0]->ci_remote,
probename,args[2]->xfer_len, args[3]->ti_task_tag,
args[2]->xfer_type > 0 ? "READ" : "WRITE");
}
{noformat}
This output shows the snoop on dd commands executed by the initiator.
{noformat}
thump1## dtrace -s ./srpsnoop.d
TIMESTAMP CPU REMOTE GID EVENT BYTES TAG SCSIOP
22644410404019 3 fe80000000000000:0003ba0001004d31 task-command 0 26 -
22644410493068 3 fe80000000000000:0003ba0001004d31 scsi-command 0 26 read(10)
22644410511422 3 fe80000000000000:0003ba0001004d31 task-command 0 30 -
22644410541494 3 fe80000000000000:0003ba0001004d31 scsi-command 0 30 read(10)
22644410621049 0 fe80000000000000:0003ba0001004d31 xfer-start 2048 26 READ
22644410720486 1 fe80000000000000:0003ba0001004d31 xfer-start 49152 30 READ
22644410681390 3 fe80000000000000:0003ba0001004d31 xfer-done 2048 26 READ
22644410694719 3 fe80000000000000:0003ba0001004d31 scsi-response 0 26 -
22644410703358 3 fe80000000000000:0003ba0001004d31 task-response 0 26 -
22644410895424 3 fe80000000000000:0003ba0001004d31 xfer-done 49152 30 READ
22644410901576 3 fe80000000000000:0003ba0001004d31 scsi-response 0 30 -
22644410905717 3 fe80000000000000:0003ba0001004d31 task-response 0 30 -
22727363721107 3 fe80000000000000:0003ba0001004d31 task-command 0 59 -
22727363919179 0 fe80000000000000:0003ba0001004d31 xfer-start 10240 59 WRITE
22727364095164 0 fe80000000000000:0003ba0001004d31 scsi-response 0 59 -
22727364105406 0 fe80000000000000:0003ba0001004d31 task-response 0 59 -
22727363812953 3 fe80000000000000:0003ba0001004d31 scsi-command 0 59 write(10)
22727363986185 3 fe80000000000000:0003ba0001004d31 xfer-done 10240 59 WRITE
{noformat}
The fields are:
|| field || description ||
| {{CPU}} | CPU event occured on |
| {{REMOTE GID}} | GID of the client HCA port |
| {{EVENT}} | srp event type |
| {{BYTES}} | Data bytes |
| {{TAG}} | Initiator task tag |
| {{SCSIOP}} | SCSI opcode as a description, as hex, or '-' |
h1. {anchor:CHP-srp} {{srp}} Provider
The {{srp}} provider provides probes for tracing srp port provider activity.
This is a kernel provider built into the COMSTAR srp target port provider.
h2. {anchor:CHP-srp-Probes} Probes
h3. {anchor:CHP-srp-Probes-Overview} Probes Overview
|| SRP events Event || Probes ||
| Service up/down | {{srp:::service-up{}}}, {{{}srp:::service-down}} |
| Remote Port login/logout | {{srp:::login-command}}, {{srp:::login-response}}, {{srp:::logout-command}} |
| SRP command/response | {{srp:::task-command}}, {{srp:::task-response}} |
| SCSI command/response | {{srp:::scsi-command}}, {{srp:::scsi-response}} |
| Data transfer | {{srp:::xfer-start}}, {{srp:::xfer-done}} |
For all of the providers below, string fields which are not known contain the string "<unknown>". Integer fields which are not known contain 0.
[Top|#top]
h3. {anchor:CHP-srp-Service-Event-Probes} Service up/down Event Probes
{{srp:::service-up{}}} and {{{}srp:::service-down}} trace SRP target online and offline events.
Remote port information ({{ci_remote}}) is unavailable for both probes.
|| Probes || Variable || Type || Description ||
|srp:::service-up
srp:::service-down | {{args\[0\]}} | {{conninfo_t *}} | connection information |
|srp:::service-up
srp:::service-down | {{args\[1\]}} | {{srp_portinfo_t *}} | local and remote port information |
h3. {anchor:CHP-srp-Login-Logout-Event-Probes} Remote Port Login/Logout Event Probes
|| Probes || Variable || Type || Description ||
| srp:::login-command
srp:::login-response
srp:::logout-command | {{args\[0\]}} | {{conninfo_t *}} | connection information |
|srp:::login-command
srp:::login-response
srp:::logout-command | {{args\[1\]}} | {{srp_portinfo_t *}} | local and remote port information |
|srp:::login-command
srp:::login-response | {{args\[2\]}} | {{srp_logininfo_t *}} | login command/response information |
[Top|#top]
h3. {anchor:CHP-srp-task-Command-Event-Probes} SRP Command Event Probes
|| Probes || Variable || Type || Description ||
| srp:::task-command
srp:::task-response | {{args\[0\]}} | {{conninfo_t *}} | connection information |
| srp:::task-command
srp:::task-response | {{args\[1\]}} | {{srp_portinfo_t *}} | local and remote port info |
| srp:::scsi-response
srp:::scsi-command| {{args\[2\]}} | {{srp_taskinfo_t *}} | srp task information |
[Top|#top]
h3. {anchor:CHP-srp-SCSI-Command-Event-Probes} SCSI Command Event Probes
|| Probes || Variable || Type || Description ||
| srp:::scsi-command
srp:::scsi-response | {{args\[0\]}} | {{conninfo_t *}} | connection information |
| srp:::scsi-command
srp:::scsi-response | {{args\[1\]}} | {{srp_portinfo_t *}} | local and remote port info |
| srp:::scsi-command | {{args\[2\]}} | {{scsicmd_t *}} | SCSI command block (cdb) |
| srp:::scsi-response | {{args\[2\]}} | {{srp_taskinfo_t *}} | srp task information |
| srp:::scsi-command| {{args\[3\]}} | {{srp_taskinfo_t *}} | srp task information |
[Top|#top]
h3. {anchor:CHP-srp-Data-Transfer-Probes} Data Transfer Probes
|| Probes || Variable || Type || Description ||
| srp:::xfer-start
srp:::xfer-done | {{args\[0\]}} | {{conninfo_t *}} | connection information |
| srp:::xfer-start
srp:::xfer-done | {{args\[1\]}} | {{fc_port_info_t *}} | local port information |
| srp:::xfer-start
srp:::xfer-done | {{args\[2\]}} | {{xferinfo_t *}} | RDMA transfer information |
| srp:::xfer-start
srp:::xfer-done | {{args\[3\]}} | {{srp_taskinfo_t *}} | srp task information |
[Top|#top]
h2. {anchor:CHP-fc-Types} Types
{info:title=Common types}
{{scsicmd_t}}, {{conninfo_t}} and {{xferinfo_t}} are common types which are used by other providers.
{info}
{{scsicmd_t}}
{noformat}
typedef struct scsicmd {
uint64_t ic_len; /* CDB length */
uint8_t *ic_cdb; /* CDB data */
} scsicmd_t;
{noformat}
{{conninfo_t}}
{noformat}
typedef struct conninfo {
string ci_local; /* GID of the local HCA */
string ci_remote; /* GID of the remote HCA */
string ci_protocol; /* protocol ("ib") */
} conninfo_t;
{noformat}
{{srp_portinfo_t}}
{noformat}
typedef struct srp_portinfo {
/* initiator */
string pi_initiator; /* Initiator: eui.xxxxxxxxxxxxxxx */
string pi_i_sid; /* Initiator seiion id */
/* target */
string pi_target; /* Target: eui.xxxxxxxxxxxxxxx */
string pi_t_sid; /* Target session id */
uintptr_t pi_chan_id; /* Channel identifier */
} srp_portinfo_t;
{noformat}
{{srp_logininfo_t}}
{noformat}
typedef struct srp_logininfo {
uint64_t li_task_tag; /* SRP task tag */
uint32_t li_max_it_iu_len; /* Maxium iu length that initiator can
send to target */
uint32_t li_max_ti_iu_len; /* Maxium iu length that target can
send to initiator */
uint32_t li_request_limit; /* Maximun number of SRP requests
that initiator can send on a channel */
uint32_t reason_code; /* Reason code */
} srp_logininfo_t;
{noformat}
{{srp_taskinfo_t}}
{noformat}
typedef struct srp_taskinfo {
uint64_t ti_task_tag; /* SRP task tag */
uint64_t ti_lun; /* Target logical unit number */
uint8_t ti_function; /* Task management function */
uint32_t ti_req_limit_delta; /* Increment of channel's request limit */
uint8_t ti_flag; /* bit 2:DOOVER 3:DOUNDER 4:DIOVER 5:DIUNDER */
uint32_t ti_do_resid_cnt; /* Data-out residual count */
uint32_t ti_di_resid_cnt; /* Data-in residual count */
uint8_t ti_status; /* Status of this task */
} srp_taskinfo_t;
{noformat}
{{xferinfo_t}}
{noformat}
typedef struct xferinfo {
uintptr_t xfer_laddr; /* Local buffer address */
uint32_t xfer_loffset; /* Relative offset from local buffer */
uint32_t xfer_lkey; /* Access control to local memory */
uintptr_t xfer_raddr; /* Remote virtual address */
uint32_t xfer_roffset; /* Offset from the remote address */
uint32_t xfer_rkey; /* Access control to remote address */
uint32_t xfer_len; /* Transfer length */
uint8_t xfer_type; /* 0: read; 1: write; */
} xferinfo_t;
{noformat}
[Top|#top]
h2. {anchor:CHP-fc-Examples} Examples
h6. service.d
This is a simple script to produce a report of target online/offline evenets.
{noformat}
#!/usr/sbin/dtrace -s
#pragma D option quiet
dtrace:::BEGIN
{
printf("Tracing... Hit Ctrl-C to end.\n\n");
printf("%-14s %-35s %-20s\n", "SRP EVENT", "LOCAL PORT", "EUI NAME");
};
srp:::service-up
{
printf("%-14s %-35s %-20s\n", probename, args[0]->ci_local, args[1]->pi_target);
}
srp:::service-down
{
printf("%-14s %-35s %-20s\n", probename, args[0]->ci_local, args[1]->pi_target);
}
{noformat}
This output shows the host and the number of iSCSI operations:
{noformat}
thump1## dtrace -s ~/src/service.d
Tracing... Hit Ctrl-C to end.
^C
SRP EVENT LOCAL PORT EUI NAME
service-down fe80000000000000:0003ba0001004d31 eui.0003BA0001004D30
service-down fe80000000000000:0003ba0001004d32 eui.0003BA0001004D30
service-up fe80000000000000:0003ba0001004d31 eui.0003BA0001004D30
service-up fe80000000000000:0003ba0001004d32 eui.0003BA0001004D30
thump1##
{noformat}
The fields are:
|| field || description ||
| {{SRP EVENT}} | srp event type |
| {{LOCAL PORT}} | GID of the local port |
| {{EUI NAME}} | EUI name of the local port|
h6. srpwho.d
This is a simple script to produce a report of the remote HCA port and a count of srp events. This is intended to provide a quick summary of srp activity when run on the SRP target server:
{noformat}
#!/usr/sbin/dtrace -s
#pragma D option quiet
dtrace:::BEGIN
{
printf("Tracing... Hit Ctrl-C to end.\n");
}
srp:::login-command,
srp:::login-response,
srp:::task-command,
srp:::task-response,
srp:::scsi-command,
srp:::scsi-response,
srp:::xfer-start,
srp:::xfer-done
{
@events[args[0]->ci_remote, probename] = count();
}
dtrace:::END
{
printf(" %-33s %14s %8s\n", "REMOTE GID", "iSCSI EVENT", "COUNT");
printa(" %-33s %14s %@8d\n", @events);
}
{noformat}
This output shows the host and the number of iSCSI operations:
{noformat}
thump1## dtrace -s ./srpwho.d
Tracing... Hit Ctrl-C to end.
^C
REMOTE GID iSCSI EVENT COUNT
fe80000000000000:0003ba000100386d login-command 1
fe80000000000000:0003ba000100386d login-response 1
fe80000000000000:0003ba0001003851 login-command 2
fe80000000000000:0003ba0001003851 login-response 2
fe80000000000000:0003ba0001003852 login-command 2
fe80000000000000:0003ba0001003852 login-response 2
fe80000000000000:0003ba0001004d32 xfer-done 9
fe80000000000000:0003ba0001004d32 xfer-start 9
fe80000000000000:0003ba0001004d31 xfer-done 18
fe80000000000000:0003ba0001004d31 xfer-start 18
fe80000000000000:0003ba0001004d32 scsi-command 22
fe80000000000000:0003ba0001004d32 scsi-response 22
fe80000000000000:0003ba0001004d32 task-command 22
fe80000000000000:0003ba0001004d32 task-response 22
fe80000000000000:0003ba0001004d31 scsi-command 42
fe80000000000000:0003ba0001004d31 scsi-response 42
fe80000000000000:0003ba0001004d31 task-command 42
fe80000000000000:0003ba0001004d31 task-response 42
{noformat}
The fields are:
|| field || description ||
| {{REMOTE GID}} | GID of the client HCA port |
| {{SRP EVENT}} | srp event type |
| {{COUNT}} | Number of events traced |
h6. srpsnoop.d
This is a simple script to snoop srp events when run on a srp target server.
{noformat}
#!/usr/sbin/dtrace -s
#pragma D option quiet
#pragma D option switchrate=10
dtrace:::BEGIN
{
printf("%17s %3s %-40s %-14s %6s %10s %6s\n", "TIMESTAMP",
"CPU", "REMOTE GID", "EVENT", "BYTES", "TAG", "SCSIOP");
/*
* SCSI opcode to string translation hash. This is from
* /usrp/include/sys/scsi/generic/commands.h. If you would
* rather all hex, comment this out.
*/
scsiop[0x08] = "read";
scsiop[0x0a] = "write";
scsiop[0x0b] = "seek";
scsiop[0x28] = "read(10)";
scsiop[0x2a] = "write(10)";
scsiop[0x2b] = "seek(10)";
}
srp:::login-*
{
printf("%17d %3d %-40s %-14s %17d -\n", timestamp, cpu, args[0]->ci_remote,
probename, args[2]->li_task_tag);
}
srp:::task-command,
srp:::task-response,
srp:::scsi-response
{
printf("%17d %3d %-40s %-14s %6d %10d -\n", timestamp, cpu, args[0]->ci_remote,
probename, 0, args[2]->ti_task_tag);
}
srp:::scsi-command
/scsiop[args[2]->ic_cdb[0]] != NULL/
{
printf("%17d %3d %-40s %-14s %6d %10d %s\n", timestamp, cpu, args[0]->ci_remote,
probename, 0, args[3]->ti_task_tag, scsiop[args[2]->ic_cdb[0]]);
}
srp:::scsi-command
/scsiop[args[2]->ic_cdb[0]] == NULL/
{
printf("%17d %3d %-40s %-14s %6d %10d 0x%x\n", timestamp, cpu, args[0]->ci_remote,
probename, 0, args[3]->ti_task_tag, args[2]->ic_cdb[0]);
}
srp:::xfer-start,
srp:::xfer-done
{
printf("%17d %3d %-40s %-14s %6d %10d %s\n", timestamp, cpu, args[0]->ci_remote,
probename,args[2]->xfer_len, args[3]->ti_task_tag,
args[2]->xfer_type > 0 ? "READ" : "WRITE");
}
{noformat}
This output shows the snoop on dd commands executed by the initiator.
{noformat}
thump1## dtrace -s ./srpsnoop.d
TIMESTAMP CPU REMOTE GID EVENT BYTES TAG SCSIOP
22644410404019 3 fe80000000000000:0003ba0001004d31 task-command 0 26 -
22644410493068 3 fe80000000000000:0003ba0001004d31 scsi-command 0 26 read(10)
22644410511422 3 fe80000000000000:0003ba0001004d31 task-command 0 30 -
22644410541494 3 fe80000000000000:0003ba0001004d31 scsi-command 0 30 read(10)
22644410621049 0 fe80000000000000:0003ba0001004d31 xfer-start 2048 26 READ
22644410720486 1 fe80000000000000:0003ba0001004d31 xfer-start 49152 30 READ
22644410681390 3 fe80000000000000:0003ba0001004d31 xfer-done 2048 26 READ
22644410694719 3 fe80000000000000:0003ba0001004d31 scsi-response 0 26 -
22644410703358 3 fe80000000000000:0003ba0001004d31 task-response 0 26 -
22644410895424 3 fe80000000000000:0003ba0001004d31 xfer-done 49152 30 READ
22644410901576 3 fe80000000000000:0003ba0001004d31 scsi-response 0 30 -
22644410905717 3 fe80000000000000:0003ba0001004d31 task-response 0 30 -
22727363721107 3 fe80000000000000:0003ba0001004d31 task-command 0 59 -
22727363919179 0 fe80000000000000:0003ba0001004d31 xfer-start 10240 59 WRITE
22727364095164 0 fe80000000000000:0003ba0001004d31 scsi-response 0 59 -
22727364105406 0 fe80000000000000:0003ba0001004d31 task-response 0 59 -
22727363812953 3 fe80000000000000:0003ba0001004d31 scsi-command 0 59 write(10)
22727363986185 3 fe80000000000000:0003ba0001004d31 xfer-done 10240 59 WRITE
{noformat}
The fields are:
|| field || description ||
| {{CPU}} | CPU event occured on |
| {{REMOTE GID}} | GID of the client HCA port |
| {{EVENT}} | srp event type |
| {{BYTES}} | Data bytes |
| {{TAG}} | Initiator task tag |
| {{SCSIOP}} | SCSI opcode as a description, as hex, or '-' |