linux 是否可以从sched_entity中找到相应的task_struct?

368yc8dk  于 5个月前  发布在  Linux
关注(0)|答案(2)|浏览(73)

我知道如果我们有task_struct,当然我们可以得到包含的sched_entity,因为它是task结构中的一个字段。但是我们可以在给定shed_entity的情况下得到指向task_struct的指针吗?下面是sched_entity结构:

struct sched_entity {
    struct load_weight  load;       /* for load-balancing */
    struct rb_node      run_node;
    struct list_head    group_node;
    unsigned int        on_rq;

    u64         exec_start;
    u64         sum_exec_runtime;
    u64         vruntime;
    u64         prev_sum_exec_runtime;

    u64         nr_migrations;

#ifdef CONFIG_SCHEDSTATS
    struct sched_statistics statistics;
#endif

#ifdef CONFIG_FAIR_GROUP_SCHED
    struct sched_entity *parent;
    /* rq on which this entity is (to be) queued: */
    struct cfs_rq       *cfs_rq;
    /* rq "owned" by this entity/group: */
    struct cfs_rq       *my_q;
#endif
};

字符串
似乎没有地方可以获取task_struct,我的最终目标是获取包含这个shed_entity的任务的task group_leader的sched_entity:>

xfyts7mz

xfyts7mz1#

Linux内核代码提供了一种标准的方法来获取指向结构中包含的元素的指针,并返回指向包含结构的指针:container_of宏,该宏在整个内核中广泛使用。
在这种情况下,如果你有一个struct sched_entity *foo,你可以得到封闭的task_struct

struct task_struct *task = container_of(foo, struct task_struct, se);

字符串
(显然,只有当您确定原始struct sched_entity *指针指向struct task_struct内部的struct sched_entity时,这才是安全的,所以要小心...)

zazmityj

zazmityj2#

kernel/sched/sched.h文件中的task_of()宏可以提供帮助。它基本上是调用container_of()

相关问题