Как я могу сказать компилятору / ЦПУ выполнять инструкции вплотную в коде пространства ядра? - PullRequest
0 голосов
/ 26 марта 2020

Как я могу сказать компилятору не оптимизировать и не добавлять какие-либо другие инструкции между ними и заставить ЦП выполнять их вплотную?

Например, я бы хотел, чтобы модуль ядра выполнялся писать (или читать или смешивать) команды как можно быстрее

writel(0, addr);
writel(1, addr);
writel(0, addr);

или

writel(0, addr1);
writel(1, addr2);
writel(0, addr3);

Редактировать:

  • Я заменил iowrite32 с writel, который имеет определение с volatile void __iomem *addr

  • addr*, может быть выделено с dma_alloc_coherent() или просто ioremap().

  • Мой вопрос не о порядке выполнения (который решается с помощью барьера памяти или volatile), а о задержке между ними.

  • Может быть возможно объединить мои команды в одном сборка asm volatile() но я бы предпочел использовать что-нибудь более безопасное.

1 Ответ

0 голосов
/ 26 марта 2020

Как правило, единственный надежный способ убедиться, что определенная последовательность инструкций выполняется последовательно, - записать их все в одном выражении asm volatile.

Руководство * g cc говорит об этом в явном виде (6.47.2.2):

Не ожидайте, что последовательность ассемблерных операторов останется идеально последовательной после компиляции, даже если вы используете volatile квалификатор. Если определенные инструкции должны оставаться последовательными в выходных данных, поместите их в один оператор asm из нескольких инструкций.

Я не уверен, какую архитектуру вы имеете в виду, но для вашего второго примера, в частности, компилятору может потребоваться выполнить некоторую работу перед каждым writel, чтобы получить соответствующий адрес в соответствующем регистр. Чтобы удовлетворить ваши требования, вы бы хотели, чтобы он выполнил всю эту работу заранее, и я не знаю ни одного способа заставить это сделать это.

Обычно указание компилятору «не оптимизировать» Совершенная sh противоположность того, что вы хотите. Например, в вашем первом примере без оптимизации компилятор, вероятно, не поймет, что он может хранить addr в одном и том же регистре, и будет генерировать код для его перезагрузки каждый раз.

...