btrace: increase buffer size
authorMarkus Metzger <markus.t.metzger@intel.com>
Wed, 10 Apr 2013 11:43:41 +0000 (13:43 +0200)
committerMarkus Metzger <markus.t.metzger@intel.com>
Thu, 16 Jan 2014 11:58:53 +0000 (12:58 +0100)
Try to allocate as much buffer as we can for each thread with a maximum
of 64KB.

2014-01-16  Markus Metzger  <markus.t.metzger@intel.com>

* common/linux-btrace.c (linux_enable_btrace): Enlarge buffer.

gdb/ChangeLog
gdb/common/linux-btrace.c

index acd6b02d9f6c4343689537898ced1d75cae9b6f2..50c6bcd6988c2e65e94692da115e7e9a10164779 100644 (file)
@@ -1,3 +1,7 @@
+2014-01-16  Markus Metzger  <markus.t.metzger@intel.com>
+
+       * common/linux-btrace.c (linux_enable_btrace): Enlarge buffer.
+
 2014-01-16  Markus Metzger  <markus.t.metzger@intel.com>
 
        * btrace.c (ftrace_new_function): Start counting at one.
index 54740494f2a5a8653d78722a33dfd96e457158da..e469900def3b2d63f80ce4e1e17047a5b1ee1321 100644 (file)
@@ -423,7 +423,7 @@ struct btrace_target_info *
 linux_enable_btrace (ptid_t ptid)
 {
   struct btrace_target_info *tinfo;
-  int pid;
+  int pid, pg;
 
   tinfo = xzalloc (sizeof (*tinfo));
   tinfo->ptid = ptid;
@@ -451,17 +451,22 @@ linux_enable_btrace (ptid_t ptid)
   if (tinfo->file < 0)
     goto err;
 
-  /* We hard-code the trace buffer size.
-     At some later time, we should make this configurable.  */
-  tinfo->size = 1;
-  tinfo->buffer = mmap (NULL, perf_event_mmap_size (tinfo),
-                       PROT_READ, MAP_SHARED, tinfo->file, 0);
-  if (tinfo->buffer == MAP_FAILED)
-    goto err_file;
+  /* We try to allocate as much buffer as we can get.
+     We could allow the user to specify the size of the buffer, but then
+     we'd leave this search for the maximum buffer size to him.  */
+  for (pg = 4; pg >= 0; --pg)
+    {
+      /* The number of pages we request needs to be a power of two.  */
+      tinfo->size = 1 << pg;
+      tinfo->buffer = mmap (NULL, perf_event_mmap_size (tinfo),
+                           PROT_READ, MAP_SHARED, tinfo->file, 0);
+      if (tinfo->buffer == MAP_FAILED)
+       continue;
 
-  return tinfo;
+      return tinfo;
+    }
 
- err_file:
+  /* We were not able to allocate any buffer.  */
   close (tinfo->file);
 
  err: