[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 2/2] xen-netback: switch to NAPI + kthread 1:1 model



On Tue, Aug 06, 2013 at 10:26:24AM +0100, Ian Campbell wrote:
> On Mon, 2013-08-05 at 03:31 +0100, Wei Liu wrote:
> > On Fri, Aug 02, 2013 at 01:20:52PM +0100, Ian Campbell wrote:
> > > On Wed, 2013-05-29 at 12:43 +0100, Wei Liu wrote:
> > > > This patch implements 1:1 model netback. NAPI and kthread are utilized
> > > > to do the weight-lifting job:
> > > > 
> > > >  - NAPI is used for guest side TX (host side RX)
> > > >  - kthread is used for guest side RX (host side TX)
> > > > 
> > > > Xenvif and xen_netbk are made into one structure to reduce code size.
> > > > 
> > > > This model provides better scheduling fairness among vifs. It is also
> > > > prerequisite for implementing multiqueue for Xen netback.
> > > 
> > > Any interesting numbers from this change?
> > > 
> > 
> > [extracted from 0/2 of this series]
> 
> Oops, missed that, sorry.
> 
> > 
> > IRQs are distributed to 4 cores by hand in the new model, while in the
> > old model vifs are automatically distributed to 4 kthreads.
> > 
> > * New model
> > %Cpu0  :  0.5 us, 20.3 sy,  0.0 ni, 28.9 id,  0.0 wa,  0.0 hi, 24.4 si, 
> > 25.9 st
> > %Cpu1  :  0.5 us, 17.8 sy,  0.0 ni, 28.8 id,  0.0 wa,  0.0 hi, 27.7 si, 
> > 25.1 st
> > %Cpu2  :  0.5 us, 18.8 sy,  0.0 ni, 30.7 id,  0.0 wa,  0.0 hi, 22.9 si, 
> > 27.1 st
> > %Cpu3  :  0.0 us, 20.1 sy,  0.0 ni, 30.4 id,  0.0 wa,  0.0 hi, 22.7 si, 
> > 26.8 st
> > Throughputs: 2027.89 2025.95 2018.57 2016.23 aggregated: 8088.64
> > 
> > * Old model
> > %Cpu0  :  0.5 us, 68.8 sy,  0.0 ni, 16.1 id,  0.5 wa,  0.0 hi,  2.8 si, 
> > 11.5 st
> > %Cpu1  :  0.4 us, 45.1 sy,  0.0 ni, 31.1 id,  0.4 wa,  0.0 hi,  2.1 si, 
> > 20.9 st
> > %Cpu2  :  0.9 us, 44.8 sy,  0.0 ni, 30.9 id,  0.0 wa,  0.0 hi,  1.3 si, 
> > 22.2 st
> > %Cpu3  :  0.8 us, 46.4 sy,  0.0 ni, 28.3 id,  1.3 wa,  0.0 hi,  2.1 si, 
> > 21.1 st
> > Throughputs: 1899.14 2280.43 1963.33 1893.47 aggregated: 8036.37
> 
> The CPU load seems to drop pretty significantly with the new model,
> nice. I suppose that is the impact of NAPI rather than the 1:1 side of
> things.
> 

Indeed.

> > 
> > > > Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> > > > ---
> > > >  drivers/net/xen-netback/common.h    |  105 +++--
> > > >  drivers/net/xen-netback/interface.c |  122 +++---
> > > >  drivers/net/xen-netback/netback.c   |  742 
> > > > ++++++++++++-----------------------
> > > >  3 files changed, 389 insertions(+), 580 deletions(-)
> > > > 
> > > > diff --git a/drivers/net/xen-netback/common.h 
> > > > b/drivers/net/xen-netback/common.h
> > > > index 8a4d77e..2e270cf 100644
> > > > --- a/drivers/net/xen-netback/common.h
> > > > +++ b/drivers/net/xen-netback/common.h
> > > > @@ -45,15 +45,43 @@
> > > >  #include <xen/grant_table.h>
> > > >  #include <xen/xenbus.h>
> > > >  
> > > > -struct xen_netbk;
> > > > +typedef unsigned int pending_ring_idx_t;
> > > > +#define INVALID_PENDING_RING_IDX (~0U)
> > > > +
> > > > +struct pending_tx_info {
> > > > +       struct xen_netif_tx_request req; /* coalesced tx request */
> > > > +       pending_ring_idx_t head; /* head != INVALID_PENDING_RING_IDX
> > > > +                                 * if it is head of one or more tx
> > > > +                                 * reqs
> > > 
> > 
> > This is only code movement, no funcational change.
> > 
> > > So this sounds like it is only valid for the pending tx corresponding to
> > > the first slot in a frame, right?
> > > 
> > 
> > No. It can also be interpreted as continuation of several merged tx
> > requests.
> > 
> > > It does not contain a link from any arbitrary slot to the slot
> > > containing the head of that frame, right?
> > > 
> > > So for the head it is effectively that entries index into the pending_tx
> > > array?
> > > 
> > 
> > No. It's a flag to tell if this pending_tx_info is the head of one or
> > more merged tx requests.
> 
> OK, then I'm totally confused.
> 
> I think a comment with an example of the representation of a single
> multislot frame (2-3 slots if that suffices as an illustration) in a
> comment would be useful.
> 

Ok.

> > > > +static int xenvif_poll(struct napi_struct *napi, int budget)
> > > > +{
> > > > +       struct xenvif *vif = container_of(napi, struct xenvif, napi);
> > > > +       int work_done;
> > > > +
> > > > +       work_done = xenvif_tx_action(vif, budget);
> > > > +
> > > > +       if (work_done < budget) {
> > > > +               int more_to_do = 0;
> > > > +               unsigned long flags;
> > > > +
> > > > +               local_irq_save(flags);
> > > 
> > > What does this protect against? Maybe it's a napi requirement not an Xen
> > > netif one?
> > > 
> > 
> > This is sort of a NAPI requirement. If we don't do local_irq_save we
> > would lose event.
> 
> How come? This is a race against this code vs. a new event coming in and
> calling napi_schedule? 

Yes. That's the case. After we manipulate the event pointer the frontend
might generate a new event. Our NAPI handler is still scheduled at that
time, it won't be scheduled again. 

Do real drivers all disable interrupts in this
> way too or do they get this for free via some other means?
> 

Real drivers often use hardware mechanism to prevent generating events.

> I think a comment is at least required.
> 

Sure.


Wei.

> Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.