[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] Mini-OS: netfront: Fix rx ring starvation in network_rx
Martin Lucina, le Thu 11 Dec 2014 13:10:00 +0100, a écrit : > I've done this in the updated patch, take a look and let me know what you > think. I like that :) > From 3880f59159bf0a05b47b6e723091b1e7e4fb6814 Mon Sep 17 00:00:00 2001 > From: Martin Lucina <martin@xxxxxxxxxx> > Date: Thu, 4 Dec 2014 14:33:53 +0100 > Subject: [PATCH] Mini-OS: netfront: Fix rx ring starvation in network_rx > > In network_rx() we must push the same amount of requests back onto the > ring in the second loop that we consumed in the first loop. Otherwise > the ring will eventually starve itself of free request slots and no > packets will be delivered. > > Further, we make the HAVE_LIBC codepath clearer to follow by removing > the "some" variable from the for loop initialisation and conditions. > > Signed-off-by: Martin Lucina <martin@xxxxxxxxxx> Acked-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx> > --- > extras/mini-os/netfront.c | 36 +++++++++++++++++------------------- > 1 file changed, 17 insertions(+), 19 deletions(-) > > diff --git a/extras/mini-os/netfront.c b/extras/mini-os/netfront.c > index 44c3995..42bb103 100644 > --- a/extras/mini-os/netfront.c > +++ b/extras/mini-os/netfront.c > @@ -96,42 +96,35 @@ static inline int xennet_rxidx(RING_IDX idx) > void network_rx(struct netfront_dev *dev) > { > RING_IDX rp,cons,req_prod; > - struct netif_rx_response *rx; > - int nr_consumed, some, more, i, notify; > - > + int nr_consumed, more, i, notify; > +#ifdef HAVE_LIBC > + int some; > +#endif > > + nr_consumed = 0; > moretodo: > rp = dev->rx.sring->rsp_prod; > rmb(); /* Ensure we see queued responses up to 'rp'. */ > - cons = dev->rx.rsp_cons; > > - for (nr_consumed = 0, some = 0; > - (cons != rp) && !some; > - nr_consumed++, cons++) > +#ifdef HAVE_LIBC > + some = 0; > +#endif > + for (cons = dev->rx.rsp_cons; cons != rp; nr_consumed++, cons++) > { > struct net_buffer* buf; > unsigned char* page; > int id; > > - rx = RING_GET_RESPONSE(&dev->rx, cons); > - > - if (rx->flags & NETRXF_extra_info) > - { > - printk("+++++++++++++++++++++ we have extras!\n"); > - continue; > - } > - > - > - if (rx->status == NETIF_RSP_NULL) continue; > + struct netif_rx_response *rx = RING_GET_RESPONSE(&dev->rx, cons); > > id = rx->id; > - BUG_ON(id >= NET_TX_RING_SIZE); > + BUG_ON(id >= NET_RX_RING_SIZE); > > buf = &dev->rx_buffers[id]; > page = (unsigned char*)buf->page; > gnttab_end_access(buf->gref); > > - if(rx->status>0) > + if (rx->status > NETIF_RSP_NULL) > { > #ifdef HAVE_LIBC > if (dev->netif_rx == NETIF_SELECT_RX) { > @@ -142,6 +135,7 @@ moretodo: > memcpy(dev->data, page+rx->offset, len); > dev->rlen = len; > some = 1; > + break; > } else > #endif > dev->netif_rx(page+rx->offset,rx->status); > @@ -150,7 +144,11 @@ moretodo: > dev->rx.rsp_cons=cons; > > RING_FINAL_CHECK_FOR_RESPONSES(&dev->rx,more); > +#ifdef HAVE_LIBC > if(more && !some) goto moretodo; > +#else > + if(more) goto moretodo; > +#endif > > req_prod = dev->rx.req_prod_pvt; > > -- > 1.7.10.4 > -- Samuel <T> csp.tar.gz: ascii text -+- #ens-mim - vive les browsers qui prennent des initiatives à la con -+- _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |