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

Re: [Xen-devel] [PATCH RFC V2] xen/netback: Count ring slots properly when larger MTU sizes are used



On Wed, 2012-08-29 at 13:21 +0100, Palagummi, Siva wrote:
> This patch contains the modifications that are discussed in thread
> http://lists.xen.org/archives/html/xen-devel/2012-08/msg01730.html

Thanks.

Please can you find a way to include your patches inline rather than as
attachments, it makes reply for review much easier.
Documentation/email-clients.txt has some hints for various clients or
you can just use the "git send-email" command (perhaps with "git
format-patch").

You should also CC the netdev@xxxxxxxxxxxxxxx list.

> Instead of using max_required_rx_slots, I used the count that we
> already have in hand to verify if we have enough room in the batch
> queue for next skb. Please let me know if that is not appropriate.
> Things worked fine in my environment. Under heavy load now we seems to
> be consuming most of the slots in the queue and no BUG_ON :-)


> From: Siva Palagummi <Siva.Palagummi@xxxxxx>
> 
> count variable in xen_netbk_rx_action need to be incremented
> correctly to take into account of extra slots required when skb_headlen is 
> greater than PAGE_SIZE when larger MTU values are used. Without this change
> BUG_ON(npo.meta_prod > ARRAY_SIZE(netbk->meta)) is causing netback thread 
> to exit.
> 
> The fix is to stash the counting already done in xen_netbk_count_skb_slots
> in skb_cb_overlay and use it directly in xen_netbk_rx_action.
> 
> Also improved the checking for filling the batch queue. 
> 
> Also merged a change from a patch created for xen_netbk_count_skb_slots 
> function as per thread 
> http://lists.xen.org/archives/html/xen-devel/2012-05/msg01864.html
> 
> The problem is seen with linux 3.2.2 kernel on Intel 10Gbps network
> 
> 
> Signed-off-by: Siva Palagummi <Siva.Palagummi@xxxxxx>
> ---
> diff -uprN a/drivers/net/xen-netback/netback.c 
> b/drivers/net/xen-netback/netback.c
> --- a/drivers/net/xen-netback/netback.c       2012-01-25 19:39:32.000000000 
> -0500
> +++ b/drivers/net/xen-netback/netback.c       2012-08-28 17:31:22.000000000 
> -0400
> @@ -80,6 +80,11 @@ union page_ext {
>       void *mapping;
>  };
>  
> +struct skb_cb_overlay {
> +     int meta_slots_used;
> +     int count;
> +};
> +
>  struct xen_netbk {
>       wait_queue_head_t wq;
>       struct task_struct *task;
> @@ -324,9 +329,9 @@ unsigned int xen_netbk_count_skb_slots(s
>  {
>       unsigned int count;
>       int i, copy_off;
> +     struct skb_cb_overlay *sco;
>  
> -     count = DIV_ROUND_UP(
> -                     offset_in_page(skb->data)+skb_headlen(skb), PAGE_SIZE);
> +     count = DIV_ROUND_UP(skb_headlen(skb), PAGE_SIZE);

This hunk appears to be upstream already (see
e26b203ede31fffd52571a5ba607a26c79dc5c0d). Which tree are you working
against? You should either base patches on Linus' branch or on the
net-next branch.

Other than this the patch looks good, thanks.

>  
>       copy_off = skb_headlen(skb) % PAGE_SIZE;
>  
> @@ -352,6 +357,8 @@ unsigned int xen_netbk_count_skb_slots(s
>                       size -= bytes;
>               }
>       }
> +     sco = (struct skb_cb_overlay *)skb->cb;
> +     sco->count = count;
>       return count;
>  }
>  
> @@ -586,9 +593,6 @@ static void netbk_add_frag_responses(str
>       }
>  }
>  
> -struct skb_cb_overlay {
> -     int meta_slots_used;
> -};
>  
>  static void xen_netbk_rx_action(struct xen_netbk *netbk)
>  {
> @@ -621,12 +625,16 @@ static void xen_netbk_rx_action(struct x
>               sco = (struct skb_cb_overlay *)skb->cb;
>               sco->meta_slots_used = netbk_gop_skb(skb, &npo);
>  
> -             count += nr_frags + 1;
> +             count += sco->count;
>  
>               __skb_queue_tail(&rxq, skb);
>  
> +             skb = skb_peek(&netbk->rx_queue);
> +             if (skb == NULL)
> +                     break;
> +             sco = (struct skb_cb_overlay *)skb->cb;
>               /* Filled the batch queue? */
> -             if (count + MAX_SKB_FRAGS >= XEN_NETIF_RX_RING_SIZE)
> +             if (count + sco->count >= XEN_NETIF_RX_RING_SIZE)
>                       break;
>       }
>  



_______________________________________________
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®.