From 45f99bbd0ab71559a2ce7631c1e8fe409e52b70c Mon Sep 17 00:00:00 2001 From: leitner Date: Sat, 24 Apr 2021 11:39:18 +0000 Subject: [PATCH] in io_eagain, make sure the kernel knows we wanted to write to the descriptor in case we optimized the syscall away previously in iob_send leave loop if we got a partial write --- io/io_eagain.c | 2 ++ io/io_eagain_write.c | 2 ++ io/iob_send.c | 5 +++-- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/io/io_eagain.c b/io/io_eagain.c index a5a5a27..d1bc91e 100644 --- a/io/io_eagain.c +++ b/io/io_eagain.c @@ -5,6 +5,8 @@ void io_eagain(int64 d) { if (e) { if (e->wantread) e->canread=0; if (e->wantwrite) e->canwrite=0; + if (e->wantwrite && !e->kernelwantwrite) + io_wantwrite(d); #if defined(HAVE_SIGIO) if (d==alt_curread) { #if 0 diff --git a/io/io_eagain_write.c b/io/io_eagain_write.c index bf973a5..8e01f5a 100644 --- a/io/io_eagain_write.c +++ b/io/io_eagain_write.c @@ -4,6 +4,8 @@ void io_eagain_write(int64 d) { io_entry* e=iarray_get(&io_fds,d); if (e) { e->canwrite=0; + if (e->wantwrite && !e->kernelwantwrite) + io_wantwrite(d); #if defined(HAVE_SIGIO) if (d==alt_curwrite) { #if 0 diff --git a/io/iob_send.c b/io/iob_send.c index 9ca3a3c..4c7e5fd 100644 --- a/io/iob_send.c +++ b/io/iob_send.c @@ -286,13 +286,13 @@ eagain: io_eagain_write(s); return -1; } - sent = totalsent; // fall through } // actual error break; } - // if we get here, we wrote it all + // if we get here, we wrote it all or we got an EAGAIN after + // writing something. Treat as regular partial write. sent = totalsent; } else sent=sendmsg(s,&msg,MSG_MORE|ZEROCOPY); @@ -354,6 +354,7 @@ eagain: } } io_eagain_write(s); + return total; } else break; } abort: