Пустая функция в rt.c / deadline.c в ядре Linux

#c #linux #linux-kernel #real-time #sched-deadline

#c #linux #linux-ядро #в режиме реального времени #sched-крайний срок

Вопрос:

Я изучал алгоритмы планирования в реальном времени внутри ядра Linux и увидел, что было много вызовов функций, в которых буквально ничего не было определено:

(в ядре 3.15), например:

 rt.c 1392 : dequeue_pushable_task(rq, p); 
rt.c 365  : static inline void dequeue_pushable_task(struct rq *rq, struct task_struct *p)
              {
              }


rt.c 1394 : set_post_schedule(rq);
rt.c 365  : static inline void set_post_schedule(struct rq *rq)
              {
              }
  

Они также переопределяются в ifdef, который проверяет SMP. Я просто хотел убедиться, являются ли эти функции специфичными для SMP? или есть какая-либо причина для наличия этих пустых функций.

Ответ №1:

Согласно комментарию в sched / deadline: добавьте структуры данных SCHED_DEADLINE, связанные с SMP, и логику 1baca4ce16b8cc7d4f50be1f7914799af30a2861 commit.

Эти методы предназначены для хранения задач с истекшим сроком выполнения в очередях выполнения, специфичных для ЦП, концепция выдвигаемой или извлекаемой задачи с истекшим сроком выполнения требует, чтобы у них было несколько очередей выполнения ЦП для перемещения и перемещения задач между ними. Если параметр CONFIG_SMP не установлен, существует только одна очередь запуска процессора, и, следовательно, миграция задач не требуется.

Итак, да, реализация функции специфична для SMP, и причина наличия этих пустых функций заключается в том, чтобы код компилировался, но ничего не делал, когда CONFIG_SMP не определен, вместо того, чтобы реализовывать дополнительные проверки ifdef на каждом вызывающем сайте.

Комментарии:

1. разве компилятор не должен выдавать ошибку определения дублирующейся функции?

2. Нет, потому что определенная функция определяется макрокомандой препроцессора ifdef перед компиляцией файла.

3. О, понял, так что это объявление функции с использованием условий if else.