1

我在 sched_fair.c 里面,我想记录一些东西.. 但我需要知道哪个任务 (pid) 与我看到的每个 sched_entity 相关联.. 在我没有看到的 struct sched_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
};
4

2 回答 2

3

给定 sched_entity *se :

struct task_struct *p = task_of(se);

给你包含任务结构..

于 2012-05-31T14:07:17.613 回答
0
 /* include/linux/kernel.h */
        #define container_of(ptr, type, member) ({              \
            void *__mptr = (void *)(ptr);                   \
            BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) &&   \
                     !__same_type(*(ptr), void),            \
                     "pointer type mismatch in container_of()");    \
            ((type *)(__mptr - offsetof(type, member))); })
        
        /* kernel/sched/fair.c */
        static inline struct task_struct *task_of(struct sched_entity *se)
        {
            return container_of(se, struct task_struct, se);
        }

方便但危险

于 2021-08-24T07:52:43.370 回答