2016-06-27 15 views
1

Ich versuche, einige Informationen innerhalb von __generic_file_write_iter() von innerhalb mm/filemap.c zu drucken.Warum wird ein printk() kontinuierlich innerhalb von syslog gedruckt, wenn die Kernel-Funktion, in der es sich befindet, nicht aufgerufen wird (per ftrace)?

I haben die Funktion wie folgt modifiziert:

struct file *file = iocb->ki_filp; 
struct address_space * mapping = file->f_mapping; 
struct inode *inode = mapping->host; 
ssize_t   written = 0; 
ssize_t   err; 
ssize_t   status; 

/* We can write back this queue in page reclaim */ 
current->backing_dev_info = inode_to_bdi(inode); 
err = file_remove_privs(file); 
if (err) 
     goto out; 

err = file_update_time(file); 
if (err) 
     goto out; 

/* This if() is all I have added */ 
if(io_tracing_on) { 
     ssize_t write_size = iov_length(from->iov, from->nr_segs); 
     printk(KERN_INFO "write size=%zu, pid=%d, inode=%lu\n", write_size, task_pid_nr(current), inode->i_ino); 
} 

if (iocb->ki_flags & IOCB_DIRECT) { 
     loff_t pos, endbyte; 
     ... 

io_tracing_on ist eine Variable, die über einen I/proc Eintrag gesetzt (durch mein Modul geschaffen, die in dem Kernel gebaut ist). Wenn ich den Schalter auf und läuft dd Flip (via dd if=/dev/urandom of=/tmp/gibberish bs=1M count=1), erhalte ich einen kontinuierlichen Strom von Ausgang zu /var/log/syslog, das heißt:

Jun 27 15:00:41 malka kernel: [ 463.424155] write size=168, pid=715, inode=7864653 
Jun 27 15:00:41 malka kernel: [ 463.428064] write size=168, pid=715, inode=7864354 
Jun 27 15:00:41 malka kernel: [ 463.428126] write size=168, pid=715, inode=7864653 
Jun 27 15:00:41 malka kernel: [ 463.432061] write size=168, pid=715, inode=7864354 
Jun 27 15:00:41 malka kernel: [ 463.432121] write size=168, pid=715, inode=7864653 
Jun 27 15:00:41 malka kernel: [ 463.436075] write size=168, pid=715, inode=7864354 
Jun 27 15:00:41 malka kernel: [ 463.436133] write size=168, pid=715, inode=7864653 
Jun 27 15:00:41 malka kernel: [ 463.440060] write size=168, pid=715, inode=7864354 
Jun 27 15:00:41 malka kernel: [ 463.440121] write size=168, pid=715, inode=7864653 
etc 

Doch wenn ich die Ftrace (mit der „Funktion“ Tracer) laufen, ich nie sehen __generic_file_write_iter() werden aufgerufen. Also, warum würde meine printk() Anweisung kontinuierlich aufgerufen werden, ohne dass __generic_file_write_iter() in der ftrace-Ausgabe angezeigt wird?

Die Kernel-Version ist 4.5.5.

UPDATE

Zuvor war ich nicht in der Lage, die pid mit jedem gültigen Prozess zu verknüpfen. Nachdem ich meinen Code geändert hatte, um pid und tgid zu drucken, konnte ich tgid mit einem Prozess verbinden. Es scheint, dass der Syslog mein printk() jedes Mal aufruft, wenn es schreibt, den ununterbrochenen Strom der Ausgabe verursachend. Ftrace zeigt jedoch immer noch nicht __generic_file_write_iter() an, der nahe genug mal aufgerufen wird, um die Häufigkeit zu reflektieren, wie oft mein printk() aufgerufen wird. Also, meine Frage bleibt - wenn ftrace funktioniert, wie ich es erwarte, würde ich mir vorstellen, dass es einen Anruf an __generic_file_write_iter() in ftrace für jeden printk(), die ich im Syslog sehe.

+0

Können Sie herausfinden, was Sie mit "wird nicht genannt" meinen? Du meinst es wird nicht von deinem dd-Prozess aufgerufen oder überhaupt nicht angerufen? – Soren

+0

"Wenn die Kernel-Funktion in der es sich befindet, wird nicht aufgerufen." In der Post sage ich, dass "ich __generic_file_write_iter() nie aufgerufen bekomme." "Wird nicht aufgerufen" bezieht sich darauf, dass __generic_file_write_iter() nicht aufgerufen wird, wie von ftrace angezeigt. Aus Neugier, war das nicht klar, wenn Sie die gesamte Post lesen - oder haben Sie nicht die ganze Post gelesen? Ich werde darüber nachdenken, wie man es weniger zweideutig macht, und Ihre Antwort auf diese Frage wird mir dabei helfen. – buratino

Antwort

0

Doch wenn ich die Ftrace (mit der "Funktion" Tracer) laufen, ich sehe __generic_file_write_iter() nie aufgerufen.

wahrscheinlich die meisten, ist __generic_file_write_iter nicht in /sys/kernel/debug/tracing/available_filter_functions aufgeführt (die Funktionen, die Ftrace verfolgen können, finden Sie ftrace - Function Tracer oder Secrets of the Ftrace function tracer).

+1

__generic_file_write_iter() ist in den verfügbaren Filterfunktionen aufgeführt. – buratino