IO_URING Completion


Introduction - 소개

이 함수들는 'io_uring'의 I/O 요청 완료를 처리합니다.
아래 요약 코드는 'liburing'이 포함된 cat 예제에서 가져온 것입니다.
다른 방법도 있지만 완료(completion) 관련 기능을 사용할 수 있는 일반적인 방법을 보여줍니다.
하나 이상의 요청이 제출되면 완료될 때까지 기다렸다가 아래와 같이 처리할 수 있습니다.
https://unixism.net/loti/tutorial/cat_liburing.html

  • io_uring_wait_cqe()를 호출하여 완료를 기다릴 수 있습니다.   이 함수는 하나 이상의 완료가 가능할 때까지 차단됩니다.
  • io_uring_cqe 구조의 완료 세부 정보를 채웁니다.
  • 이 구조의 'res' 멤버에는 요청의 일부로 실행된 시스템 호출의 반환 값이 포함되어 있습니다.   예를 들어, io_uring_prep_read()가 요청과 같은 read(2)를 처리하기 위해 호출된 경우, 'res'에는 읽은 문자 수가 포함되거나 0보다 작으면 read(2)에 오류가 발생했음을 나타냅니다.
  • 'io_uring'에서는 제출 측에서 사용자 데이터 필드를 설정할 수 있으며, 그러면 커널을 사용하여 완료 측에서 변경 없이 사용할 수 있습니다.   이를 사용하여 요청을 고유하게 식별할 수 있습니다.   io_uring_cqe_get_data()를 호출하여 'CQE'에서 사용자 데이터 포인터를 가져올 수 있습니다.
  • 완료 시 얻은 정보를 처리한 후에는 'CQE'를 '확인(seen)'으로 표시해야 합니다.   io_uring_cqe_seen() 함수를 사용하여 이를 수행할 수 있습니다.

Reference

📦 int io_uring_wait_cqe(struct io_uring *ring, struct io_uring_cqe **cqe_ptr)

I/O 완료를 반환하고 필요한 경우 이를 기다립니다.

⦿ Parameters
  • ring: io_uring_queue_init()에 의해 설정된 'io_uring' 구조체입니다.
  • cqe_ptr: io_uring_cqe 구조체에 대한 포인터에 대한 포인터입니다.
⦿ Return value
  성공 시 'cqe_ptr'이 채워진 0을 반환하고, 실패 시 -errno를 반환합니다.

📦 int io_uring_wait_cqe_nr(struct io_uring *ring, struct io_uring_cqe **cqe_ptr, unsigned wait_nr)

IO 완료를 반환하고, 즉시 사용할 수 없는 경우 'wait_nr' 완료를 기다립니다.

⦿ Parameters
  • ring: io_uring_queue_init()에 의해 설정된 'io_uring' 구조체입니다.
  • cqe_ptr: io_uring_cqe 구조체에 대한 포인터에 대한 포인터입니다.
  • wait_nr: 기다려야 할 완료 횟수입니다.
⦿ Return value
  성공 시 'cqe_ptr'이 채워진 0을 반환하고, 실패 시 -errno를 반환합니다.

📦 int io_uring_wait_cqes (struct io_uring *ring, struct io_uring_cqe **cqe_ptr, unsigned wait_nr, struct __kernel_timespec *ts, sigset_t *sigmask)

io_uring_wait_cqe()와 비슷하지만, 시간 초과 값도 허용한다는 점이 다릅니다.   'SQE'는 시간 초과를 처리하기 위해 내부적으로 사용됩니다.   이 함수를 사용하는 애플리케이션은 'sqe->user_data'를 'LIBURING_UDATA_TIMEOUT'으로 설정하면 안 됩니다.

'ts'가 지정되면 애플리케이션은 이 함수를 호출하기 전에 io_uring_submit()을 호출할 필요가 없습니다.   이는 내부적으로 수행되기 때문입니다.   이로부터 이 함수는 'SQ'와 'CQ' 처리를 두 스레드 간에 분할하고 동기화 없이 작동할 것으로 예상하는 애플리케이션에 사용하는 것이 안전하지 않다는 결론이 나옵니다.   이 함수는 SQ와 CQ 측면을 모두 조작하기 때문입니다.

⦿ Parameters
  • ring: io_uring_queue_init()에 의해 설정된 'io_uring' 구조체입니다.
  • cqe_ptr: io_uring_cqe 구조체에 대한 포인터에 대한 포인터입니다.
  • wait_nr: 기다릴 완료의 수.
  • ts: __kernel_timespec 구조체에 대한 포인터입니다.
  • sigmask: 차단할 신호 세트인 'sigset_t'에 대한 포인터. 일반적인 신호 마스크는 반환되기 전에 복원됩니다.
⦿ Return value
  성공 시 'cqe_ptr'이 채워진 0을 반환하고, 실패 시 -errno를 반환합니다.

📦 int io_uring_wait_cqe_timeout(struct io_uring *ring, struct io_uring_cqe **cqe_ptr, struct __kernel_timespec *ts)

sigmask 인수를 사용하지 않고 항상 'wait_nr'을 1로 설정한다는 점을 제외하면 io_uring_wait_cqes()와 동일합니다.

📦 int io_uring_peek_cqe(struct io_uring *ring, struct io_uring_cqe **cqe_ptr)

즉시 사용 가능한 경우 I/O 완료를 반환합니다. 기다리지 않습니다.

⦿ Parameters
  • ring: io_uring_queue_init()에 의해 설정된 'io_uring' 구조체입니다.
  • cqe_ptr: io_uring_cqe 구조체에 대한 포인터에 대한 포인터입니다.
⦿ Return value
  성공 시 'cqe_ptr'이 채워진 0을 리턴하고, 실패 시 -errno를 리턴합니다.

📦 unsigned io_uring_peek_batch_cqe(struct io_uring *ring, struct io_uring_cqe **cqes, unsigned count)

가능한 경우 최대 count 만큼의 I/O 완료를 배열에 채워 넣으며, 채워진 완료의 수를 반환합니다.   완료를 기다리지 않습니다.   이 함수에 의해 반환되기 위해서는 이미 완료가 되어 있어야 합니다.

⦿ Parameters
  • ring: io_uring_queue_init()에 의해 설정된 'io_uring' 구조체입니다.
  • cqe_ptr: io_uring_cqe 구조체에 대한 포인터에 대한 포인터입니다.
  • count: 가져올 완료의 개수.
⦿ Return value
  채워진 I/O 완료의 개수를 반환합니다.

📦 void *io_uring_cqe_get_data(const struct io_uring_cqe *cqe)

io_uring_sqe_set_data()으로 설정된 사용자 데이터에 대한 포인터를 반환합니다.

⦿ Parameters
  • cqe: 사용자 데이터 포인터를 가져올 'CQE'에 대한 포인터.
⦿ Return value
  사용자 데이터에 대한 포인터를 반환합니다.

📦 void io_uring_cqe_seen(struct io_uring *ring, struct io_uring_cqe *cqe)

이 함수는 io_uring_peek_cqe() 또는 io_uring_wait_cqe() 호출 후에, 그리고 'CQE'가 응용 프로그램에 의해 처리된 후에 호출되어야 합니다.

⦿ Parameters
  • ring: io_uring_queue_init()에 의해 설정된 'io_uring' 구조체입니다.
  • cqe_ptr: io_uring_cqe 구조체에 대한 포인터에 대한 포인터입니다.

📦 unsigned io_uring_cq_ready(struct io_uring *ring)

원문에 설명이 없음.


⚛ 원문


Email 답글이 올라오면 이메일로 알려드리겠습니다.