Improve performance of large restore commands
authorAnton Blanchard <anton@samba.org>
Mon, 4 Nov 2013 10:39:20 +0000 (21:39 +1100)
committerAnton Blanchard <anton@samba.org>
Mon, 4 Nov 2013 11:18:23 +0000 (22:18 +1100)
I noticed a large (100MB) restore took hours to complete. The problem
is memory_xfer_partial repeatedly mallocs and memcpys the entire
100MB buffer for breakpoint shadow handling only to find a small
portion of it is actually written.

The testcase that originally took hours now takes 50 seconds.

gdb/
2013-07-29  Anton Blanchard  <anton@samba.org>

* target.c (memory_xfer_partial): Cap write to 4KB.

gdb/ChangeLog
gdb/target.c

index 2d6a7517999f0dbceb65a72128917924228600de..7d7a6fcc887ee3e64d45540e0b0ef99c3d02c99c 100644 (file)
@@ -1,3 +1,7 @@
+2013-11-04  Anton Blanchard  <anton@samba.org>
+
+       * target.c (memory_xfer_partial): Cap write to 4KB.
+
 2013-11-01  Tiago Stürmer Daitx  <tdaitx@linux.vnet.ibm.com>
 
        * breakpoint.c (create_longjmp_master_breakpoint): Allow libc
index 22d7fb638f8f748e18ccc2e4b4308877bc008b82..7aeab79e2902a29f1c40e1a5eb591a987938a002 100644 (file)
@@ -1678,6 +1678,13 @@ memory_xfer_partial (struct target_ops *ops, enum target_object object,
       void *buf;
       struct cleanup *old_chain;
 
+      /* A large write request is likely to be partially satisfied
+        by memory_xfer_partial_1.  We will continually malloc
+        and free a copy of the entire write request for breakpoint
+        shadow handling even though we only end up writing a small
+        subset of it.  Cap writes to 4KB to mitigate this.  */
+      len = min (4096, len);
+
       buf = xmalloc (len);
       old_chain = make_cleanup (xfree, buf);
       memcpy (buf, writebuf, len);