linked lists, etc. You can use auxiliary functions defined in other tapsets
or write your own.
+Take care when target variables may have invalid, unavailable, or
+esoteric values, or are passed via pointers. The a $pointer->field
+dereference can fail, so consider wrapping a try { } catch { } around
+it. For a char* being converted to a string, use {kernel,user}_string
+only if the pointer is guaranteed valid. Use {kernel,user}_string2($ptr,"")
+if the pointer might be NULL but should otherwise be good. Use
+{kernel,user}_string_quoted($ptr) to handle any possible pointer.
+
In the following example, copy_process() returns a pointer to the
task_struct for the new process. Note that the process ID of the new
process is retrieved by calling task_pid() and passing it the task_struct
(see above) and to have the systemtap translator automatically add a call to
assert_is_myproc() to the beginning of the function.
+Add the string
+ /* unmodified-fnargs */
+into the body of the embedded-C function to inform the translator
+that any string inputs and return values may be passed by reference
+rather than copy. This enables optimization.
+
Add the string
/* unmangled */
into a legacy (pre-SystemTap 1.8) embedded-C function that needs to
kernel.function("elv_next_request")
{
name = "elv_next_request"
- elevator_name = kernel_string_quoted(
+ elevator_name = kernel_string2(
@choose_defined($q->elevator->type->elevator_name,
@choose_defined($q->elevator->elevator_type->elevator_name,
- $q->elevator->elevator_name)))
+ $q->elevator->elevator_name)), "")
}
/**
= kernel.function("elv_completed_request")
{
name = "elv_completed_request"
- elevator_name = kernel_string_quoted(
+ elevator_name = kernel_string2(
@choose_defined($q->elevator->type->elevator_name,
@choose_defined($q->elevator->elevator_type->elevator_name,
- $q->elevator->elevator_name)))
+ $q->elevator->elevator_name)), "")
if($rq == 0) {
disk_major = -1
disk_minor = -1
kernel.function("__elv_add_request")
{
name = "elv_add_request"
- elevator_name = kernel_string_quoted(
+ elevator_name = kernel_string2(
@choose_defined($q->elevator->type->elevator_name,
@choose_defined($q->elevator->elevator_type->elevator_name,
- $q->elevator->elevator_name)))
+ $q->elevator->elevator_name)), "")
q = $q
if($rq == 0) {
disk_major = -1
{
name = "elv_add_request"
q = $q
- elevator_name = kernel_string_quoted(
+ elevator_name = kernel_string2(
@choose_defined($q->elevator->type->elevator_name,
@choose_defined($q->elevator->elevator_type->elevator_name,
- $q->elevator->elevator_name)))
+ $q->elevator->elevator_name)), "")
rq = $rq
if ($rq == 0 || $rq->rq_disk ==0) {
= kernel.trace("block_rq_complete") ?
{
name = "elv_completed_request"
- elevator_name = kernel_string_quoted(
+ elevator_name = kernel_string2(
@choose_defined($q->elevator->type->elevator_name,
@choose_defined($q->elevator->elevator_type->elevator_name,
- $q->elevator->elevator_name)))
+ $q->elevator->elevator_name)), "")
rq = $rq
if ($rq == 0 || $rq->rq_disk ==0) {
= kernel.trace("block_rq_issue") ?
{
name = "elv_issue_request"
- elevator_name = kernel_string_quoted(
+ elevator_name = kernel_string2(
@choose_defined($q->elevator->type->elevator_name,
@choose_defined($q->elevator->elevator_type->elevator_name,
- $q->elevator->elevator_name)))
+ $q->elevator->elevator_name)), "")
rq = $rq
if ($rq == 0 || $rq->rq_disk ==0) {
= kernel.trace("block_rq_requeue") ?
{
name = "elv_requeue_request"
- elevator_name = kernel_string_quoted(
+ elevator_name = kernel_string2(
@choose_defined($q->elevator->type->elevator_name,
@choose_defined($q->elevator->elevator_type->elevator_name,
- $q->elevator->elevator_name)))
+ $q->elevator->elevator_name)), "")
rq = $rq
if ($rq == 0 || $rq->rq_disk ==0) {
= kernel.trace("block_rq_abort") ?
{
name = "elv_abort_request"
- elevator_name = kernel_string_quoted(
+ elevator_name = kernel_string2(
@choose_defined($q->elevator->type->elevator_name,
@choose_defined($q->elevator->elevator_type->elevator_name,
- $q->elevator->elevator_name)))
+ $q->elevator->elevator_name)), "")
rq = $rq
if ($rq == 0 || $rq->rq_disk ==0) {