仙帝将王 发表于 2014-11-28 09:43

针对每个CPU运行队列的线程、等待队列线程信息输出

各位好,

我需要在SysRq中增加自己的调试命令,当键入命令后输出每个CPU中运行队列的所有线程信息以及等待队列的线程信息。查找运行队列现在主要有两种思路:一种是直接遍历task_struct链表,另外一种是利用struc ra结构体。等待队列还没有思路。由于内核刚入门不久,具体的细节和概念还不是特别清楚,请各位大牛多多指点。

仙帝将王 发表于 2014-11-28 09:44

是struct rq结构体,不是ra结构体,不好意思。

humjb_1983 发表于 2014-11-28 16:04

遍历运行队列中的任务,应该有现有的接口,忘了,建议看看代码~
等待队列可能也有,建议搜搜代码~

仙帝将王 发表于 2014-12-01 18:12

打印每个cpu的运行队列信息已经实现了。现在的问题就是等待队列了,看了一个礼拜的源代码,还是没有找到内核调度层的等待队列地址,内核好像只记录等待的数量,而对具体等待的任务不做保存。请教下如何打印CPU的等待队列中的进程?回复 3# humjb_1983


   

Tinnal 发表于 2014-12-01 22:06

回复 4# 仙帝将王

等待队列怎么没有链表,不然怎么把任务取出来去**!void fastcall add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait)
{
        unsigned long flags;

        wait->flags &= ~WQ_FLAG_EXCLUSIVE;
        spin_lock_irqsave(&q->lock, flags);
        __add_wait_queue(q, wait);
        spin_unlock_irqrestore(&q->lock, flags);
}
EXPORT_SYMBOL(add_wait_queue);static inline void __add_wait_queue(wait_queue_head_t *head, wait_queue_t *new)
{
        list_add(&new->task_list, &head->task_list);
}

Tinnal 发表于 2014-12-01 22:10

**的代码在这:
static void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
                             int nr_exclusive, int sync, void *key)
{
        wait_queue_t *curr, *next;

        list_for_each_entry_safe(curr, next, &q->task_list, task_list) {
                unsigned flags = curr->flags;

                if (curr->func(curr, mode, sync, key) &&
                                (flags & WQ_FLAG_EXCLUSIVE) && !--nr_exclusive)
                        break;
        }
}

仙帝将王 发表于 2014-12-02 14:43

回复 6# Tinnal


    谢谢Tinnal,这个确实是等待队列的代码,但是具体的队列是由应用层自己定义的。我想请教的是,内核调度层会像运行队列一样的等待队列吗?也就是说每个CPU中是不是有一个唯一的等待队列?

Tinnal 发表于 2014-12-03 08:33

回复 7# 仙帝将王


没有作谓的每CPU等待队列吧,应该只有每CPU运行队列。除非在一些特性的子系统里或你自己定义。自己去搜索一下代码不就出来了。
页: [1]
查看完整版本: 针对每个CPU运行队列的线程、等待队列线程信息输出