요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
=================
SoundWire Locking
=================
This document explains locking mechanism of the SoundWire Bus. Bus uses
following locks in order to avoid race conditions in Bus operations on
shared resources.
- Bus lock
- Message lock
Bus lock
========
SoundWire Bus lock is a mutex and is part of Bus data structure
(sdw_bus) which is used for every Bus instance. This lock is used to
serialize each of the following operations(s) within SoundWire Bus instance.
- Addition and removal of Slave(s), changing Slave status.
- Prepare, Enable, Disable and De-prepare stream operations.
- Access of Stream data structure.
Message lock
============
SoundWire message transfer lock. This mutex is part of
Bus data structure (sdw_bus). This lock is used to serialize the message
transfers (read/write) within a SoundWire Bus instance.
Below examples show how locks are acquired.
Example 1
---------
Message transfer.
1. For every message transfer
a. Acquire Message lock.
b. Transfer message (Read/Write) to Slave1 or broadcast message on
Bus in case of bank switch.
c. Release Message lock
::
+----------+ +---------+
| | | |
| Bus | | Master |
| | | Driver |
| | | |
+----+-----+ +----+----+
| |
| bus->ops->xfer_msg() |
<-------------------------------+ a. Acquire Message lock
| | b. Transfer message
| |
+-------------------------------> c. Release Message lock
| return success/error | d. Return success/error
| |
+ +
Example 2
---------
Prepare operation.
1. Acquire lock for Bus instance associated with Master 1.
2. For every message transfer in Prepare operation
a. Acquire Message lock.
b. Transfer message (Read/Write) to Slave1 or broadcast message on
Bus in case of bank switch.
c. Release Message lock.
3. Release lock for Bus instance associated with Master 1 ::
+----------+ +---------+
| | | |
| Bus | | Master |
| | | Driver |
| | | |
+----+-----+ +----+----+
| |
| sdw_prepare_stream() |
<-------------------------------+ 1. Acquire bus lock
| | 2. Perform stream prepare
| |
| |
| bus->ops->xfer_msg() |
<-------------------------------+ a. Acquire Message lock
| | b. Transfer message
| |
+-------------------------------> c. Release Message lock
| return success/error | d. Return success/error
| |
| |
| return success/error | 3. Release bus lock
+-------------------------------> 4. Return success/error
| |
+ +
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
Locking mechanism 개요
1-12SoundWire Bus는 shared resource를 다루는 bus operation의 race condition을 피하기 위해 두 가지 lock을 사용합니다.
두 lock은 bus instance 전체 상태를 보호하는 Bus lock과 개별 message transfer를 serialize하는 Message lock입니다.
=================
SoundWire Locking
=================
This document explains locking mechanism of the SoundWire Bus. Bus uses
following locks in order to avoid race conditions in Bus operations on
shared resources.
- Bus lock
- Message lock
Bus lock
13-25SoundWire Bus lock은 mutex이며 각 Bus instance가 사용하는 Bus data structure `sdw_bus`에 포함됩니다.
이 lock은 하나의 SoundWire Bus instance 안에서 Slave 추가·제거와 Slave status 변경, stream의 Prepare·Enable·Disable·De-prepare operation, Stream data structure 접근을 serialize합니다.
Bus lock
========
SoundWire Bus lock is a mutex and is part of Bus data structure
(sdw_bus) which is used for every Bus instance. This lock is used to
serialize each of the following operations(s) within SoundWire Bus instance.
- Addition and removal of Slave(s), changing Slave status.
- Prepare, Enable, Disable and De-prepare stream operations.
- Access of Stream data structure.
Message lock
26-34SoundWire message transfer lock도 `sdw_bus`에 포함된 mutex입니다.
Message lock은 하나의 SoundWire Bus instance 안에서 read/write message transfer를 serialize합니다. 다음 두 예시는 Message lock 단독 사용과 Bus lock 안에서의 중첩 사용을 보여 줍니다.
Message lock은 전송 단위를 보호하고 Bus lock은 더 긴 bus operation 전체를 보호합니다.
Message lock
============
SoundWire message transfer lock. This mutex is part of
Bus data structure (sdw_bus). This lock is used to serialize the message
transfers (read/write) within a SoundWire Bus instance.
Below examples show how locks are acquired.
Example 1: Message transfer
35-66모든 message transfer는 먼저 Message lock을 acquire합니다. 그다음 `Slave1`에 read/write message를 전송하거나, bank switch인 경우 Bus에 broadcast message를 보냅니다.
전송이 끝나면 Message lock을 release하고 `bus->ops->xfer_msg()` 호출자에게 success 또는 error를 반환합니다.
원문의 Bus와 Master Driver ASCII sequence를 lock lifecycle 중심으로 다시 구성했습니다.
Example 1
---------
Message transfer.
1. For every message transfer
a. Acquire Message lock.
b. Transfer message (Read/Write) to Slave1 or broadcast message on
Bus in case of bank switch.
c. Release Message lock
::
+----------+ +---------+
| | | |
| Bus | | Master |
| | | Driver |
| | | |
+----+-----+ +----+----+
| |
| bus->ops->xfer_msg() |
<-------------------------------+ a. Acquire Message lock
| | b. Transfer message
| |
+-------------------------------> c. Release Message lock
| return success/error | d. Return success/error
| |
+ +
Example 2: Prepare operation
67-108Prepare operation은 먼저 Master 1과 연결된 Bus instance의 Bus lock을 acquire합니다.
Prepare 안의 각 message transfer마다 Message lock을 acquire하고, `Slave1`에 read/write message를 전송하거나 bank switch broadcast를 수행한 뒤 Message lock을 release합니다.
모든 stream prepare 작업이 끝나면 Bus lock을 release하고 `sdw_prepare_stream()` 호출자에게 success 또는 error를 반환합니다. 따라서 lock order는 Bus lock이 바깥쪽이고 Message lock이 각 transfer의 안쪽입니다.
원문의 두 계층 ASCII sequence를 outer Bus lock과 inner Message lock 관계로 정리했습니다.
Example 2
---------
Prepare operation.
1. Acquire lock for Bus instance associated with Master 1.
2. For every message transfer in Prepare operation
a. Acquire Message lock.
b. Transfer message (Read/Write) to Slave1 or broadcast message on
Bus in case of bank switch.
c. Release Message lock.
3. Release lock for Bus instance associated with Master 1 ::
+----------+ +---------+
| | | |
| Bus | | Master |
| | | Driver |
| | | |
+----+-----+ +----+----+
| |
| sdw_prepare_stream() |
<-------------------------------+ 1. Acquire bus lock
| | 2. Perform stream prepare
| |
| |
| bus->ops->xfer_msg() |
<-------------------------------+ a. Acquire Message lock
| | b. Transfer message
| |
+-------------------------------> c. Release Message lock
| return success/error | d. Return success/error
| |
| |
| return success/error | 3. Release bus lock
+-------------------------------> 4. Return success/error
| |
+ +
요약과 해설
locking.rst:1-108SoundWire는 `sdw_bus`의 Bus lock으로 topology·stream operation을 serialize하고 Message lock으로 read/write transfer를 serialize합니다. 일반 전송은 Message lock만 사용하지만 stream Prepare는 Bus lock을 먼저 잡고 각 transfer마다 Message lock을 중첩해 사용합니다.