summaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorLeah Rowe <leah@libreboot.org>2026-03-13 21:28:29 +0000
committerLeah Rowe <leah@libreboot.org>2026-03-13 21:29:36 +0000
commit08fee9ba559ac2aaa235aecfc582c3e431ed276f (patch)
tree69fe063c0632726cea4ac61f248b6586b6f0759d /util
parentc8e6a6870ff389dcc5c9c3e51e79d18e45c59d93 (diff)
util/nvmutil: optimise i/o handling
don't call io_args multiple times get rid of do_rw get rid of IO_PWRITE and IO_PREAD we use prw() for cat now. this is OK because when calling prw() with offset zero, it's literallyy the same as just doing normal write() so the code merely no longer distinguishes positional or non-positional, and just uses prw() universally no behaviour change Signed-off-by: Leah Rowe <leah@libreboot.org>
Diffstat (limited to 'util')
-rw-r--r--util/nvmutil/nvmutil.c62
1 files changed, 13 insertions, 49 deletions
diff --git a/util/nvmutil/nvmutil.c b/util/nvmutil/nvmutil.c
index b1d24bdc..8347fb7e 100644
--- a/util/nvmutil/nvmutil.c
+++ b/util/nvmutil/nvmutil.c
@@ -331,8 +331,6 @@ static ssize_t rw_file_exact(int fd, u8 *mem, size_t len,
off_t off, int rw_type);
static ssize_t rw_file_once(int fd, u8 *mem, size_t len,
off_t off, int rw_type, size_t rc);
-static ssize_t do_rw(int fd,
- u8 *mem, size_t len, off_t off, int rw_type);
static ssize_t prw(int fd, void *mem, size_t nrw,
off_t off, int rw_type);
static off_t lseek_eintr(int fd, off_t off, int whence);
@@ -432,9 +430,7 @@ static const char *argv0;
enum {
IO_READ,
- IO_WRITE,
- IO_PREAD,
- IO_PWRITE
+ IO_WRITE
};
/*
@@ -562,8 +558,6 @@ typedef char assert_argc3[(ARGC_3==3)?1:-1];
typedef char assert_argc4[(ARGC_4==4)?1:-1];
typedef char assert_read[(IO_READ==0)?1:-1];
typedef char assert_write[(IO_WRITE==1)?1:-1];
-typedef char assert_pread[(IO_PREAD==2)?1:-1];
-typedef char assert_pwrite[(IO_PWRITE==3)?1:-1];
typedef char assert_rand_byte[(NUM_RANDOM_BYTES>0)?1:-1];
typedef char assert_rand_len[(NUM_RANDOM_BYTES<NVM_SIZE)?1:-1];
/* commands */
@@ -921,7 +915,7 @@ read_gbe_file(void)
for (p = 0; p < 2; p++) {
if (do_read[p])
- rw_gbe_file_part(p, IO_PREAD, "pread");
+ rw_gbe_file_part(p, IO_READ, "pread");
}
}
@@ -1376,7 +1370,7 @@ write_gbe_file(void)
if (update_checksum)
set_checksum(partnum);
- rw_gbe_file_part(partnum, IO_PWRITE, "pwrite");
+ rw_gbe_file_part(partnum, IO_WRITE, "pwrite");
}
}
@@ -1500,11 +1494,11 @@ rw_gbe_file_part(size_t p, int rw_type,
u8 *mem_offset;
- if (rw_type < IO_PREAD || rw_type > IO_PWRITE)
+ if ((unsigned)rw_type > IO_WRITE)
err(errno, "%s: %s: part %lu: invalid rw_type, %d",
fname, rw_type_str, (unsigned long)p, rw_type);
- if (rw_type == IO_PWRITE)
+ if (rw_type == IO_WRITE)
invert = 0;
/*
@@ -1595,11 +1589,6 @@ rw_file_exact(int fd, u8 *mem, size_t nrw,
ssize_t rv;
size_t rc;
- if (io_args(fd, mem, nrw, off, rw_type) == -1) {
- errno = EIO;
- return -1;
- }
-
for (rc = 0, rv = 0; rc < nrw; ) {
if ((rv = rw_file_once(fd, mem, nrw, off, rw_type, rc)) <= 0)
return -1;
@@ -1622,11 +1611,8 @@ rw_file_once(int fd, u8 *mem, size_t nrw,
size_t retries_on_zero = 0;
size_t max_retries = 10;
- if (io_args(fd, mem, nrw, off, rw_type) == -1)
- goto err_rw_file_once;
-
read_again:
- rv = do_rw(fd, mem + rc, nrw - rc, off + rc, rw_type);
+ rv = prw(fd, mem + rc, nrw - rc, off + rc, rw_type);
if (rv < 0 && errno == EINTR)
goto read_again;
@@ -1649,27 +1635,6 @@ err_rw_file_once:
return -1;
}
-static ssize_t
-do_rw(int fd, u8 *mem,
- size_t nrw, off_t off, int rw_type)
-{
- if (io_args(fd, mem, nrw, off, rw_type) == -1)
- goto err_do_rw;
-
- if (rw_type == IO_READ)
- return read(fd, mem, nrw);
-
- if (rw_type == IO_WRITE)
- return write(fd, mem, nrw);
-
- if (rw_type == IO_PREAD || rw_type == IO_PWRITE)
- return prw(fd, mem, nrw, off, rw_type);
-
-err_do_rw:
- errno = EIO;
- return -1;
-}
-
/*
* This implements a portable analog of pwrite()
* and pread() - note that this version is not
@@ -1686,17 +1651,11 @@ prw(int fd, void *mem, size_t nrw,
off_t off_orig;
ssize_t r;
int saved_errno;
- int prw_type;
int flags;
if (io_args(fd, mem, nrw, off, rw_type) == -1)
goto err_prw;
- prw_type = rw_type ^ IO_PREAD;
-
- if ((unsigned int)prw_type > IO_WRITE)
- goto err_prw;
-
flags = fcntl(fd, F_GETFL);
if (flags == -1)
return -1;
@@ -1717,7 +1676,12 @@ prw(int fd, void *mem, size_t nrw,
return -1;
do {
- r = do_rw(fd, mem, nrw, off, prw_type);
+ if (rw_type == IO_READ)
+ r = read(fd, mem, nrw);
+
+ if (rw_type == IO_WRITE)
+ r = write(fd, mem, nrw);
+
} while (r < 0 && errno == EINTR);
saved_errno = errno;
@@ -1760,7 +1724,7 @@ io_args(int fd, void *mem, size_t nrw,
if (fd < 0
|| !nrw /* prevent zero read request */
|| nrw > (size_t)SSIZE_MAX /* prevent overflow */
- || (unsigned int)rw_type > IO_PWRITE)
+ || (unsigned int)rw_type > IO_WRITE)
goto err_io_args;
return 0;