본문 바로가기
3. 개발 관련/공부 :: c

linux - memory barrier (feat. 기묘한 이야기)

by kyuho.choi 2023. 4. 19.
728x90
반응형

memory barrier 를 사용하다 발견한 신기한 일.
주로 mb/smp_mb 등으로 사용되는 데 개념적인 내용은 아래와 같다.

  • mb : generic memory barrier
  • wmb : write memory barrier
  • rmb : read memory barrier

주로 사용되는 케이스를 생각하면 아래와 같이 특정 mmio reg 등에 r/w 시의 order 및 mb 이전의 code가 확실히 수행되기를 위함이긴 했다.

writel(reg, BIT(15));

wmb();

* reg 의 15번 bit를 set하고 이후의 작업을 수행 전 wmb 를 통한 order를 설정.


writel(mmaped_reg, BIT(15));

mb(); // generic type

* mapping 된 reg의 14번 bit를 set하고 이후의 작업을 수행 전 wmb 를 통한 order를 설정.

특별히 이상한 것도 없는 코드인데, 특정 조건에서만 안된다. 여기에서 안된다는 의미는 register address 의 값이 설정된다는 것이 아니라 해당 bit 설정으로 trigger 되는 동작이 안된다는 말씀.

fpga도 아니고, in-house architecture 도 아니고 글로벌 대기업 메이커 AP인데?. 안되는디?? 왜????

  • mb 이후 충분한(혹은 과한) delay를 설정할 경우 동작 확인
  • mb 이후 매우 짧은 delay 를 설정할 경우 bit set은 되나 operation trigger 는 안됨.

수정한 내용은 다음과 같다.

writel(mmaped_reg, BIT(15));

wmb(); // arch type wmb


단순 하지만 architecture type의 barrier 로 지정하니 정상적으로 동작한다.

음... 정리하고 보니 너무 당연한데?

하지만 신기한 점은 다음과 같다.

writel(mmaped_reg, BIT(15));

rmb();

실제로는 테스트 중 잘못 설정한 해프닝에서 나온 것인데,

1. 실제로 동작은 된다. 이전의 버그는 수정된다.
2. 그런데 operation의 trigger time 이 wmb 로 설정 하는 것 보다 3배 가량 느려진다. 뭐???

이건 정말 모르것다 신기한 것투성이구나야

728x90
반응형

댓글