Linux kernel v4.4에서 간단한 블록 장치 드라이버 만들어보기

10. ida를 이용한 request-queue의 id 생성

blk_alloc_queue_node함수를 보면 request-queue의 id를 지정하는 코드가 있습니다.

struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)
{
    struct request_queue *q;
	int err;

	q = kmem_cache_alloc_node(blk_requestq_cachep,
				gfp_mask | __GFP_ZERO, node_id);
	if (!q)
		return NULL;

	q->id = ida_simple_get(&blk_queue_ida, 0, 0, gfp_mask);
	if (q->id < 0)
		goto fail_q;

ida_simple_get이라는 함수인데, 여러개의 request-queue가 있을때 각각의 고유한 id를 만들어주는 함수입니다. 이번장은 ida가 어떻게 구현되는지를 알아보겠습니다.

id를 만든다는 것은 간단한 정수 카운터로 만드는 방법도 있겠지만, 정수 카운터가 변수값의 한계까지 증가해서 다시 0이 되버린다면 어떻게 될까요? 또 정수 카운터의 값이 5인데 0번 id가 해지되었다면, 다음 id를 할당할때 5를 할당해야할까요 아니면 0을 할당해야할까요. 0을 할당해야된다면 정수 카운터만으로 0을 할당할 방법이 있을까요?

결국 id 번호를 만드는 것조차 커널처럼 매우 오랫동안 매우 많은 자원을 다루는 대규모 소프트웨어에게는 간단한 문제가 아니라는 것을 알 수 있습니다. 그래서 idr이나 ida같은 알고리즘들이 생겨났습니다. 

ida는 idr을 기반으로 만들어졌으니 먼저 idr 코드를 읽어보고 ida를 읽어보겠습니다.

댓글

댓글 본문
작성자
비밀번호
graphittie 자세히 보기