swiotlb 란?

1,198 views
Skip to first unread message

Choonho Son

unread,
Jan 30, 2013, 1:18:30 AM1/30/13
to osin...@googlegroups.com
Linux 에서 swiotlb 의 역할 좀 가르켜 주세요. !!

Min Lee

unread,
Jan 30, 2013, 3:20:41 PM1/30/13
to osin...@googlegroups.com
아...swiotlb..
스토리가 약간 길어지겠네요..

먼저, IOMMU는 하드웨어 장치들이 물리주소가 아닌 자신만의 가상주소를 쓰게하
는 장치죠. 관련일을 하던 친구가 얘기하는걸 들어보니 이 주소변환이 생각보다
짜증나게 구현되어있길래 그 근처에 안갔습니다만..-_-; 이걸 SW로 하겠다는 이
름같은데, 사실 알고보면 전혀 관련없는 두개의 별개의 기법입니다.

http://lwn.net/Articles/91870/ 에 이야기가 소개되어 있습니다.
대충 설명해보죠.. 전통적으로 리눅스는 ZONE_DMA, ZONE_NORMAL,

ZONE_HIGHMEM 세개의 ZONE으로 물리메모리를 관리합니다.
이제 우리의 청춘의 시기를 생각해봅시다..네, 32비트 시절이죠.
32비트 시절, 우리의 행복하던 이 시절엔 꽤 괜찮았습니다.
ZONE_DMA 는 16비트 시절의 유산이라 거의 쓰는 기기도 없었고 DMA도
전체 물리 메모리를 접근할수 있었으니까요..
64비트에서 환경이 좀 달라집니다. (슬픈일이죠. 인생무상입니다.)
이제 ZONE_HIGHMEM도 없어지고 ZONE_NORMAL이 ZONE_DMA 위에서부터 끝까지

를 커버하는데, 이제 사실상 ZONE_NORMAL하나뿐입니다. 이는 메모리관리를 단순

화하는 장점이 있습니다.
하지만 DMA는 여전히 32bit addressing이라 4GB아래로만 접근할수 있습니다.
16메가인 ZONE_DMA는 너무 작고, ZONE_NORMAL은 전체 메모리를 대상으로
하기 때문에 리눅스에선 4GB아래에서만 할당해달라..는걸 지원하지 않게 됩니다.
ZONE_DMA는 너무 작습니다.
당장 생각할수 있는건 ZONE_BIGDMA를 새로 만들어서 4GB까지를 커버하게 하면 되
는데 이러면 너무 메모리관리가 힘들어진다고 합니다. zone들간의 balancing은
아주 골 아퍼진다고 하는데요. (이건 살짝 이해가 가려다가 안가는군요. 결국 리
눅스엔 ZONE_DMA32가 등장합니다. http://lwn.net/Articles/152462/ )
AMD의 처음 64비트는 IOMMU를 도입해서 이에 따라 이문제가 없었습니다.
근데 인텔은 자신들의 구현에서 이걸 빼버렸습니다.
그리고 아이태니엄은 "software I/O translation buffer"를 만들어서 이걸 해결
합니다.
뭐 일종의 편법으로 swiotlb 메모리를 128MB정도 미리 확 떼어놓았다가 DMA요청
에 사용합니다. 이렇게 미리 떼어놓아서 메모리관리의 대상이 아니기때문에 메모
리 낭비가 되고, 이렇게 미리 확보된곳에 bounce buffer를 만들어서 드라이버의
버퍼에게 다시 카피해줍니다. 중간에서 한번 더 카피하기때문에 I/O는 느려집니다.

이 웬 삽질입니까..swiotlb라니..
결국 리눅스에 ZONE_DMA32 가 등장하기때문에 swiotlb 는 필요없다고 생각됩니다
만, 어떤 환경이시길래 swiotlb를 ??


On 1/30/2013 1:18 AM, Choonho Son wrote:
> Linux 에서 swiotlb 의 역할 좀 가르켜 주세요. !!
>
> --
> Google 그룹스 'osinside' 그룹에 가입했으므로 본 메일이 전송되었습니다.
> 이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면
> osinside+u...@googlegroups.com에 이메일을 보내세요.
> 이 그룹에 게시하려면 osin...@googlegroups.com(으)로 이메일을 보내세요.
> http://groups.google.com/group/osinside?hl=ko에서 그룹을 방문하세요.
> 더 많은 옵션을 보려면 https://groups.google.com/groups/opt_out을(를) 방문하
> 세요.
>
>

Choonho Son

unread,
Jan 30, 2013, 8:25:16 PM1/30/13
to osin...@googlegroups.com
Xen 의 Dom0에서 swiotlb를 사용한다고 합니다.
swiotlb가 4G 이상의 physical memory 영역에 대한 유사 DMA operation를 처리하는 것으로 이해 되는데,
문제는 Dom0의 메모리가 2G 로 잡았지만, DomU의 부하가 증가하면서 swiotlb 의 bounce buffer가 부족하다는 에러가 납니다. 

그럼 뭘 분석해야 할까요?
의심1) Dom0가 Physical memory 중 4G 이상에 상주하고 있다?
의심2) Dom0와 DomU 간의 통신(grant table)에 DMA를 사용한다?

