From: Jason Wang <jasowang@redhat.com>
To: qemu-devel@nongnu.org, peter.maydell@linaro.org
Cc: Vincenzo Maffione <v.maffione@gmail.com>,
Jason Wang <jasowang@redhat.com>
Subject: [Qemu-devel] [PULL V2 04/13] net: netmap: improve netmap_receive_iov()
Date: Tue, 5 Mar 2019 15:12:11 +0800 [thread overview]
Message-ID: <1551769940-22739-5-git-send-email-jasowang@redhat.com> (raw)
In-Reply-To: <1551769940-22739-1-git-send-email-jasowang@redhat.com>
From: Vincenzo Maffione <v.maffione@gmail.com>
Changes:
- Save CPU cycles by computing the return value while scanning the
input iovec, rather than calling iov_size() at the end.
- Remove check for s->tx != NULL, because it cannot happen.
- Cache ring->tail in a local variable and use it to check for
space in the TX ring. The use of nm_ring_empty() was invalid,
because nobody is updating ring->cur and ring->head at that point.
- In case we run out of netmap slots in the middle of a packet,
move the wake-up point by advancing ring->cur, but do not
expose the incomplete packet (i.e., by updating also ring->head).
Signed-off-by: Vincenzo Maffione <v.maffione@gmail.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
net/netmap.c | 29 +++++++++++++++++------------
1 file changed, 17 insertions(+), 12 deletions(-)
diff --git a/net/netmap.c b/net/netmap.c
index 852106a..0cc8f54 100644
--- a/net/netmap.c
+++ b/net/netmap.c
@@ -159,21 +159,22 @@ static ssize_t netmap_receive_iov(NetClientState *nc,
{
NetmapState *s = DO_UPCAST(NetmapState, nc, nc);
struct netmap_ring *ring = s->tx;
+ unsigned int tail = ring->tail;
+ ssize_t totlen = 0;
uint32_t last;
uint32_t idx;
uint8_t *dst;
int j;
uint32_t i;
- if (unlikely(!ring)) {
- /* Drop the packet. */
- return iov_size(iov, iovcnt);
- }
-
- last = i = ring->cur;
+ last = i = ring->head;
if (nm_ring_space(ring) < iovcnt) {
- /* Not enough netmap slots. */
+ /* Not enough netmap slots. Tell the kernel that we have seen the new
+ * available slots (so that it notifies us again when it has more
+ * ones), but without publishing any new slots to be processed
+ * (e.g., we don't advance ring->head). */
+ ring->cur = tail;
netmap_write_poll(s, true);
return 0;
}
@@ -183,14 +184,17 @@ static ssize_t netmap_receive_iov(NetClientState *nc,
int offset = 0;
int nm_frag_size;
+ totlen += iov_frag_size;
+
/* Split each iovec fragment over more netmap slots, if
necessary. */
while (iov_frag_size) {
nm_frag_size = MIN(iov_frag_size, ring->nr_buf_size);
- if (unlikely(nm_ring_empty(ring))) {
- /* We run out of netmap slots while splitting the
+ if (unlikely(i == tail)) {
+ /* We ran out of netmap slots while splitting the
iovec fragments. */
+ ring->cur = tail;
netmap_write_poll(s, true);
return 0;
}
@@ -212,12 +216,13 @@ static ssize_t netmap_receive_iov(NetClientState *nc,
/* The last slot must not have NS_MOREFRAG set. */
ring->slot[last].flags &= ~NS_MOREFRAG;
- /* Now update ring->cur and ring->head. */
- ring->cur = ring->head = i;
+ /* Now update ring->head and ring->cur to publish the new slots and
+ * the new wakeup point. */
+ ring->head = ring->cur = i;
ioctl(s->nmd->fd, NIOCTXSYNC, NULL);
- return iov_size(iov, iovcnt);
+ return totlen;
}
static ssize_t netmap_receive(NetClientState *nc,
--
2.5.0
next prev parent reply other threads:[~2019-03-05 7:12 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-05 7:12 [Qemu-devel] [PULL V2 00/13] Net patches Jason Wang
2019-03-05 7:12 ` [Qemu-devel] [PULL V2 01/13] net/colo-compare.c: Remove duplicated code Jason Wang
2019-03-05 7:12 ` [Qemu-devel] [PULL V2 02/13] net: netmap: small improvements netmap_send() Jason Wang
2019-03-05 7:12 ` [Qemu-devel] [PULL V2 03/13] net: netmap: simplify netmap_receive() Jason Wang
2019-03-05 7:12 ` Jason Wang [this message]
2019-03-05 7:12 ` [Qemu-devel] [PULL V2 05/13] net: Introduce announce timer Jason Wang
2019-03-05 7:12 ` [Qemu-devel] [PULL V2 06/13] migration: Add announce parameters Jason Wang
2019-03-05 7:12 ` [Qemu-devel] [PULL V2 07/13] virtio-net: Switch to using announce timer Jason Wang
2019-03-05 7:12 ` [Qemu-devel] [PULL V2 08/13] migration: " Jason Wang
2019-03-05 7:12 ` [Qemu-devel] [PULL V2 09/13] net: Add a network device specific self-announcement ability Jason Wang
2019-03-05 7:12 ` [Qemu-devel] [PULL V2 10/13] virtio-net: Allow qemu_announce_self to trigger virtio announcements Jason Wang
2019-03-05 7:12 ` [Qemu-devel] [PULL V2 11/13] qmp: Add announce-self command Jason Wang
2019-03-05 7:12 ` [Qemu-devel] [PULL V2 12/13] hmp: Add hmp_announce_self Jason Wang
2019-03-05 7:12 ` [Qemu-devel] [PULL V2 13/13] tests: Add a test for qemu self announcements Jason Wang
2019-03-05 11:21 ` [Qemu-devel] [PULL V2 00/13] Net patches Peter Maydell
2019-03-06 6:08 ` Jason Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1551769940-22739-5-git-send-email-jasowang@redhat.com \
--to=jasowang@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=v.maffione@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).