Event: don't wakeup dpdk driver since it's spinning on cpu

Signed-off-by: Haomai Wang <haomai@xsky.com>
This commit is contained in:
Haomai Wang 2016-02-11 01:07:47 +08:00
parent 009d06194b
commit 058bd8df18
3 changed files with 18 additions and 9 deletions

View File

@ -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;

View File

@ -78,6 +78,7 @@ class EventDriver {
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;
virtual int resize_events(int newsize) = 0;
virtual bool need_wakeup() { return true; }
};
/*

View File

@ -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<FiredFileEvent> &fired_events, struct timeval *tp) override;
bool wakeup_support() { return false; }
bool need_wakeup() { return false; }
};
#endif //CEPH_EVENTDPDK_H