Choonho Son

unread,
Jan 30, 2013, 8:42:00 PM1/30/13
to osin...@googlegroups.com

swiotlb

S/W implementation of an IOMMU's translation function

  • set aside large continuous memory region (-> aperture라고 함)
  • swiotlb는 aperture 구간을 DMA가 4G 이상의 메모리 매핑이 필요할 때 사용하는 buffer로 사용
  • 4G 이상의 메모리에 대한 접근이 필요할 때, aperture 에 bounce buffer를 설정함
  • DMA read 시, 메모리에 상주하는 데이터는 bounce buffer에 저장되고 이를 읽음
  • DMA write시, bounce buffer에 write하면, 해당 메모리로 write 됨

swiotlb는 언제 사용하는가?

  • IA64 machine 이거나, IOMMU가 없는 장치
  • x86_64 에서는 기본적으로 사용하지 않음
  • x86_64 에서 4G 이상의 메모리 접근시 IOMMU가 없을 때만 사용

xen에서 IOMMU

  • physical frame (pseudo-physical), PFN : 가상머신이 인식하는 물리메모리 공간
  • machine frame, MFN : 실제 hypervisor가 인식하고 있는 물리메모리 공간

DomU는 physical address space 상에서 동작 (zero -> guest max memory size)
DomU의 Physical frame은 machine frame으로 매핑됨

Xen에서의 swiotlb는 기존 linux의 것과는 조금 다름

  • OS가 4G 이상의 메모리를 원할 때, PFN 대신에 MFN을 제공

Dom0에서 swiotlb를 사용하는 이유

  • DomU가 4G 이상의 메모리에 상주할 때,aperture를 제공
  • DomU의 pseudo-physical address는 machine continuous하지 않을 수 있음, bounce buffer를 제공

Min Lee

unread,
Jan 31, 2013, 3:03:31 AM1/31/13
to osin...@googlegroups.com
아....
xen에서 domU 한테 장치를 직접 주시려고요?? DMA를 직접하게 하시려고??
아.. 그건 좀 힘든 선택이지 않나요..싶습니다만,.. 일단.. 그 얘긴 접고..
(DMA를 직접하게 해서 swiotlb를 써야한다면 그보단 차라리 split driver쪽이 성
능에 좋을것 같은데요. )
xen위에서 돌때 당연히 DMA/IOMMU는 머신주소를 바로 쓸수 있게 수정되서 돌고
요.. 얘네들은 항상 머신주소를 써야하기 때문에.. 구글링해보니 domU가 DMA메모
리를 잡을때 결국 dom0한테 달라고하기때문에 dom0가 가진 aperture가 바닥나면
에러메세지가 나는 모양인데요..

즉, Dom0의 메모리량과 swiotlb가 잡아놓는 메모리량 (aperture의 크기)는 별개
이기때문에
Dom0의 용량을 크게준다고해서 aperture가 커지진 않으니까. 도움이 안될거같은데요

https://bugs.launchpad.net/ubuntu/+source/xen-meta/+bug/162147
http://old-list-archives.xen.org/archives/html/xen-devel/2007-09/msg00138.html

