From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony Liguori Subject: Re: [PATCH 5/5] Stop dropping so many RX packets in tap (v3) Date: Sun, 11 May 2008 13:30:32 -0500 Message-ID: <48273B48.40101@us.ibm.com> References: <1210183780-19024-1-git-send-email-aliguori@us.ibm.com> <1210183780-19024-5-git-send-email-aliguori@us.ibm.com> <482703E2.9020309@qumranet.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Cc: kvm-devel@lists.sourceforge.net, Marcelo Tosatti To: Avi Kivity Return-path: In-Reply-To: <482703E2.9020309@qumranet.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces@lists.sourceforge.net Errors-To: kvm-devel-bounces@lists.sourceforge.net List-Id: kvm.vger.kernel.org Avi Kivity wrote: > Anthony Liguori wrote: >> Normally, tap always reads packets and simply lets the client drop >> them if it >> cannot receive them. For virtio-net, this results in massive packet >> loss and >> about an 80% performance loss in TCP throughput. >> >> This patch modifies qemu_send_packet() to only deliver a packet to a >> VLAN >> client if it doesn't have a fd_can_read method or the fd_can_read method >> indicates that it can receive packets. We also return a status of >> whether >> any clients were able to receive the packet. >> >> If no clients were able to receive a packet, we buffer the packet >> until a >> client indicates that it can receive packets again. >> >> This patch also modifies the tap code to only read from the tap fd if >> at least >> one client on the VLAN is able to receive a packet. >> >> Finally, this patch changes the tap code to drain all possible >> packets from >> the tap device when the tap fd is readable. >> >> >> #if defined(CONFIG_SLIRP) >> @@ -3970,6 +3976,8 @@ typedef struct TAPState { >> VLANClientState *vc; >> int fd; >> char down_script[1024]; >> + char buf[4096]; >> + int size; >> } TAPState; >> > > This breaks large MTUs. They've always been broken for tap. > How about the other way round: when the vlan consumer detects it can > no longer receive packets, it tells that to the vlan. When all vlan > consumers can no longer receive, tell the producer to stop producing. > For the tap producer, this is simply removing its fd from the read > poll list. When a vlan consumer becomes ready to receive again, it > tells the vlan, which tells the producers, which then install their > fds back again. Yeah, that's a nice idea. I'll think about it. I don't know if it's really worth doing as an intermediate step though. What I'd really like to do is have a vlan interface where consumers published all of their receive buffers. Then there's no need for notifications of receive-ability. Regards, Anthony Liguori > This is a bit difficult since virtio and tap are both consumers and > producers, but could be made to work, I think. > > ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone