kernel rtc timestamp

CentOS 6.5 で kernel が出力する printk で RTC的なタイムスタンプ(年月日 時分秒)を表示する方法です。今回はパイプ通信を解析したかったので fs/pipe.c に処理を追加してみました。

前準備 モジュールの署名をスキップ

デバッグ用ということもあり、 menu config でモジュールの署名をスキップするようにします。
.config の diff を掲載しておきます。

215,216c215
< CONFIG_MODULE_SIG=y
< # CONFIG_MODULE_SIG_FORCE is not set
---
> # CONFIG_MODULE_SIG is not set
4545,4546c4544
< CONFIG_CRYPTO_SIGNATURE=y
< CONFIG_CRYPTO_SIGNATURE_DSA=y
---
> # CONFIG_CRYPTO_SIGNATURE is not set

fs/pipe.c 時分秒対応に関する変更箇所

必要な include ファイル

以下2行の include を追加します。

#include <linux/time.h>
#include <linux/rtc.h>
タイムスタンプ出力用の処理

例えばパイプ通信で read した際にタイムスタンプを出力する場合の処理です。太字表示の部分が追加処理です。

static ssize_t
pipe_read(struct kiocb *iocb, const struct iovec *_iov,
           unsigned long nr_segs, loff_t pos) 
{
        struct timeval tv;  
        struct tm tm;

        struct file *filp = iocb->ki_filp;
        struct inode *inode = filp->f_path.dentry->d_inode;
        struct pipe_inode_info *pipe;
        int do_wakeup;
        ssize_t ret; 
        struct iovec *iov = (struct iovec *)_iov;
        size_t total_len;

        memset(&tm, 0, sizeof(struct tm)); 
        do_gettimeofday(&tv);
        time_to_tm(tv.tv_sec, 9 * 3600, &tm);
        printk(KERN_INFO "pipe_read: time = %04ld-%02d-%02d %02d:%02d:%02d.%06ld\n",
            tm.tm_year + 1900,
            tm.tm_mon + 1, 
            tm.tm_mday,
            tm.tm_hour,
            tm.tm_min,
            tm.tm_sec,
            (long)tv.tv_usec);

        total_len = iov_length(iov, nr_segs);

カーネル内部でタイムスタンプを出力する処理は色々と使われていますが、時分秒表示はアプリと同列に比較する際に単位合わせしたいときに便利だと思いました。