본문 바로가기
Kernel/理解

Scatter Gather List

by 暻煥 2024. 4. 10.

 


scatterlist

  • CPU 및 Device 관점에서의 address와 length 정보 (page 內 offset 정보 포함)
  • page_link 기능
    • SG_CHAIN 설정 時, 현재 sgl은 데이터를 포함하지 않은 link 用 sgl
    • SG_END 설정 時, 현재 sgl은 마지막 sgl이며 data를 가르키고 있음
  • CHAIN이 아닌 경우, page_link는 첫번째 page 정보를 가르킴


SGL Type

  • non-chained SGL
    • 여러개의 SGL이 연속적으로 위치
    • SG_MAX_SINGLE_ALLOC : non-chained SGL의 최대 크기
      • 해당값 초과 時, 자동으로 chained-SGL 적용
  • chained SGL
    • 하나의 chain 內 SGL은 연속적으로 위치
    • 마지막 SGL은 chain을 연결하는 기능
    • SG_CHUNK_SIZE : 각 chain의 최대 크기


SGL API

  • sg_alloc_table(struct sg_table *table, unsigned int nents, gfp_t gfp_mask)
    • non-chained SGL 할당
    • nent값이 SG_MAX_SINGLE_ALLOC 초과 時, chained SGL 할당
  • sg_alloc_table_chained(struct sg_table *table, int nents, struct scatterlist *first_chunk, unsigned nents_first_chunk)
    • chained SGL 할당
    • nents : 할당 요청된 SGL 갯수
    • first_chunk : 이미 존재하는 SGL
    • nents_first_chunk : chain의 갯수
    • 새로 할당되는 SGL은 first_chunk와 chaining 되어 할당
  • __sg_alloc_table(struct sg_table *table, unsigned int nents, unsigned int max_ents, struct scatterlist *first_chunk, unsigned int nents_first_chunk, gfp_t gfp_mask, sg_alloc_fn *alloc_fn)
    • 상황1 : first_chunk = NULL && nents <= max_ents
      • 미리 할당된 SGL이 없는 경우
      • alloc_fn() 함수를 통해서 할당
      • non-chained SGL 생성
    • 상황2: first_chunk = NULL && nents > max_ents
      • 미리 할당된 SGL이 없는 경우
      • 여러개의 chain으로 구성된 SGL 할당
    • 상황3 : first_chunk != NULL && nents <= max_ents
      • 이전에 할당된 SGL 수량이 이미 요청된 수량을 만족하는 경우, 이전 sg_table을 바로 return
    • 상황4 : first_chunk != NULL && nents > max_ents
      • 이전에 할당한 SGL의 수량이 요청된 수량을 만족하지 못하는 경우
      • alloc_fn() 함수를 통해 부족한 수량의 SGL 할당
      • 이전 SGL과 chain 구성

SCSI Command & SGL

  • sg_alloc_table_chained(&cmd->sdb.table, nr_segs, cmd->sdb.table.sgl, SCSI_INLINE_SG_CNT)
    • SCSI Layer에서는 SGL을 통해서 명령어 전달
      • SCSI Layer에서 해당하는 memory 위치는 scatter list로 표현
    • sg_table의 첫번째  두번째 SGL은 static으로 할당된 SGL
    • 추가적인 명령은 chain 형식으로 뒤에 연결되어 전달

참고 및 출처

.

'Kernel > 理解' 카테고리의 다른 글

Block IO 분석  (0) 2024.03.24
Device Tree 분석 (Kernel Source)  (0) 2024.02.02
Device Tree 문법  (0) 2024.02.02
ZRAM 분석  (0) 2024.02.02
ELF 실행 & execve  (0) 2024.02.02