From 5c7206e45ee74d82c563d675d5d08874092b0b5e Mon Sep 17 00:00:00 2001 From: Colin Watson Date: Wed, 27 Nov 2013 10:06:07 +0000 Subject: [PATCH] Speed up test suite by avoiding fsync Add grub_util_disable_fd_syncs call to turn grub_util_fd_sync calls into no-ops, and use it in programs that copy files but do not need to take special care to sync writes (grub-mknetdir, grub-rescue, grub-mkstandalone). On my laptop, this reduces partmap_test's runtime from 1236 seconds to 204 seconds. --- ChangeLog | 7 +++++++ grub-core/osdep/aros/hostdisk.c | 25 ++++++++++++++++++------- grub-core/osdep/unix/hostdisk.c | 11 ++++++++++- grub-core/osdep/windows/hostdisk.c | 11 ++++++++++- include/grub/emu/hostfile.h | 2 ++ util/grub-install-common.c | 2 +- util/grub-mknetdir.c | 1 + util/grub-mkrescue.c | 3 ++- util/grub-mkstandalone.c | 1 + 9 files changed, 52 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2e0d96e51..4bbec8607 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2013-11-27 Colin Watson + + Add grub_util_disable_fd_syncs call to turn grub_util_fd_sync calls + into no-ops, and use it in programs that copy files but do not need + to take special care to sync writes (grub-mknetdir, grub-rescue, + grub-mkstandalone). + 2013-11-26 Colin Watson * tests/util/grub-fs-tester.in: Execute xorriso from $PATH rather diff --git a/grub-core/osdep/aros/hostdisk.c b/grub-core/osdep/aros/hostdisk.c index 9c0a6c895..b15390766 100644 --- a/grub-core/osdep/aros/hostdisk.c +++ b/grub-core/osdep/aros/hostdisk.c @@ -455,6 +455,8 @@ grub_util_fd_close (grub_util_fd_t fd) } } +static int allow_fd_syncs = 1; + static void grub_util_fd_sync_volume (grub_util_fd_t fd) { @@ -469,17 +471,26 @@ grub_util_fd_sync_volume (grub_util_fd_t fd) void grub_util_fd_sync (grub_util_fd_t fd) { - switch (fd->type) + if (allow_fd_syncs) { - case GRUB_UTIL_FD_FILE: - fsync (fd->fd); - return; - case GRUB_UTIL_FD_DISK: - grub_util_fd_sync_volume (fd); - return; + switch (fd->type) + { + case GRUB_UTIL_FD_FILE: + fsync (fd->fd); + return; + case GRUB_UTIL_FD_DISK: + grub_util_fd_sync_volume (fd); + return; + } } } +void +grub_util_disable_fd_syncs (void) +{ + allow_fd_syncs = 0; +} + void grub_hostdisk_flush_initial_buffer (const char *os_dev __attribute__ ((unused))) { diff --git a/grub-core/osdep/unix/hostdisk.c b/grub-core/osdep/unix/hostdisk.c index 78d4adb71..fc88ed4cc 100644 --- a/grub-core/osdep/unix/hostdisk.c +++ b/grub-core/osdep/unix/hostdisk.c @@ -191,10 +191,19 @@ grub_util_fd_strerror (void) return strerror (errno); } +static int allow_fd_syncs = 1; + void grub_util_fd_sync (grub_util_fd_t fd) { - fsync (fd); + if (allow_fd_syncs) + fsync (fd); +} + +void +grub_util_disable_fd_syncs (void) +{ + allow_fd_syncs = 0; } void diff --git a/grub-core/osdep/windows/hostdisk.c b/grub-core/osdep/windows/hostdisk.c index 6d7d12097..4748a616f 100644 --- a/grub-core/osdep/windows/hostdisk.c +++ b/grub-core/osdep/windows/hostdisk.c @@ -240,10 +240,19 @@ grub_util_fd_write (grub_util_fd_t fd, const char *buf, size_t len) return real_read; } +static int allow_fd_syncs = 1; + void grub_util_fd_sync (grub_util_fd_t fd) { - FlushFileBuffers (fd); + if (allow_fd_syncs) + FlushFileBuffers (fd); +} + +void +grub_util_disable_fd_syncs (void) +{ + allow_fd_syncs = 0; } void diff --git a/include/grub/emu/hostfile.h b/include/grub/emu/hostfile.h index ab01fbce8..8e37d5acb 100644 --- a/include/grub/emu/hostfile.h +++ b/include/grub/emu/hostfile.h @@ -50,6 +50,8 @@ EXPORT_FUNC(grub_util_fd_strerror) (void); void grub_util_fd_sync (grub_util_fd_t fd); void +grub_util_disable_fd_syncs (void); +void EXPORT_FUNC(grub_util_fd_close) (grub_util_fd_t fd); grub_uint64_t diff --git a/util/grub-install-common.c b/util/grub-install-common.c index 7ecef3e59..fcf994d5b 100644 --- a/util/grub-install-common.c +++ b/util/grub-install-common.c @@ -492,7 +492,7 @@ grub_install_make_image_wrap (const char *dir, const char *prefix, memdisk_path, config_path, mkimage_target, note, comp); fflush (fp); - fsync (fileno (fp)); + grub_util_fd_sync (fileno (fp)); fclose (fp); } diff --git a/util/grub-mknetdir.c b/util/grub-mknetdir.c index 3f9170597..40ca7248b 100644 --- a/util/grub-mknetdir.c +++ b/util/grub-mknetdir.c @@ -171,6 +171,7 @@ main (int argc, char *argv[]) const char *pkglibdir; grub_util_host_init (&argc, &argv); + grub_util_disable_fd_syncs (); rootdir = xstrdup ("/srv/tftp"); pkglibdir = grub_util_get_pkglibdir (); diff --git a/util/grub-mkrescue.c b/util/grub-mkrescue.c index 7a76bc37a..b081b3b21 100644 --- a/util/grub-mkrescue.c +++ b/util/grub-mkrescue.c @@ -369,6 +369,7 @@ main (int argc, char *argv[]) const char *pkgdatadir; grub_util_host_init (&argc, &argv); + grub_util_disable_fd_syncs (); pkgdatadir = grub_util_get_pkgdatadir (); @@ -529,7 +530,7 @@ main (int argc, char *argv[]) GRUB_COMPRESSION_AUTO); sz = ftello (sa); fflush (sa); - fsync (fileno (sa)); + grub_util_fd_sync (fileno (sa)); fclose (sa); if (sz > 32768) diff --git a/util/grub-mkstandalone.c b/util/grub-mkstandalone.c index 774af2f79..3097f704d 100644 --- a/util/grub-mkstandalone.c +++ b/util/grub-mkstandalone.c @@ -305,6 +305,7 @@ main (int argc, char *argv[]) int i; grub_util_host_init (&argc, &argv); + grub_util_disable_fd_syncs (); files = xmalloc ((argc + 1) * sizeof (files[0]));