Bug 6752

Summary: Retrieval of task argument in probe signal.send on x8664 fails
Product: systemtap Reporter: Phil Muldoon <pmuldoon>
Component: tapsetsAssignee: Phil Muldoon <pmuldoon>
Status: RESOLVED FIXED    
Severity: normal    
Priority: P2    
Version: unspecified   
Target Milestone: ---   
Host: Target:
Build: Last reconfirmed:
Attachments: Fix for 6752; tweak conditional to test for .10 at end of kernel version string
Fix for 6752; tweak conditional to test for >= 2.6.26 end of kernel version string

Description Phil Muldoon 2008-07-18 15:13:16 UTC
It is most easily demonstrated by running small_demos/proc_snoop.stp. But simple
reproducer equivalent is:

probe signal.send {
    printf("signal sent %d (%s) to task %d\n", sig, sig_name, task);
}

Retrieval of the task argument causes a failure. If task is not included in the
probe, it works fine. 

Results:

sudo stap -vv ./signal_bug.stp 

(snip)

semantic error: unable to find local 't' near pc 0xffffffff8103fcfc
(alternatives: sig q p flags ret): identifier '$t' at
/usr/local/share/systemtap/tapset/signal.stp:78:12
semantic error: unable to find local 't' near pc 0xffffffff8103fcfc
(alternatives: sig q p flags ret): identifier '$t' at :78:12

Snippet of relavant signal.stp code piece:

probe _signal.send.part3 = kernel.function("send_sigqueue")
{
    name = "send_sigqueue"
%( kernel_v > "2.6.25" %?
    task = $t
    sig = $q->info->si_signo
%:
    task = $p
    sig = $sig
%)

My system setup:

rpm -q kernel kernel-devel kernel-debuginfo

kernel-2.6.25.10-86.fc9.x86_64
kernel-devel-2.6.25.10-86.fc9.x86_64
kernel-debuginfo-2.6.25.10-86.fc9.x86_64

uname -a

stap -V

Linux localhost.localdomain 2.6.25.10-86.fc9.x86_64 #1 SMP Mon Jul 7 20:23:46
EDT 2008 x86_64 x86_64 x86_64 GNU/Linux

SystemTap translator/driver (version 0.7.1/0.133 git branch master, commit 7795c7e7)
Copyright (C) 2005-2008 Red Hat, Inc. and others
This is free software; see the source for copying conditions.
Comment 1 Phil Muldoon 2008-07-18 15:18:00 UTC
I'll take a shot at investigating this, and grep'ping the kernel source to see
if anything has changed in that particular revision.
Comment 2 Phil Muldoon 2008-07-18 15:57:32 UTC
send_sigqueue in 

linux-2.6.25.x86_64/kernel/signal.c

uses p for task_struct, not t so the conditional:

%( kernel_v > "2.6.25" %?
    task = $t

 appears incorrect?
Comment 3 Phil Muldoon 2008-07-18 20:21:44 UTC
Frank mentioned that kernel_v may be reporting 2.6.25.10 as the kernel version
string on Fedora perhaps casuing the < 2.6.25 version comparison to be false.
I'm not sure how to check the kernel_v argument as it is used in conditionals.

Page 28 of the language reference guide describes it as:

-- kernel v refers to the kernel version number only, such as “2.6.13”.

Should kernel_v only report the first 3 elements of a version number?
Comment 4 Phil Muldoon 2008-07-21 13:32:41 UTC
Created attachment 2834 [details]
Fix for 6752; tweak conditional to test for .10 at end of kernel version string

Patch to adjust kernel_v check to account for 2.6.25.10.
Comment 5 Phil Muldoon 2008-07-22 12:28:45 UTC
Created attachment 2835 [details]
Fix for 6752; tweak conditional to test for >= 2.6.26 end of kernel version string 

Path to change conditional to >= 2.6.26
Comment 6 Phil Muldoon 2008-07-22 12:29:09 UTC
Fixed with attached patch.