svn commit: r342369 - head/sys/dev/netmap
Vincenzo Maffione
vmaffione at FreeBSD.org
Sat Dec 22 16:23:43 UTC 2018
Author: vmaffione
Date: Sat Dec 22 16:23:42 2018
New Revision: 342369
URL: https://svnweb.freebsd.org/changeset/base/342369
Log:
netmap: fix txsync check in netmap poll
To check if txsync can be skipped, it is necessary to look for
unseen TX space. However, this means comparing ring->cur
against ring->tail, rather than ring->head against ring->tail
(like nm_ring_empty() does).
This change also adds some more comments to explain the optimization
performed at the beginning of netmap_poll().
MFC after: 3 days
Sponsored by: Sunny Valley Networks
Modified:
head/sys/dev/netmap/netmap.c
Modified: head/sys/dev/netmap/netmap.c
==============================================================================
--- head/sys/dev/netmap/netmap.c Sat Dec 22 15:15:45 2018 (r342368)
+++ head/sys/dev/netmap/netmap.c Sat Dec 22 16:23:42 2018 (r342369)
@@ -3292,31 +3292,38 @@ netmap_poll(struct netmap_priv_d *priv, int events, NM
* that we must call nm_os_selrecord() unconditionally.
*/
if (want_tx) {
- enum txrx t = NR_TX;
- for (i = priv->np_qfirst[t]; want[t] && i < priv->np_qlast[t]; i++) {
+ const enum txrx t = NR_TX;
+ for (i = priv->np_qfirst[t]; i < priv->np_qlast[t]; i++) {
kring = NMR(na, t)[i];
- /* XXX compare ring->cur and kring->tail */
- if (!nm_ring_empty(kring->ring)) {
+ if (kring->ring->cur != kring->ring->tail) {
+ /* Some unseen TX space is available, so what
+ * we don't need to run txsync. */
revents |= want[t];
- want[t] = 0; /* also breaks the loop */
+ want[t] = 0;
+ break;
}
}
}
if (want_rx) {
- enum txrx t = NR_RX;
+ const enum txrx t = NR_RX;
int rxsync_needed = 0;
- /* look for a reason to run the handlers */
for (i = priv->np_qfirst[t]; i < priv->np_qlast[t]; i++) {
kring = NMR(na, t)[i];
- if (kring->ring->cur == kring->ring->tail /* try fetch new buffers */
- || kring->rhead != kring->ring->head /* release buffers */) {
+ if (kring->ring->cur == kring->ring->tail
+ || kring->rhead != kring->ring->head) {
+ /* There are no unseen packets on this ring,
+ * or there are some buffers to be returned
+ * to the netmap port. We therefore go ahead
+ * and run rxsync. */
rxsync_needed = 1;
break;
}
}
- if (!rxsync_needed)
- revents |= want_rx; /* we have data */
+ if (!rxsync_needed) {
+ revents |= want_rx;
+ want_rx = 0;
+ }
}
#endif
More information about the svn-src-all
mailing list