mplementação de operação atômica de leitura e gravação no kernel do Linux

ecentemente, espiei a implementação do kernel do Linux de uma leitura e gravação atômica e surgiram algumas pergunta

Primeiro código relevante da arquitetura ia64:

typedef struct {
    int counter;
} atomic_t;

#define atomic_read(v)      (*(volatile int *)&(v)->counter)
#define atomic64_read(v)    (*(volatile long *)&(v)->counter)

#define atomic_set(v,i)     (((v)->counter) = (i))
#define atomic64_set(v,i)   (((v)->counter) = (i))

Nas operações de leitura e gravação, parece que foi adotada a abordagem direta para ler ou gravar na variável. A menos que haja outro truque em algum lugar, não entendo quais garantias existem de que essa operação será atômica no domínio do assembly. Acho que uma resposta óbvia será que essa operação se traduz em um código de operação de montagem, mas, mesmo assim, como isso é garantido quando se leva em conta os diferentes níveis de cache de memória (ou outras otimizações

Nas macros de leitura, o tipo volátil é usado em um truque de conversão. Alguém tem uma idéia de como isso afeta a atomicidade aqui? (Observe que ele não é usado na operação de gravação)

questionAnswers(6)

yourAnswerToTheQuestion