From: Anton Blanchard Date: Mon, 4 Nov 2013 10:39:20 +0000 (+1100) Subject: Improve performance of large restore commands X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=67c059c29e1fb0cdeacdd2005f955514d8d1fb34;p=binutils-gdb.git Improve performance of large restore commands 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 * target.c (memory_xfer_partial): Cap write to 4KB. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2d6a7517999..7d7a6fcc887 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2013-11-04 Anton Blanchard + + * target.c (memory_xfer_partial): Cap write to 4KB. + 2013-11-01 Tiago Stürmer Daitx * breakpoint.c (create_longjmp_master_breakpoint): Allow libc diff --git a/gdb/target.c b/gdb/target.c index 22d7fb638f8..7aeab79e290 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -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);