util/nvmutil: limit EAGAIN/EINTR retries

set it really high though, so it's still
basically reliably

an EINTR/EAGAIN storm could cause problems
in prw()

Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
Leah Rowe
2026-03-18 04:44:36 +00:00
parent 232b069492
commit 65ed83d2e7
2 changed files with 13 additions and 2 deletions
+9 -2
View File
@@ -2261,6 +2261,12 @@ prw(int fd, void *mem, unsigned long nrw,
int loop_eagain, int loop_eintr, int loop_eagain, int loop_eintr,
int off_reset) int off_reset)
{ {
#ifndef MAX_EAGAIN_RETRIES
unsigned long retries = 100000;
#else
unsigned long retries = MAX_EAGAIN_RETRIES;
#endif
long r; long r;
int positional_rw; int positional_rw;
struct stat st; struct stat st;
@@ -2388,8 +2394,9 @@ real_pread_pwrite:
} }
} while (r == -1 && } while (r == -1 &&
(errno == try_err(loop_eintr, EINTR) (errno == try_err(loop_eintr, EINTR) ||
|| errno == try_err(loop_eagain, EAGAIN))); errno == try_err(loop_eagain, EAGAIN)) &&
retries++ < MAX_EAGAIN_RETRIES);
} }
saved_errno = errno; saved_errno = errno;
+4
View File
@@ -36,6 +36,10 @@ int fchmod(int fd, mode_t mode);
#define HAVE_REAL_PREAD_PWRITE 0 #define HAVE_REAL_PREAD_PWRITE 0
#endif #endif
#ifndef MAX_EAGAIN_RETRIES
#define MAX_EAGAIN_RETRIES 100000
#endif
#ifndef LOOP_EAGAIN #ifndef LOOP_EAGAIN
#define LOOP_EAGAIN 1 #define LOOP_EAGAIN 1
#endif #endif