| From a5d253123fb404116d4c6f6e028aabbce6264e22 Mon Sep 17 00:00:00 2001 |
| From: Evan Green <evgreen@chromium.org> |
| Date: Thu, 8 Jul 2021 15:01:45 -0700 |
| Subject: [PATCH] Use fdatasync instead of O_SYNC on storage |
| |
| Opening the backing files with O_SYNC makes things really slow. So slow |
| in fact that the modem times out after 10 seconds waiting for the last |
| EFS sync to go through. I think this takes forever because rmtfs is |
| doing 512-byte reads and writes. |
| |
| One option would be to make this bigger. But a better option is to not |
| use O_SYNC, but explicitly do an fdatasync() after the iovec operation |
| is complete. This is better because 1) it's way faster, we no longer see |
| 10-12 second delays at rebooto time, and 2) partial syncs of the EFS |
| file aren't useful anyway. |
| |
| Use fdatasync() as opposed to fsync() since it's not important for the |
| metadata to be synced, just the file contents. |
| |
| Signed-off-by: Evan Green <evangreen86@gmail.com> |
| --- |
| rmtfs.c | 4 ++++ |
| rmtfs.h | 1 + |
| storage.c | 10 +++++++++- |
| 3 files changed, 14 insertions(+), 1 deletion(-) |
| |
| diff --git a/rmtfs.c b/rmtfs.c |
| index 25862d1..ffca070 100644 |
| --- a/rmtfs.c |
| +++ b/rmtfs.c |
| @@ -220,6 +220,10 @@ static void rmtfs_iovec(int sock, struct qrtr_packet *pkt) |
| respond: |
| dbgprintf("[RMTFS] iovec %d, %sforced => (%d:%d)\n", caller_id, force ? "" : "not ", |
| resp.result.result, resp.result.error); |
| + |
| + if (is_write) |
| + storage_sync(rmtfd); |
| + |
| for (i = 0; i < num_entries; i++) { |
| dbgprintf("[RMTFS] %s %d:%d 0x%x\n", is_write ? "write" : "read", |
| entries[i].sector_addr, |
| diff --git a/rmtfs.h b/rmtfs.h |
| index 242baa5..fa4b806 100644 |
| --- a/rmtfs.h |
| +++ b/rmtfs.h |
| @@ -34,6 +34,7 @@ int storage_get_error(const struct rmtfd *rmtfd); |
| void storage_exit(void); |
| ssize_t storage_pread(const struct rmtfd *rmtfd, void *buf, size_t nbyte, off_t offset); |
| ssize_t storage_pwrite(struct rmtfd *rmtfd, const void *buf, size_t nbyte, off_t offset); |
| +int storage_sync(struct rmtfd *rmtfd); |
| |
| int rproc_init(void); |
| int rproc_start(void); |
| diff --git a/storage.c b/storage.c |
| index 0f882eb..aaf73d0 100644 |
| --- a/storage.c |
| +++ b/storage.c |
| @@ -122,7 +122,7 @@ found: |
| fspath = alloca(pathlen); |
| snprintf(fspath, pathlen, "%s/%s", storage_dir, file); |
| if (!storage_read_only) { |
| - fd = open(fspath, O_RDWR | O_SYNC); |
| + fd = open(fspath, O_RDWR); |
| if (fd < 0) { |
| saved_errno = errno; |
| fprintf(stderr, "[storage] failed to open '%s' (requested '%s'): %s\n", |
| @@ -245,6 +245,14 @@ ssize_t storage_pwrite(struct rmtfd *rmtfd, const void *buf, size_t nbyte, off_t |
| return nbyte; |
| } |
| |
| +int storage_sync(struct rmtfd *rmtfd) |
| +{ |
| + if (storage_read_only) |
| + return 0; |
| + |
| + return fdatasync(rmtfd->fd); |
| +} |
| + |
| static int storage_populate_shadow_buf(struct rmtfd *rmtfd, const char *file) |
| { |
| ssize_t len; |
| -- |
| 2.31.0 |
| |