0
zs_map_object를 호출 할 때 반환 값은 CPU 당 개체입니까? 인터럽트 컨텍스트에서 매핑을 허용 할 수없는 이유는 무엇입니까?zsmalloc에 대한 액세스가 원자 단위로 이루어져야하는 이유
zs_map_object를 호출 할 때 반환 값은 CPU 당 개체입니까? 인터럽트 컨텍스트에서 매핑을 허용 할 수없는 이유는 무엇입니까?zsmalloc에 대한 액세스가 원자 단위로 이루어져야하는 이유
코드를 확인하면 쉽게 볼 수 있습니다.
한 번에 하나의 매핑 만 허용 할 수 있습니다. - 상상 발생하는 경우 매핑을 설정하기 시작 후 인터럽트 화재, 예를 들어, 당신이 가고있다
area = &get_cpu_var(zs_map_area);
area->vm_mm = mm;
if (off + class->size <= PAGE_SIZE) {
/* this object is contained entirely within a page */
area->vm_addr = kmap_atomic(page);
ret = area->vm_addr + off;
goto out;
}
/* this object spans two pages */
pages[0] = page;
pages[1] = get_next_page(page);
그리고 : 이제
살펴 보겠습니다 영역 -> vm_mm = mm 라인 이후. 수행 된 작업은 처리기에서 실행되는 코드에 의해 덮어 쓰여지지만 처리기가 반환 한 후에는 처리 할 코드가 없으므로 버그가 발생합니다.
나는 이유가 보이지 않는다. linux-mm 메일 링리스트에서 묻기를 시도 했습니까? 먼저 Cc Minchan Kim에게 물어볼 것입니다. –