이 링크들에 있는 저런 메세지가 뜨나요?? 여기서는 swiotlb=128 등을 시도해보
라고하네요.. aperture를 크게하라는 얘기죠.. 128도 작으면 더 큰숫자를...

http://fixunix.com/kernel/525109-2-6-25-dma-out-sw-iommu-space-asus-m2n32-amd-8gb-memory.html

여기의 이 친구도 온갖 옵션을 다 시도해보는군요..

iommu=soft swiotlb=65536
iommu=noagp,noaperture swiotlb=512M

하지만 구글링을 해보니 이렇게 aperture를 키우는건 근본적인 해결책은 아닌것
같습니다만..

그냥 DMA가 64비트가 되면 좋겠는데..싶습니다.. pci버스의 어드레스를 두번 보
내서 64비트로 만드는 DAC인가 하는것이 있다는데요...

see also..
M Ben-Yehuda, et al. "Utilizing IOMMUs for Virtualization in Linux and Xen"
> > osinside+u...@googlegroups.com <javascript:>에 이메일을 보내세요.
> > 이 그룹에 게시하려면 osin...@googlegroups.com <javascript:>(으)로 이
> 메일을 보내세요.
> > http://groups.google.com/group/osinside?hl=ko
> <http://groups.google.com/group/osinside?hl=ko>에서 그룹을 방문하세요.
> > 더 많은 옵션을 보려면 https://groups.google.com/groups/opt_out
> <https://groups.google.com/groups/opt_out>을(를) 방문하
> > 세요.

Min Lee

unread,
Jan 31, 2013, 3:09:00 AM1/31/13
to osin...@googlegroups.com
좋은 자료인듯.. 누가 정리한건가요??
암튼, 구태여 domU가 DMA를 하려는 이유가 궁금합니다만.. 성능때문이라면,
swiotlb가 오히려 성능이 떨어지지 않을까요...하는 생각이 드는데요..
DMA가 64bit이면 이런 문제가 없을것같다는 생각..

On 1/30/2013 8:42 PM, Choonho Son wrote:
>
> swiotlb
>
> S/W implementation of an IOMMU's translation function
>
> * set aside large continuous memory region (-> aperture라고 함)
> * swiotlb는 aperture 구간을 DMA가 4G 이상의 메모리 매핑이 필요할 때 사용
> 하는 buffer로 사용
> * 4G 이상의 메모리에 대한 접근이 필요할 때, aperture 에 bounce buffer를
> 설정함
> * DMA read 시, 메모리에 상주하는 데이터는 bounce buffer에 저장되고 이를 읽음
> * DMA write시, bounce buffer에 write하면, 해당 메모리로 write 됨
>
> swiotlb는 언제 사용하는가?
>
> * IA64 machine 이거나, IOMMU가 없는 장치
> * x86_64 에서는 기본적으로 사용하지 않음
> * x86_64 에서 4G 이상의 메모리 접근시 IOMMU가 없을 때만 사용
>
> xen에서 IOMMU
>
> * physical frame (pseudo-physical), PFN : 가상머신이 인식하는 물리메모리 공간
> * machine frame, MFN : 실제 hypervisor가 인식하고 있는 물리메모리 공간
>
> DomU는 physical address space 상에서 동작 (zero -> guest max memory size)
> DomU의 Physical frame은 machine frame으로 매핑됨
>
> Xen에서의 swiotlb는 기존 linux의 것과는 조금 다름
>
> * OS가 4G 이상의 메모리를 원할 때, PFN 대신에 MFN을 제공
>
> Dom0에서 swiotlb를 사용하는 이유
>
> * DomU가 4G 이상의 메모리에 상주할 때,aperture를 제공
> * DomU의 pseudo-physical address는 machine continuous하지 않을 수 있음,
> bounce buffer를 제공
>
>
> On Wednesday, January 30, 2013 3:18:30 PM UTC+9, Choonho Son wrote:
>
> Linux 에서 swiotlb 의 역할 좀 가르켜 주세요. !!
>

Choonho Son

unread,
Jan 31, 2013, 8:22:38 PM1/31/13
to osin...@googlegroups.com
위 논문 중에서 발췌했습니다 ㅋㅋ : Utilizing IOMMUs for Virtualization in Linux and Xen
Reply all
Reply to author
Forward
0 new messages