From: Haomai Wang Date: Tue, 2 Aug 2016 16:10:42 +0000 (+0800) Subject: msg/async/Event: add DPDKDriver type to allow userspace event X-Git-Tag: v11.1.0~368^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=009d06194b46af735111da7c98268827ed8a5f4a;p=ceph.git msg/async/Event: add DPDKDriver type to allow userspace event 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 --- diff --git a/src/msg/async/Event.cc b/src/msg/async/Event.cc index 1c35e9daa8d5..4ededfe595c2 100644 --- a/src/msg/async/Event.cc +++ b/src/msg/async/Event.cc @@ -17,6 +17,10 @@ #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; diff --git a/src/msg/async/Event.h b/src/msg/async/Event.h index 21159fac68e4..70316211f048 100644 --- a/src/msg/async/Event.h +++ b/src/msg/async/Event.h @@ -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 &fired_events, struct timeval *tp) = 0; diff --git a/src/msg/async/EventEpoll.cc b/src/msg/async/EventEpoll.cc index ef478eb11f84..17f3a294659c 100644 --- a/src/msg/async/EventEpoll.cc +++ b/src/msg/async/EventEpoll.cc @@ -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) { diff --git a/src/msg/async/EventEpoll.h b/src/msg/async/EventEpoll.h index a63e3bc95e05..4f43bc8c36d5 100644 --- a/src/msg/async/EventEpoll.h +++ b/src/msg/async/EventEpoll.h @@ -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; diff --git a/src/msg/async/EventKqueue.cc b/src/msg/async/EventKqueue.cc index cbd12449d020..b4894af10f59 100644 --- a/src/msg/async/EventKqueue.cc +++ b/src/msg/async/EventKqueue.cc @@ -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 diff --git a/src/msg/async/EventKqueue.h b/src/msg/async/EventKqueue.h index 5183e438193b..24863a93d961 100644 --- a/src/msg/async/EventKqueue.h +++ b/src/msg/async/EventKqueue.h @@ -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; diff --git a/src/msg/async/EventSelect.cc b/src/msg/async/EventSelect.cc index c0a488a2f59b..fdee6ebc3c87 100644 --- a/src/msg/async/EventSelect.cc +++ b/src/msg/async/EventSelect.cc @@ -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; diff --git a/src/msg/async/EventSelect.h b/src/msg/async/EventSelect.h index 7840c7b67615..b0668d527673 100644 --- a/src/msg/async/EventSelect.h +++ b/src/msg/async/EventSelect.h @@ -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;