-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy pathuring.c
49 lines (44 loc) · 1.4 KB
/
uring.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include "uring.h"
#include "logger.h"
N_LOG_INIT(Uring);
bool
Uring_Init(Uring* ur, uint32_t capacity) {
*ur = (Uring){0};
struct io_uring_params params = {0};
int res = io_uring_queue_init_params(capacity, &ur->uring, ¶ms);
if (res < 0) {
N_LOGE("io_uring_queue_init_params error ur=%p" N_LOG_ERROR_ERRNO, ur, res);
return false;
}
N_LOGI("init ur=%p fd=%d sqe=%" PRIu32 " cqe=%" PRIu32 " features=0x%" PRIx32, ur,
ur->uring.ring_fd, params.sq_entries, params.cq_entries, params.features);
return true;
}
bool
Uring_Free(Uring* ur) {
int fd = ur->uring.ring_fd;
io_uring_queue_exit(&ur->uring);
N_LOGI("free ur=%p fd=%d alloc-errs=%" PRIu64 " submitted=%" PRIu64 " submit-nonblock=%" PRIu64
" submit-wait=%" PRIu64,
ur, fd, ur->nAllocErrs, ur->nSubmitted, ur->nSubmitNonBlock, ur->nSubmitWait);
return true;
}
void
Uring_Submit_(Uring* ur, uint32_t waitLBound, uint32_t cqeBurst) {
int res = -1;
if (unlikely(ur->nPending >= waitLBound)) {
NDNDPDK_ASSERT(waitLBound >= cqeBurst);
++ur->nSubmitWait;
res = io_uring_submit_and_wait(&ur->uring, cqeBurst);
} else {
++ur->nSubmitNonBlock;
res = io_uring_submit(&ur->uring);
}
if (unlikely(res < 0)) {
N_LOGE("io_uring_submit error ur=%p" N_LOG_ERROR_ERRNO, ur, res);
} else {
ur->nSubmitted += (uint32_t)res;
ur->nQueued -= (uint32_t)res;
ur->nPending += (uint32_t)res;
}
}