]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/async/Event: add DPDKDriver type to allow userspace event
authorHaomai Wang <haomai@xsky.com>
Tue, 2 Aug 2016 16:10:42 +0000 (00:10 +0800)
committerHaomai Wang <haomai@xsky.com>
Wed, 9 Nov 2016 03:39:20 +0000 (11:39 +0800)
Like epoll, kqueue, select, dpdk backend also need to allow notify EventCenter
when a connection is ready to read/write. So we need to let DPDKStack can kick
EventCenter. DPDKDriver which introduced UserspaceEvent to simulate epoll
event achieve the goal.

Signed-off-by: Haomai Wang <haomai@xsky.com>
src/msg/async/Event.cc
src/msg/async/Event.h
src/msg/async/EventEpoll.cc
src/msg/async/EventEpoll.h
src/msg/async/EventKqueue.cc
src/msg/async/EventKqueue.h
src/msg/async/EventSelect.cc
src/msg/async/EventSelect.h

index 1c35e9daa8d54b16451f0c64d26fcc2c5584b9b2..4ededfe595c2b69835650a1c474cc52712026d96 100644 (file)
 #include "common/errno.h"
 #include "Event.h"
 
+#ifdef HAVE_DPDK
+#include "dpdk/EventDPDK.h"
+#endif
+
 #ifdef HAVE_EPOLL
 #include "EventEpoll.h"
 #else
@@ -102,6 +106,11 @@ int EventCenter::init(int n, unsigned i)
 
   idx = i;
 
+  if (cct->_conf->ms_async_transport_type == "dpdk") {
+#ifdef HAVE_DPDK
+    driver = new DPDKDriver(cct);
+#endif
+  } else {
 #ifdef HAVE_EPOLL
   driver = new EpollDriver(cct);
 #else
@@ -111,13 +120,14 @@ int EventCenter::init(int n, unsigned i)
   driver = new SelectDriver(cct);
 #endif
 #endif
+  }
 
   if (!driver) {
     lderr(cct) << __func__ << " failed to create event driver " << dendl;
     return -1;
   }
 
-  int r = driver->init(n);
+  int r = driver->init(this, n);
   if (r < 0) {
     lderr(cct) << __func__ << " failed to init event driver." << dendl;
     return r;
@@ -343,7 +353,7 @@ int EventCenter::process_events(int timeout_microseconds)
   bool trigger_time = false;
   auto now = clock_type::now();
 
-  bool blocking = pollers.empty() && !external_num_events.load() ? &tv : nullptr;
+  bool blocking = pollers.empty() && !external_num_events.load();
   // If exists external events or poller, don't block
   if (!blocking) {
     tv.tv_sec = 0;
index 21159fac68e4d8480e2e32e9e38a33ab934c0c0f..70316211f04850785b9bdeea18869c409aed6e5d 100644 (file)
@@ -73,7 +73,7 @@ struct FiredFileEvent {
 class EventDriver {
  public:
   virtual ~EventDriver() {}       // we want a virtual destructor!!!
-  virtual int init(int nevent) = 0;
+  virtual int init(EventCenter *center, int nevent) = 0;
   virtual int add_event(int fd, int cur_mask, int mask) = 0;
   virtual int del_event(int fd, int cur_mask, int del_mask) = 0;
   virtual int event_wait(vector<FiredFileEvent> &fired_events, struct timeval *tp) = 0;
index ef478eb11f84f9698677836afb7d1a838f1f6614..17f3a294659c00c056d7bdb124b568c7f574cb51 100644 (file)
@@ -22,7 +22,7 @@
 #undef dout_prefix
 #define dout_prefix *_dout << "EpollDriver."
 
-int EpollDriver::init(int nevent)
+int EpollDriver::init(EventCenter *c, int nevent)
 {
   events = (struct epoll_event*)malloc(sizeof(struct epoll_event)*nevent);
   if (!events) {
index a63e3bc95e05b44c601fd3500e8444c560571e8d..4f43bc8c36d5ec0d705cbb7a673a227b4b312267 100644 (file)
@@ -38,7 +38,7 @@ class EpollDriver : public EventDriver {
       free(events);
   }
 
-  int init(int nevent) override;
+  int init(EventCenter *c, int nevent) override;
   int add_event(int fd, int cur_mask, int add_mask) override;
   int del_event(int fd, int cur_mask, int del_mask) override;
   int resize_events(int newsize) override;
index cbd12449d0204ce9164f84cce32fea302c20f0e9..b4894af10f59369eebfcc60aa853bff1707f49f7 100644 (file)
@@ -97,7 +97,7 @@ int KqueueDriver::test_thread_change(const char* funcname) {
   return 0;
 }
 
-int KqueueDriver::init(int nevent)
+int KqueueDriver::init(EventCenter *c, int nevent)
 {
   // keep track of possible changes of our thread
   // because change of thread kills the kqfd
index 5183e438193b55c36575d59b2edce95f40e7d0ec..24863a93d961956520a0ec47c4cb6607995ec09d 100644 (file)
@@ -56,7 +56,7 @@ class KqueueDriver : public EventDriver {
     sav_max = 0;
   }
 
-  int init(int nevent) override;
+  int init(EventCenter *c, int nevent) override;
   int add_event(int fd, int cur_mask, int add_mask) override;
   int del_event(int fd, int cur_mask, int del_mask) override;
   int resize_events(int newsize) override;
index c0a488a2f59b89c609a0959ed651e8255de87f2b..fdee6ebc3c87d927713befe47be6c5646d55f4e2 100644 (file)
@@ -24,7 +24,7 @@
 #undef dout_prefix
 #define dout_prefix *_dout << "SelectDriver."
 
-int SelectDriver::init(int nevent)
+int SelectDriver::init(EventCenter *c, int nevent)
 {
   ldout(cct, 0) << "Select isn't suitable for production env, just avoid "
                 << "compiling error or special purpose" << dendl;
index 7840c7b67615bdcfe03a2ec46627ad43db5b13f7..b0668d527673f675d4c32794ee9de01a37846e97 100644 (file)
@@ -31,7 +31,7 @@ class SelectDriver : public EventDriver {
   explicit SelectDriver(CephContext *c): max_fd(0), cct(c) {}
   virtual ~SelectDriver() {}
 
-  int init(int nevent) override;
+  int init(EventCenter *c, int nevent) override;
   int add_event(int fd, int cur_mask, int add_mask) override;
   int del_event(int fd, int cur_mask, int del_mask) override;
   int resize_events(int newsize) override;