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
반응형
댓글