suspicious RCU usage?

Peter Senna Tschudin peter.senna at gmail.com
Sun Mar 4 08:16:28 EST 2012


Dear list,

I'm running custom Fedora 17 Kernel
3.3.0-0.rc5.git3.1.yfkm2.fc17.x86_64, and the warning was shown on
dmesg:

[  858.634304]
[  858.634324] ===============================
[  858.634350] [ INFO: suspicious RCU usage. ]
[  858.634375] 3.3.0-0.rc5.git3.1.yfkm2.fc17.x86_64 #1 Not tainted
[  858.634409] -------------------------------
[  858.634435] kernel/pid.c:425 find_task_by_pid_ns() needs
rcu_read_lock() protection!
[  858.634478]
[  858.634479] other info that might help us debug this:
[  858.634480]
[  858.634528]
[  858.634529] rcu_scheduler_active = 1, debug_locks = 0
[  858.634567] no locks held by monitor/10550.
[  858.634591]
[  858.634592] stack backtrace:
[  858.634620] Pid: 10550, comm: monitor Not tainted
3.3.0-0.rc5.git3.1.yfkm2.fc17.x86_64 #1
[  858.634666] Call Trace:
[  858.634688]  [<ffffffff810c8c55>] lockdep_rcu_suspicious+0xe5/0x100
[  858.634727]  [<ffffffff81086921>] find_task_by_pid_ns+0x81/0xa0
[  858.634762]  [<ffffffff81086962>] find_task_by_vpid+0x22/0x30
[  858.634798]  [<ffffffff8131ccd5>] yfkm2_is_pid_running+0x15/0x40
[  858.634835]  [<ffffffff8131ce54>] sys_yfkm2_monitor+0x14/0x80
[  858.634870]  [<ffffffff816a6ba9>] system_call_fastpath+0x16/0x1b

monitor is user application that call sys_yfkm2_monitor syscall
passing a pid to it. The custom code worked as expected but I'm
curious with the warning message shown on dmesg. What am I doing
wrong?

The user application monitor.c:
...
#define SYS_yfkm2_monitor       __NR_yfkm2_monitor
...
ret = syscall(SYS_yfkm2_monitor, pid);
...

The Kernel code yfkm2.c:
...
struct yfkm2 {
        pid_t monitor;          /* PID to monitor */
        pid_t notifyme;         /* PID to notify */
        struct list_head list;  /* Linked List struct */
};
...
/* Define and initialize yfkm2_(linked)list */
LIST_HEAD(yfkm2_list);
...
/* Define and initialize yfkm2_(read&write)lock */
DEFINE_RWLOCK(yfkm2_lock);
...
/*
 * asmlinkage long sys_yfkm2_monitor(pid_t monitor)
 *
 * The system call that check if monitor correspond to a running pid and stores
 * monitor at yfkm2_list->monitor
 *
 * return 0 if pid is running
 * return 1 if pid is not running
 */
asmlinkage long sys_yfkm2_monitor(pid_t monitor)
{
        struct yfkm2 *yfkm2_tmp;

        if (yfkm2_is_pid_running(monitor) == 0) {

                yfkm2_tmp = kmalloc(sizeof(*yfkm2_tmp), GFP_KERNEL);
                yfkm2_tmp->monitor = monitor;
                yfkm2_tmp->notifyme = 0;

                write_lock(&yfkm2_lock);
                list_add(&yfkm2_tmp->list, &yfkm2_list);
                write_unlock(&yfkm2_lock);

                return 0;
        }


        return 1;
}
...
/*
 * yfkm2_is_pid_running(pid_t pid)
 *
 * Check if pid is running
 *
 * return 0 if pid is running
 * return 1 if pid is not running
 */
int yfkm2_is_pid_running(pid_t pid)
{
        struct task_struct *q;

        q = find_task_by_vpid(pid);

        if (q != NULL && q->pid == pid)
                return 0;

        return 1;
}

Thank you!

Peter

-- 
Peter Senna Tschudin
peter.senna at gmail.com
gpg id: 48274C36



More information about the Kernelnewbies mailing list