Как реализовать атомарное назначение на AIX / PowerPC? - PullRequest
3 голосов
/ 06 июля 2011

Я портирую расширение ядра на 32/64 битную AIX на многопроцессорном PowerPC, написанном на C. Мне не нужно больше, чем атомарное чтение и атомарная запись (я не использую для извлечения и извлечения).добавить, сравнить-и-поменять и т.д.) Просто чтобы уточнить: для меня «атомарность» означает не только «отсутствие чередования», но и «видимость через несколько ядер».Операции работают с указателями, поэтому операции с переменными 'int' для меня бесполезны.

Если я объявлю переменную "volatile", стандарт C говорит, что переменная может быть изменена неизвестными факторами и поэтому не подлежитна оптимизацию.

Из того, что я читал, кажется, что обычные операции чтения и записи должны выполняться без чередования, и ядра ядра Linux *1006*, похоже, согласны.он говорит:

__asm__ __volatile__("stw%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i));

stw - это «слово магазина», которое предположительно атомарно, но я не знаю, что означает «% U0% X0».Я не понимаю, как эта инструкция по сборке навязывает видимость.Когда я компилирую свое расширение ядра, для желаемого назначения используется «std», но оно также должно быть атомарным для 64-битной машины, из того, что я прочитал.У меня очень мало понимания специфики PowerPC и его набора инструкций, однако я не нашел в списке сборок скомпилированного файла каких-либо инструкций барьера памяти («sync» или «eieio»).

Ядропредоставляет сервис fetch_and_addlp (), который можно использовать для реализации атомарного чтения (например, v = fetch_and_addlp(&x, 0)).

Итак, мои вопросы:

  1. достаточно ли этого дляобъявить переменную «volatile» для достижения атомарности чтения и записи в смысле видимости и отсутствия чередования?

  2. , если ответ на 1 - «нет», как достигается такая атомарность?

  3. что означает "% U0% X0" в атомарной реализации Linux PowerPC?

Ответы [ 2 ]

1 голос
/ 25 августа 2011

В синтаксисе встроенной сборки GCC имеются идиосинкразии.

в строке,

__asm__ __volatile__("stw%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i));

m является выходным операндом, а r является входным операндом. % 1 и% 0 относятся к порядку аргументов (0-> m, 1-> r)

инструкция сборки stw принимает 2 аргумента, а% U0% X0 являются ограничениями для аргументов. Эти ограничения должны заставить GCC проанализировать аргументы и убедиться, что вы не делаете глупостей. Оказывается, `U 'зависит от powerpc (я привык к ограничению X64 :). Полный список ограничений можно найти в:

http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints

0 голосов
/ 27 июля 2011

Мне удалось ответить на вопросы 1 и 2, но не 3:

  1. Нет, этого недостаточно.
  2. Барьеры памяти все еще требуются.Я использовал XLC, встроенный в __lwsync ().Это должно как предотвратить переупорядочение процессором, так и опубликовать изменение на других процессорах.
...