ringbuf.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684
  1. // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
  2. /*
  3. * Ring buffer operations.
  4. *
  5. * Copyright (C) 2020 Facebook, Inc.
  6. */
  7. #ifndef _GNU_SOURCE
  8. #define _GNU_SOURCE
  9. #endif
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <errno.h>
  13. #include <unistd.h>
  14. #include <linux/err.h>
  15. #include <linux/bpf.h>
  16. #include <asm/barrier.h>
  17. #include <sys/mman.h>
  18. #include <sys/epoll.h>
  19. #include <time.h>
  20. #include "libbpf.h"
  21. #include "libbpf_internal.h"
  22. #include "bpf.h"
  23. struct ring {
  24. ring_buffer_sample_fn sample_cb;
  25. void *ctx;
  26. void *data;
  27. unsigned long *consumer_pos;
  28. unsigned long *producer_pos;
  29. unsigned long mask;
  30. int map_fd;
  31. };
  32. struct ring_buffer {
  33. struct epoll_event *events;
  34. struct ring **rings;
  35. size_t page_size;
  36. int epoll_fd;
  37. int ring_cnt;
  38. };
  39. struct user_ring_buffer {
  40. struct epoll_event event;
  41. unsigned long *consumer_pos;
  42. unsigned long *producer_pos;
  43. void *data;
  44. unsigned long mask;
  45. size_t page_size;
  46. int map_fd;
  47. int epoll_fd;
  48. };
  49. /* 8-byte ring buffer header structure */
  50. struct ringbuf_hdr {
  51. __u32 len;
  52. __u32 pad;
  53. };
  54. static void ringbuf_free_ring(struct ring_buffer *rb, struct ring *r)
  55. {
  56. if (r->consumer_pos) {
  57. munmap(r->consumer_pos, rb->page_size);
  58. r->consumer_pos = NULL;
  59. }
  60. if (r->producer_pos) {
  61. munmap(r->producer_pos, rb->page_size + 2 * (r->mask + 1));
  62. r->producer_pos = NULL;
  63. }
  64. free(r);
  65. }
  66. /* Add extra RINGBUF maps to this ring buffer manager */
  67. int ring_buffer__add(struct ring_buffer *rb, int map_fd,
  68. ring_buffer_sample_fn sample_cb, void *ctx)
  69. {
  70. struct bpf_map_info info;
  71. __u32 len = sizeof(info);
  72. struct epoll_event *e;
  73. struct ring *r;
  74. __u64 mmap_sz;
  75. void *tmp;
  76. int err;
  77. memset(&info, 0, sizeof(info));
  78. err = bpf_map_get_info_by_fd(map_fd, &info, &len);
  79. if (err) {
  80. err = -errno;
  81. pr_warn("ringbuf: failed to get map info for fd=%d: %s\n",
  82. map_fd, errstr(err));
  83. return libbpf_err(err);
  84. }
  85. if (info.type != BPF_MAP_TYPE_RINGBUF) {
  86. pr_warn("ringbuf: map fd=%d is not BPF_MAP_TYPE_RINGBUF\n",
  87. map_fd);
  88. return libbpf_err(-EINVAL);
  89. }
  90. tmp = libbpf_reallocarray(rb->rings, rb->ring_cnt + 1, sizeof(*rb->rings));
  91. if (!tmp)
  92. return libbpf_err(-ENOMEM);
  93. rb->rings = tmp;
  94. tmp = libbpf_reallocarray(rb->events, rb->ring_cnt + 1, sizeof(*rb->events));
  95. if (!tmp)
  96. return libbpf_err(-ENOMEM);
  97. rb->events = tmp;
  98. r = calloc(1, sizeof(*r));
  99. if (!r)
  100. return libbpf_err(-ENOMEM);
  101. rb->rings[rb->ring_cnt] = r;
  102. r->map_fd = map_fd;
  103. r->sample_cb = sample_cb;
  104. r->ctx = ctx;
  105. r->mask = info.max_entries - 1;
  106. /* Map writable consumer page */
  107. tmp = mmap(NULL, rb->page_size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0);
  108. if (tmp == MAP_FAILED) {
  109. err = -errno;
  110. pr_warn("ringbuf: failed to mmap consumer page for map fd=%d: %s\n",
  111. map_fd, errstr(err));
  112. goto err_out;
  113. }
  114. r->consumer_pos = tmp;
  115. /* Map read-only producer page and data pages. We map twice as big
  116. * data size to allow simple reading of samples that wrap around the
  117. * end of a ring buffer. See kernel implementation for details.
  118. */
  119. mmap_sz = rb->page_size + 2 * (__u64)info.max_entries;
  120. if (mmap_sz != (__u64)(size_t)mmap_sz) {
  121. err = -E2BIG;
  122. pr_warn("ringbuf: ring buffer size (%u) is too big\n", info.max_entries);
  123. goto err_out;
  124. }
  125. tmp = mmap(NULL, (size_t)mmap_sz, PROT_READ, MAP_SHARED, map_fd, rb->page_size);
  126. if (tmp == MAP_FAILED) {
  127. err = -errno;
  128. pr_warn("ringbuf: failed to mmap data pages for map fd=%d: %s\n",
  129. map_fd, errstr(err));
  130. goto err_out;
  131. }
  132. r->producer_pos = tmp;
  133. r->data = tmp + rb->page_size;
  134. e = &rb->events[rb->ring_cnt];
  135. memset(e, 0, sizeof(*e));
  136. e->events = EPOLLIN;
  137. e->data.fd = rb->ring_cnt;
  138. if (epoll_ctl(rb->epoll_fd, EPOLL_CTL_ADD, map_fd, e) < 0) {
  139. err = -errno;
  140. pr_warn("ringbuf: failed to epoll add map fd=%d: %s\n",
  141. map_fd, errstr(err));
  142. goto err_out;
  143. }
  144. rb->ring_cnt++;
  145. return 0;
  146. err_out:
  147. ringbuf_free_ring(rb, r);
  148. return libbpf_err(err);
  149. }
  150. void ring_buffer__free(struct ring_buffer *rb)
  151. {
  152. int i;
  153. if (!rb)
  154. return;
  155. for (i = 0; i < rb->ring_cnt; ++i)
  156. ringbuf_free_ring(rb, rb->rings[i]);
  157. if (rb->epoll_fd >= 0)
  158. close(rb->epoll_fd);
  159. free(rb->events);
  160. free(rb->rings);
  161. free(rb);
  162. }
  163. struct ring_buffer *
  164. ring_buffer__new(int map_fd, ring_buffer_sample_fn sample_cb, void *ctx,
  165. const struct ring_buffer_opts *opts)
  166. {
  167. struct ring_buffer *rb;
  168. int err;
  169. if (!OPTS_VALID(opts, ring_buffer_opts))
  170. return errno = EINVAL, NULL;
  171. rb = calloc(1, sizeof(*rb));
  172. if (!rb)
  173. return errno = ENOMEM, NULL;
  174. rb->page_size = getpagesize();
  175. rb->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
  176. if (rb->epoll_fd < 0) {
  177. err = -errno;
  178. pr_warn("ringbuf: failed to create epoll instance: %s\n", errstr(err));
  179. goto err_out;
  180. }
  181. err = ring_buffer__add(rb, map_fd, sample_cb, ctx);
  182. if (err)
  183. goto err_out;
  184. return rb;
  185. err_out:
  186. ring_buffer__free(rb);
  187. return errno = -err, NULL;
  188. }
  189. static inline int roundup_len(__u32 len)
  190. {
  191. /* clear out top 2 bits (discard and busy, if set) */
  192. len <<= 2;
  193. len >>= 2;
  194. /* add length prefix */
  195. len += BPF_RINGBUF_HDR_SZ;
  196. /* round up to 8 byte alignment */
  197. return (len + 7) / 8 * 8;
  198. }
  199. static int64_t ringbuf_process_ring(struct ring *r, size_t n)
  200. {
  201. int *len_ptr, len, err;
  202. /* 64-bit to avoid overflow in case of extreme application behavior */
  203. int64_t cnt = 0;
  204. unsigned long cons_pos, prod_pos;
  205. bool got_new_data;
  206. void *sample;
  207. cons_pos = smp_load_acquire(r->consumer_pos);
  208. do {
  209. got_new_data = false;
  210. prod_pos = smp_load_acquire(r->producer_pos);
  211. while (cons_pos < prod_pos) {
  212. len_ptr = r->data + (cons_pos & r->mask);
  213. len = smp_load_acquire(len_ptr);
  214. /* sample not committed yet, bail out for now */
  215. if (len & BPF_RINGBUF_BUSY_BIT)
  216. goto done;
  217. got_new_data = true;
  218. cons_pos += roundup_len(len);
  219. if ((len & BPF_RINGBUF_DISCARD_BIT) == 0) {
  220. sample = (void *)len_ptr + BPF_RINGBUF_HDR_SZ;
  221. err = r->sample_cb(r->ctx, sample, len);
  222. if (err < 0) {
  223. /* update consumer pos and bail out */
  224. smp_store_release(r->consumer_pos,
  225. cons_pos);
  226. return err;
  227. }
  228. cnt++;
  229. }
  230. smp_store_release(r->consumer_pos, cons_pos);
  231. if (cnt >= n)
  232. goto done;
  233. }
  234. } while (got_new_data);
  235. done:
  236. return cnt;
  237. }
  238. /* Consume available ring buffer(s) data without event polling, up to n
  239. * records.
  240. *
  241. * Returns number of records consumed across all registered ring buffers (or
  242. * n, whichever is less), or negative number if any of the callbacks return
  243. * error.
  244. */
  245. int ring_buffer__consume_n(struct ring_buffer *rb, size_t n)
  246. {
  247. int64_t err, res = 0;
  248. int i;
  249. for (i = 0; i < rb->ring_cnt; i++) {
  250. struct ring *ring = rb->rings[i];
  251. err = ringbuf_process_ring(ring, n);
  252. if (err < 0)
  253. return libbpf_err(err);
  254. res += err;
  255. n -= err;
  256. if (n == 0)
  257. break;
  258. }
  259. return res > INT_MAX ? INT_MAX : res;
  260. }
  261. /* Consume available ring buffer(s) data without event polling.
  262. * Returns number of records consumed across all registered ring buffers (or
  263. * INT_MAX, whichever is less), or negative number if any of the callbacks
  264. * return error.
  265. */
  266. int ring_buffer__consume(struct ring_buffer *rb)
  267. {
  268. int64_t err, res = 0;
  269. int i;
  270. for (i = 0; i < rb->ring_cnt; i++) {
  271. struct ring *ring = rb->rings[i];
  272. err = ringbuf_process_ring(ring, INT_MAX);
  273. if (err < 0)
  274. return libbpf_err(err);
  275. res += err;
  276. if (res > INT_MAX) {
  277. res = INT_MAX;
  278. break;
  279. }
  280. }
  281. return res;
  282. }
  283. /* Poll for available data and consume records, if any are available.
  284. * Returns number of records consumed (or INT_MAX, whichever is less), or
  285. * negative number, if any of the registered callbacks returned error.
  286. */
  287. int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms)
  288. {
  289. int i, cnt;
  290. int64_t err, res = 0;
  291. cnt = epoll_wait(rb->epoll_fd, rb->events, rb->ring_cnt, timeout_ms);
  292. if (cnt < 0)
  293. return libbpf_err(-errno);
  294. for (i = 0; i < cnt; i++) {
  295. __u32 ring_id = rb->events[i].data.fd;
  296. struct ring *ring = rb->rings[ring_id];
  297. err = ringbuf_process_ring(ring, INT_MAX);
  298. if (err < 0)
  299. return libbpf_err(err);
  300. res += err;
  301. }
  302. if (res > INT_MAX)
  303. res = INT_MAX;
  304. return res;
  305. }
  306. /* Get an fd that can be used to sleep until data is available in the ring(s) */
  307. int ring_buffer__epoll_fd(const struct ring_buffer *rb)
  308. {
  309. return rb->epoll_fd;
  310. }
  311. struct ring *ring_buffer__ring(struct ring_buffer *rb, unsigned int idx)
  312. {
  313. if (idx >= rb->ring_cnt)
  314. return errno = ERANGE, NULL;
  315. return rb->rings[idx];
  316. }
  317. unsigned long ring__consumer_pos(const struct ring *r)
  318. {
  319. /* Synchronizes with smp_store_release() in ringbuf_process_ring(). */
  320. return smp_load_acquire(r->consumer_pos);
  321. }
  322. unsigned long ring__producer_pos(const struct ring *r)
  323. {
  324. /* Synchronizes with smp_store_release() in __bpf_ringbuf_reserve() in
  325. * the kernel.
  326. */
  327. return smp_load_acquire(r->producer_pos);
  328. }
  329. size_t ring__avail_data_size(const struct ring *r)
  330. {
  331. unsigned long cons_pos, prod_pos;
  332. cons_pos = ring__consumer_pos(r);
  333. prod_pos = ring__producer_pos(r);
  334. return prod_pos - cons_pos;
  335. }
  336. size_t ring__size(const struct ring *r)
  337. {
  338. return r->mask + 1;
  339. }
  340. int ring__map_fd(const struct ring *r)
  341. {
  342. return r->map_fd;
  343. }
  344. int ring__consume_n(struct ring *r, size_t n)
  345. {
  346. int64_t res;
  347. res = ringbuf_process_ring(r, n);
  348. if (res < 0)
  349. return libbpf_err(res);
  350. return res > INT_MAX ? INT_MAX : res;
  351. }
  352. int ring__consume(struct ring *r)
  353. {
  354. return ring__consume_n(r, INT_MAX);
  355. }
  356. static void user_ringbuf_unmap_ring(struct user_ring_buffer *rb)
  357. {
  358. if (rb->consumer_pos) {
  359. munmap(rb->consumer_pos, rb->page_size);
  360. rb->consumer_pos = NULL;
  361. }
  362. if (rb->producer_pos) {
  363. munmap(rb->producer_pos, rb->page_size + 2 * (rb->mask + 1));
  364. rb->producer_pos = NULL;
  365. }
  366. }
  367. void user_ring_buffer__free(struct user_ring_buffer *rb)
  368. {
  369. if (!rb)
  370. return;
  371. user_ringbuf_unmap_ring(rb);
  372. if (rb->epoll_fd >= 0)
  373. close(rb->epoll_fd);
  374. free(rb);
  375. }
  376. static int user_ringbuf_map(struct user_ring_buffer *rb, int map_fd)
  377. {
  378. struct bpf_map_info info;
  379. __u32 len = sizeof(info);
  380. __u64 mmap_sz;
  381. void *tmp;
  382. struct epoll_event *rb_epoll;
  383. int err;
  384. memset(&info, 0, sizeof(info));
  385. err = bpf_map_get_info_by_fd(map_fd, &info, &len);
  386. if (err) {
  387. err = -errno;
  388. pr_warn("user ringbuf: failed to get map info for fd=%d: %s\n",
  389. map_fd, errstr(err));
  390. return err;
  391. }
  392. if (info.type != BPF_MAP_TYPE_USER_RINGBUF) {
  393. pr_warn("user ringbuf: map fd=%d is not BPF_MAP_TYPE_USER_RINGBUF\n", map_fd);
  394. return -EINVAL;
  395. }
  396. rb->map_fd = map_fd;
  397. rb->mask = info.max_entries - 1;
  398. /* Map read-only consumer page */
  399. tmp = mmap(NULL, rb->page_size, PROT_READ, MAP_SHARED, map_fd, 0);
  400. if (tmp == MAP_FAILED) {
  401. err = -errno;
  402. pr_warn("user ringbuf: failed to mmap consumer page for map fd=%d: %s\n",
  403. map_fd, errstr(err));
  404. return err;
  405. }
  406. rb->consumer_pos = tmp;
  407. /* Map read-write the producer page and data pages. We map the data
  408. * region as twice the total size of the ring buffer to allow the
  409. * simple reading and writing of samples that wrap around the end of
  410. * the buffer. See the kernel implementation for details.
  411. */
  412. mmap_sz = rb->page_size + 2 * (__u64)info.max_entries;
  413. if (mmap_sz != (__u64)(size_t)mmap_sz) {
  414. pr_warn("user ringbuf: ring buf size (%u) is too big\n", info.max_entries);
  415. return -E2BIG;
  416. }
  417. tmp = mmap(NULL, (size_t)mmap_sz, PROT_READ | PROT_WRITE, MAP_SHARED,
  418. map_fd, rb->page_size);
  419. if (tmp == MAP_FAILED) {
  420. err = -errno;
  421. pr_warn("user ringbuf: failed to mmap data pages for map fd=%d: %s\n",
  422. map_fd, errstr(err));
  423. return err;
  424. }
  425. rb->producer_pos = tmp;
  426. rb->data = tmp + rb->page_size;
  427. rb_epoll = &rb->event;
  428. rb_epoll->events = EPOLLOUT;
  429. if (epoll_ctl(rb->epoll_fd, EPOLL_CTL_ADD, map_fd, rb_epoll) < 0) {
  430. err = -errno;
  431. pr_warn("user ringbuf: failed to epoll add map fd=%d: %s\n", map_fd, errstr(err));
  432. return err;
  433. }
  434. return 0;
  435. }
  436. struct user_ring_buffer *
  437. user_ring_buffer__new(int map_fd, const struct user_ring_buffer_opts *opts)
  438. {
  439. struct user_ring_buffer *rb;
  440. int err;
  441. if (!OPTS_VALID(opts, user_ring_buffer_opts))
  442. return errno = EINVAL, NULL;
  443. rb = calloc(1, sizeof(*rb));
  444. if (!rb)
  445. return errno = ENOMEM, NULL;
  446. rb->page_size = getpagesize();
  447. rb->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
  448. if (rb->epoll_fd < 0) {
  449. err = -errno;
  450. pr_warn("user ringbuf: failed to create epoll instance: %s\n", errstr(err));
  451. goto err_out;
  452. }
  453. err = user_ringbuf_map(rb, map_fd);
  454. if (err)
  455. goto err_out;
  456. return rb;
  457. err_out:
  458. user_ring_buffer__free(rb);
  459. return errno = -err, NULL;
  460. }
  461. static void user_ringbuf_commit(struct user_ring_buffer *rb, void *sample, bool discard)
  462. {
  463. __u32 new_len;
  464. struct ringbuf_hdr *hdr;
  465. uintptr_t hdr_offset;
  466. hdr_offset = rb->mask + 1 + (sample - rb->data) - BPF_RINGBUF_HDR_SZ;
  467. hdr = rb->data + (hdr_offset & rb->mask);
  468. new_len = hdr->len & ~BPF_RINGBUF_BUSY_BIT;
  469. if (discard)
  470. new_len |= BPF_RINGBUF_DISCARD_BIT;
  471. /* Synchronizes with smp_load_acquire() in __bpf_user_ringbuf_peek() in
  472. * the kernel.
  473. */
  474. __atomic_exchange_n(&hdr->len, new_len, __ATOMIC_ACQ_REL);
  475. }
  476. void user_ring_buffer__discard(struct user_ring_buffer *rb, void *sample)
  477. {
  478. user_ringbuf_commit(rb, sample, true);
  479. }
  480. void user_ring_buffer__submit(struct user_ring_buffer *rb, void *sample)
  481. {
  482. user_ringbuf_commit(rb, sample, false);
  483. }
  484. void *user_ring_buffer__reserve(struct user_ring_buffer *rb, __u32 size)
  485. {
  486. __u32 avail_size, total_size, max_size;
  487. /* 64-bit to avoid overflow in case of extreme application behavior */
  488. __u64 cons_pos, prod_pos;
  489. struct ringbuf_hdr *hdr;
  490. /* The top two bits are used as special flags */
  491. if (size & (BPF_RINGBUF_BUSY_BIT | BPF_RINGBUF_DISCARD_BIT))
  492. return errno = E2BIG, NULL;
  493. /* Synchronizes with smp_store_release() in __bpf_user_ringbuf_peek() in
  494. * the kernel.
  495. */
  496. cons_pos = smp_load_acquire(rb->consumer_pos);
  497. /* Synchronizes with smp_store_release() in user_ringbuf_commit() */
  498. prod_pos = smp_load_acquire(rb->producer_pos);
  499. max_size = rb->mask + 1;
  500. avail_size = max_size - (prod_pos - cons_pos);
  501. /* Round up total size to a multiple of 8. */
  502. total_size = (size + BPF_RINGBUF_HDR_SZ + 7) / 8 * 8;
  503. if (total_size > max_size)
  504. return errno = E2BIG, NULL;
  505. if (avail_size < total_size)
  506. return errno = ENOSPC, NULL;
  507. hdr = rb->data + (prod_pos & rb->mask);
  508. hdr->len = size | BPF_RINGBUF_BUSY_BIT;
  509. hdr->pad = 0;
  510. /* Synchronizes with smp_load_acquire() in __bpf_user_ringbuf_peek() in
  511. * the kernel.
  512. */
  513. smp_store_release(rb->producer_pos, prod_pos + total_size);
  514. return (void *)rb->data + ((prod_pos + BPF_RINGBUF_HDR_SZ) & rb->mask);
  515. }
  516. static __u64 ns_elapsed_timespec(const struct timespec *start, const struct timespec *end)
  517. {
  518. __u64 start_ns, end_ns, ns_per_s = 1000000000;
  519. start_ns = (__u64)start->tv_sec * ns_per_s + start->tv_nsec;
  520. end_ns = (__u64)end->tv_sec * ns_per_s + end->tv_nsec;
  521. return end_ns - start_ns;
  522. }
  523. void *user_ring_buffer__reserve_blocking(struct user_ring_buffer *rb, __u32 size, int timeout_ms)
  524. {
  525. void *sample;
  526. int err, ms_remaining = timeout_ms;
  527. struct timespec start;
  528. if (timeout_ms < 0 && timeout_ms != -1)
  529. return errno = EINVAL, NULL;
  530. if (timeout_ms != -1) {
  531. err = clock_gettime(CLOCK_MONOTONIC, &start);
  532. if (err)
  533. return NULL;
  534. }
  535. do {
  536. int cnt, ms_elapsed;
  537. struct timespec curr;
  538. __u64 ns_per_ms = 1000000;
  539. sample = user_ring_buffer__reserve(rb, size);
  540. if (sample)
  541. return sample;
  542. else if (errno != ENOSPC)
  543. return NULL;
  544. /* The kernel guarantees at least one event notification
  545. * delivery whenever at least one sample is drained from the
  546. * ring buffer in an invocation to bpf_ringbuf_drain(). Other
  547. * additional events may be delivered at any time, but only one
  548. * event is guaranteed per bpf_ringbuf_drain() invocation,
  549. * provided that a sample is drained, and the BPF program did
  550. * not pass BPF_RB_NO_WAKEUP to bpf_ringbuf_drain(). If
  551. * BPF_RB_FORCE_WAKEUP is passed to bpf_ringbuf_drain(), a
  552. * wakeup event will be delivered even if no samples are
  553. * drained.
  554. */
  555. cnt = epoll_wait(rb->epoll_fd, &rb->event, 1, ms_remaining);
  556. if (cnt < 0)
  557. return NULL;
  558. if (timeout_ms == -1)
  559. continue;
  560. err = clock_gettime(CLOCK_MONOTONIC, &curr);
  561. if (err)
  562. return NULL;
  563. ms_elapsed = ns_elapsed_timespec(&start, &curr) / ns_per_ms;
  564. ms_remaining = timeout_ms - ms_elapsed;
  565. } while (ms_remaining > 0);
  566. /* Try one more time to reserve a sample after the specified timeout has elapsed. */
  567. return user_ring_buffer__reserve(rb, size);
  568. }