Никто не вызывает его напрямую, так как это локальная функция внутри той части источника, на которую вы ссылаетесь. Способ его вызова - опубликованная функция __delay()
.
Когда вы вызываете __delay()
, он будет использовать указатель функции delay_fn
(также локальный для этого файла), чтобы выбрать одну из нескольких функций задержки. По умолчанию выбрано значение delay_loop()
, которое использует инструкции x86, чтобы попытаться пометить время.
Однако, если use_tsc_delay()
был вызван (во время загрузки), он переключает указатель функции на delay_tsc()
, который использует счетчик меток времени (счетчик ЦП) для отметки времени.
Он вызывается любым кодом ядра, которому требуется достаточно надежная функция задержки с высоким разрешением. Вы можете увидеть весь код в ядре, который ссылается на __delay
здесь (довольно много мест).
Я думаю, что с точки зрения профилирования, вероятно, довольно безопасно игнорировать время, потраченное на эту функцию, поскольку ее намерение состоит в задержке. Другими словами, это бесполезная работа, на выполнение которой уходит много времени - если вызывающие абоненты не хотят откладывать, они бы ее не называли.
Некоторые примеры из этого списка:
- Сторожевой таймер использует его для изменения частоты ядер, чтобы их выходные данные не смешивались друг с другом путем задержки для некоторого кратного текущего идентификатора ядра.
- Похоже, драйвер буфера кадров ATI использует его для задержек низкоуровневого доступа к оборудованию. На самом деле он используется для этой цели во многих драйверах устройств.
- Он используется во время запуска, чтобы выяснить связь между jiffies и фактической аппаратной скоростью.