You have been subscribed to a public bug:
[Impact]
Kernel commit 768ae309a96103ed02eb1e111e838c87854d8b51 changed the
prototype of get_user_pages() removing 'write' and 'force' arguments,
merging them into 'gup_flags'.
This breaks systemtap that makes use of get_user_pages() in its kernel
runtime interface.
Fix the usage of get_user_pages() checking if it requires the old or the
new signature.
[Test Case]
ubuntu@ubuntu:~$ cat hello.stp
#!/usr/bin/env stap
probe oneshot { println("hello world") }
[Regression Potential]
A similar change is already present in bionic+. This is a backported
change for xenial. Moreover the fix adds a runtime check (done every
time a stap script is executed) to verify if the running kernel is using
the old or the new signature of get_user_pages(), so this change does
not break the old stap scripts. Therefore regression potential is
minimal.
[Original bug report]
Running a simple systemtap hello world example on a fresh installed
Xenial VM produces the following errors:
ubuntu@ubuntu:~$ uname -r
4.4.0-148-generic
ubuntu@ubuntu:~$ dpkg -l | grep systemtap
ii systemtap 2.9-2ubuntu2
amd64 instrumentation system for Linux
ii systemtap-common 2.9-2ubuntu2
all instrumentation system for Linux (common component)
ii systemtap-runtime 2.9-2ubuntu2
amd64 instrumentation system for Linux (runtime component)
ubuntu@ubuntu:~$ cat hello.stp
#!/usr/bin/env stap
probe oneshot { println("hello world") }
ubuntu@ubuntu:~$ sudo ./hello.stp
In file included from /usr/share/systemtap/runtime/linux/runtime.h:204:0,
from /usr/share/systemtap/runtime/runtime.h:24,
from
/tmp/stapCrPm1y/stap_9bc2f1adeaead87a69b1ab80b0f14480_967_src.c:25:
/usr/share/systemtap/runtime/linux/access_process_vm.h: In function
‘__access_process_vm_’:
/usr/share/systemtap/runtime/linux/access_process_vm.h:35:54: error: passing
argument 6 of ‘get_user_pages’ makes pointer from integer without a cast
[-Werror=int-conversion]
ret = get_user_pages (tsk, mm, addr, 1, write, 1, &page, &vma);
^
In file included from include/linux/pid_namespace.h:6:0,
from include/linux/ptrace.h:8,
from include/linux/ftrace.h:13,
from include/linux/kprobes.h:42,
from /usr/share/systemtap/runtime/linux/runtime.h:21,
from /usr/share/systemtap/runtime/runtime.h:24,
from
/tmp/stapCrPm1y/stap_9bc2f1adeaead87a69b1ab80b0f14480_967_src.c:25:
include/linux/mm.h:1222:6: note: expected ‘struct page **’ but argument is of
type ‘int’
long get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
^
In file included from /usr/share/systemtap/runtime/linux/runtime.h:204:0,
from /usr/share/systemtap/runtime/runtime.h:24,
from
/tmp/stapCrPm1y/stap_9bc2f1adeaead87a69b1ab80b0f14480_967_src.c:25:
/usr/share/systemtap/runtime/linux/access_process_vm.h:35:57: error: passing
argument 7 of ‘get_user_pages’ from incompatible pointer type
[-Werror=incompatible-pointer-types]
ret = get_user_pages (tsk, mm, addr, 1, write, 1, &page, &vma);
^
In file included from include/linux/pid_namespace.h:6:0,
from include/linux/ptrace.h:8,
from include/linux/ftrace.h:13,
from include/linux/kprobes.h:42,
from /usr/share/systemtap/runtime/linux/runtime.h:21,
from /usr/share/systemtap/runtime/runtime.h:24,
from
/tmp/stapCrPm1y/stap_9bc2f1adeaead87a69b1ab80b0f14480_967_src.c:25:
include/linux/mm.h:1222:6: note: expected ‘struct vm_area_struct **’ but
argument is of type ‘struct page **’
long get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
^
In file included from /usr/share/systemtap/runtime/linux/runtime.h:204:0,
from /usr/share/systemtap/runtime/runtime.h:24,
from
/tmp/stapCrPm1y/stap_9bc2f1adeaead87a69b1ab80b0f14480_967_src.c:25:
/usr/share/systemtap/runtime/linux/access_process_vm.h:35:13: error: too many
arguments to function ‘get_user_pages’
ret = get_user_pages (tsk, mm, addr, 1, write, 1, &page, &vma);
^
In file included from include/linux/pid_namespace.h:6:0,
from include/linux/ptrace.h:8,
from include/linux/ftrace.h:13,
from include/linux/kprobes.h:42,
from /usr/share/systemtap/runtime/linux/runtime.h:21,
from /usr/share/systemtap/runtime/runtime.h:24,
from
/tmp/stapCrPm1y/stap_9bc2f1adeaead87a69b1ab80b0f14480_967_src.c:25:
include/linux/mm.h:1222:6: note: declared here
long get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
^
cc1: all warnings being treated as errors
scripts/Makefile.build:285: recipe for target
'/tmp/stapCrPm1y/stap_9bc2f1adeaead87a69b1ab80b0f14480_967_src.o' failed
make[1]: *** [/tmp/stapCrPm1y/stap_9bc2f1adeaead87a69b1ab80b0f14480_967_src.o]
Error 1
Makefile:1454: recipe for target '_module_/tmp/stapCrPm1y' failed
make: *** [_module_/tmp/stapCrPm1y] Error 2
WARNING: kbuild exited with status: 2
Pass 4: compilation failed. [man error::pass4]
Tip: /usr/share/doc/systemtap/README.Debian should help you get started.
** Affects: systemtap (Ubuntu)
Importance: Undecided
Assignee: Andrea Righi (arighi)
Status: Confirmed
--
systemtap currently broken in xenial
https://bugs.launchpad.net/bugs/1830226
You received this bug notification because you are a member of Ubuntu Bugs,
which is subscribed to Ubuntu.
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs