1
#pragma once
2

            
3
#include "envoy/common/io/io_uring.h"
4
#include "envoy/thread_local/thread_local.h"
5

            
6
#include "source/common/common/logger.h"
7

            
8
#include "liburing.h"
9

            
10
namespace Envoy {
11
namespace Io {
12

            
13
bool isIoUringSupported();
14

            
15
struct InjectedCompletion {
16
  InjectedCompletion(os_fd_t fd, Request* user_data, int32_t result)
17
43
      : fd_(fd), user_data_(user_data), result_(result) {}
18

            
19
  const os_fd_t fd_;
20
  Request* user_data_;
21
  const int32_t result_;
22
};
23

            
24
class IoUringImpl : public IoUring,
25
                    public ThreadLocal::ThreadLocalObject,
26
                    protected Logger::Loggable<Logger::Id::io> {
27
public:
28
  IoUringImpl(uint32_t io_uring_size, bool use_submission_queue_polling);
29
  ~IoUringImpl() override;
30

            
31
  os_fd_t registerEventfd() override;
32
  void unregisterEventfd() override;
33
  bool isEventfdRegistered() const override;
34
  void forEveryCompletion(const CompletionCb& completion_cb) override;
35
  IoUringResult prepareAccept(os_fd_t fd, struct sockaddr* remote_addr, socklen_t* remote_addr_len,
36
                              Request* user_data) override;
37
  IoUringResult prepareConnect(os_fd_t fd, const Network::Address::InstanceConstSharedPtr& address,
38
                               Request* user_data) override;
39
  IoUringResult prepareReadv(os_fd_t fd, const struct iovec* iovecs, unsigned nr_vecs, off_t offset,
40
                             Request* user_data) override;
41
  IoUringResult prepareWritev(os_fd_t fd, const struct iovec* iovecs, unsigned nr_vecs,
42
                              off_t offset, Request* user_data) override;
43
  IoUringResult prepareClose(os_fd_t fd, Request* user_data) override;
44
  IoUringResult prepareCancel(Request* cancelling_user_data, Request* user_data) override;
45
  IoUringResult prepareShutdown(os_fd_t fd, int how, Request* user_data) override;
46
  IoUringResult submit() override;
47
  void injectCompletion(os_fd_t fd, Request* user_data, int32_t result) override;
48
  void removeInjectedCompletion(os_fd_t fd) override;
49

            
50
private:
51
  struct io_uring ring_ {};
52
  std::vector<struct io_uring_cqe*> cqes_;
53
  os_fd_t event_fd_{INVALID_SOCKET};
54
  std::list<InjectedCompletion> injected_completions_;
55
};
56

            
57
} // namespace Io
58
} // namespace Envoy