View Source

{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 '-' |

The individuals who post here are part of the extended Sun Microsystems community and they might not be employed or in any way formally affiliated with Sun Microsystems. The opinions expressed here are their own, are not necessarily reviewed in advance by anyone but the individual authors, and neither Sun nor any other party necessarily agrees with them.

Copyright 1994-2009 Sun Microsystems, Inc.
Powered by Atlassian Confluence
Sun Guidelines on Public Discourse Privacy Policy Terms of Use Trademarks Site Map Employment Investor Relations Contact