From 058bd8df18656083776a997949f848902c9c32f7 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Thu, 11 Feb 2016 01:07:47 +0800 Subject: [PATCH] Event: don't wakeup dpdk driver since it's spinning on cpu Signed-off-by: Haomai Wang --- src/msg/async/Event.cc | 24 ++++++++++++++++-------- src/msg/async/Event.h | 1 + src/msg/async/dpdk/EventDPDK.h | 2 +- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/msg/async/Event.cc b/src/msg/async/Event.cc index 4ededfe595c2b..7e49a815ac3da 100644 --- a/src/msg/async/Event.cc +++ b/src/msg/async/Event.cc @@ -133,6 +133,12 @@ int EventCenter::init(int n, unsigned i) return r; } + file_events.resize(n); + nevent = n; + + if (!driver->need_wakeup()) + return 0; + int fds[2]; if (pipe(fds) < 0) { lderr(cct) << __func__ << " can't create notify pipe" << dendl; @@ -150,9 +156,7 @@ int EventCenter::init(int n, unsigned i) return r; } - file_events.resize(n); - nevent = n; - return 0; + return r; } EventCenter::~EventCenter() @@ -188,9 +192,11 @@ void EventCenter::set_owner() global_centers, "AsyncMessenger::EventCenter::global_center"); assert(global_centers); global_centers->centers[idx] = this; - notify_handler = new C_handle_notify(this, cct); - int r = create_file_event(notify_receive_fd, EVENT_READABLE, notify_handler); - assert(r == 0); + if (driver->need_wakeup()) { + notify_handler = new C_handle_notify(this, cct); + int r = create_file_event(notify_receive_fd, EVENT_READABLE, notify_handler); + assert(r == 0); + } } } @@ -308,7 +314,7 @@ void EventCenter::delete_time_event(uint64_t id) void EventCenter::wakeup() { // No need to wake up since we never sleep - if (!pollers.empty()) + if (!pollers.empty() || !driver->need_wakeup()) return ; ldout(cct, 2) << __func__ << dendl; @@ -353,16 +359,18 @@ int EventCenter::process_events(int timeout_microseconds) bool trigger_time = false; auto now = clock_type::now(); + auto it = time_events.begin(); bool blocking = pollers.empty() && !external_num_events.load(); // If exists external events or poller, don't block if (!blocking) { + if (it != time_events.end() && now >= it->first) + trigger_time = true; tv.tv_sec = 0; tv.tv_usec = 0; } else { clock_type::time_point shortest; shortest = now + std::chrono::microseconds(timeout_microseconds); - auto it = time_events.begin(); if (it != time_events.end() && shortest >= it->first) { ldout(cct, 10) << __func__ << " shortest is " << shortest << " it->first is " << it->first << dendl; shortest = it->first; diff --git a/src/msg/async/Event.h b/src/msg/async/Event.h index 70316211f0485..d83e01f5c883f 100644 --- a/src/msg/async/Event.h +++ b/src/msg/async/Event.h @@ -78,6 +78,7 @@ class EventDriver { virtual int del_event(int fd, int cur_mask, int del_mask) = 0; virtual int event_wait(vector &fired_events, struct timeval *tp) = 0; virtual int resize_events(int newsize) = 0; + virtual bool need_wakeup() { return true; } }; /* diff --git a/src/msg/async/dpdk/EventDPDK.h b/src/msg/async/dpdk/EventDPDK.h index ba7a110453075..3e2aeb0e39e6f 100644 --- a/src/msg/async/dpdk/EventDPDK.h +++ b/src/msg/async/dpdk/EventDPDK.h @@ -34,7 +34,7 @@ class DPDKDriver : public EventDriver { int del_event(int fd, int cur_mask, int del_mask) override; int resize_events(int newsize) override; int event_wait(vector &fired_events, struct timeval *tp) override; - bool wakeup_support() { return false; } + bool need_wakeup() { return false; } }; #endif //CEPH_EVENTDPDK_H -- 2.39.5