[Bug 225408] re_rxeof erroneously returns EAGAIN, resulting in unnecessary processing
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Tue Jan 23 18:14:44 UTC 2018
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=225408
Bug ID: 225408
Summary: re_rxeof erroneously returns EAGAIN, resulting in
unnecessary processing
Product: Base System
Version: CURRENT
Hardware: Any
OS: Any
Status: New
Severity: Affects Some People
Priority: ---
Component: kern
Assignee: freebsd-bugs at FreeBSD.org
Reporter: aaron.styx at baesystems.com
Created attachment 190006
--> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=190006&action=edit
if (maxpkt == 0) return EAGAIN;
In trying to diagnose a separate issue, I discovered that the interrupt
processing of re_int_task was leaving interrupts disabled far more often than
seemed appropriate. The return value from re_rxeof was returning EAGAIN when
handling stray packets on the network, and returning 0 when under heavy traffic
load.
If my understanding of the re_rxeof function is correct, it is supposed to
process at most 16 packets before returning. The variable maxpkt starts at 16
and is decremented each time a packet is processed. If maxpkt gets to zero, the
routine returns and *should* tell the caller whether or not there is more data
to process. However, the check of 'if (maxpkt) return EAGAIN;' will return
EAGAIN when the loop has cleared the entire receive ring before processing 16
packets; i.e.: when it's done processing everything available. I believe it
should be returning EAGAIN only when it has processed 16 packets and there is
still more to do.
The attached patch changes the check to return EAGAIN when maxpkt reaches 0. If
there were exactly 16 packets to process, this could mean it would also
erroneously return EAGAIN, so there may be a better way to check if the ring is
empty.
The driver still works as is, but it does spend more time processing than is
necessary when there is really nothing to do. Under load it may not enqueue the
processing task when it should, but further interrupts should generally keep
things moving.
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the freebsd-bugs
mailing list