]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Event: don't wakeup dpdk driver since it's spinning on cpu
authorHaomai Wang <haomai@xsky.com>
Wed, 10 Feb 2016 17:07:47 +0000 (01:07 +0800)
committerHaomai Wang <haomai@xsky.com>
Wed, 9 Nov 2016 03:39:20 +0000 (11:39 +0800)
Signed-off-by: Haomai Wang <haomai@xsky.com>
src/msg/async/Event.cc
src/msg/async/Event.h
src/msg/async/dpdk/EventDPDK.h

index 4ededfe595c2b69835650a1c474cc52712026d96..7e49a815ac3da45279b645ac081fb5dcfa0cf0bc 100644 (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;
index 70316211f04850785b9bdeea18869c409aed6e5d..d83e01f5c883f9e060cd27c196e40b10d1b3219a 100644 (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; }
 };
 
 /*
index ba7a1104530753ff8d7e38676c2631cbbea8fcce..3e2aeb0e39e6f013ff0bb21e2f555df2f11f4324 100644 (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