1

私はsched_fair.c内にいて、いくつかログに記録したいのですが、表示される各sched_entityに関連付けられているタスク(pid)を知る必要があります。structsched_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 に答える