Contents 1. 하드웨어 가속기 추가 1-1. skcipher 기반 EIP93 암호화 수행 1-2. 비동기 암호화 콜백 루틴 추가 1-3. 성능 측정 결과 소프트웨어 성능 개선 2-1. EIP93 메모리 매핑 구조 개선 2-2. TX 큐 배치 처리 및 흐름 제어
1. 하드웨어 가속기 추가
skcipher 기반 EIP93 암호화 수행 1-1. SIMD Context Optimizations 미지원 MIPS 운영체제의 경우 SIMD 명령어셋을 지원하지 않음 Marvell, X86의 경우 NEON 또는 AVX 명령어셋을 이용하여 병렬처리 가능 ● hw 가속기를 사용하는 이유 메모리 복사 없이 사용자 버퍼를 직접 하드웨어에 전달하여 skb payload 암복호화 수행 ● EIP93 암복호화 수행 처리 1. 메모리 버퍼를 scatterlist 엔트리로 초기화 (내부적으로 page 주소, offset, length 설정) 2. DMA 매핑: mtk_send_req() 3. 하드웨어 디스크립터 생성 후 CDR에 write
비동기 암호화 콜백 루틴 추가 1-2. Offload IPsec 실행 흐름 동기식(순차적) EIP93 동작 구조 장치로 연산 요청을 보낸 다음 다른 일을 하다가 연산 완료 콜백을 통해 깨어나면 멈췄던 지점부터 실행 재개하는 구조입니다 기본 동작 구조는 간단하지만 다뤄야 할 기술적 이슈들이 조금 있습니다. 1. 일단 하드웨어 장치에서 연산이 완료되었는지 알 방법이 필요한데 이벤트 알림 아니면 폴링 방식입니다. EIP93 의 경우 두가지 모두(인터럽트 + busy-wait 폴링)를 쓰고 있습니다. 1. 하드웨어가 암호화 완료 2. PE_RD_COUNT 레지스터 업데이트 (ready = 1) 3. interrupt 발생 4. CPU가 깨어남, tasklet 발생 5. ready = readl(EIP93_REG_PE_RD_COUNT) = 1 6. rdesc = mtk_get_descriptor(mtk) // 메모리 읽기 7. DMA 완료, rdesc->peReady = 1 ● 추가하는 이유
비동기 암호화 콜백 루틴 추가 1-2. EIP93 동작 구조 2. 또 다른 이슈는 데이터 복사를 줄이는 것입니다. 암복호화 이후 ipsec esp encapsulation, decatpsulation, offload 나머지 루틴 으로 인해 실행 흐름이 복잡해지면 자원 관리가 어려워집니다. 장치에서 접근하는 메모리 공간을 연산 수행 중에 유효하게 유지해야하고 연산이 끝난 후에 잘 회수해야합니다. 개선 사항 ipsec encapsulation, decapsulation, offload 나머지 루틴을 콜백 함수에서 수행 장치에서 전달하는 메모리 공간을 연산 수행 중에 유지하고 연산이 끝난 후에 회수 ● 추가하는 이유
성능 측정 결과 1-3. 계측기 구성 frame size: 1420byte Offload OFF + CPU 처리 Offered Load: 17.36 Mbps Offload OFF + EIP-93 처리 Offered Load: 42.5 Mbps Offload ON + CPU 처리 Offered Load: 20 Mbps Offload ON + EIP-93 처리 Offered Load: 65 Mbps ● 암호화 처리 속도 비교
2. 소프트웨어 성능 개선
EIP93 메모리 매핑 구조 개선 2-1. 암복호화를 한번 할 때마다 scatterlist 메모리 할당 -> dma 매핑의 절차를 거칩니다. 중간에 하나라도 잘못되면 암복호화 실패 또는 커널 패닉이 발생합니다. ● 개선 이유 1. sk_buff 를 직접 DMA 매핑 하여 CDR 에 write 2. RDR에서 읽어서 후속 처리 진행
TX 큐 배치 처리 및 흐름 제어 2-2. TX 큐가 유한하기 때문에 흐름 제어가 필요합니다. 입력 큐가 가득 차면 앞쪽 루틴 실행을 잠시 멈췄다가 큐에 공간이 생기면 재개해야합니다. descriptor마다 callback 함수 호출할 경우 오버헤드가 발생합니다. 한번의 tasklet으로 여러 패킷을 처리하면 오버헤드를 감소시킬 수 있습니다. ● 개선 사항