On Mon, Sep 05, 2011 at 05:54:19PM +0000, Qing Li wrote:
> Author: qingli
> Date: Mon Sep  5 17:54:19 2011
> New Revision: 225405
> URL: http://svn.freebsd.org/changeset/base/225405
> 
> Log:
>   The maximum read size of incoming packets is done in 1024-byte increments.
>   The current code was rounding down the maximum frame size instead of
>   routing up, resulting in a read size of 1024 bytes, in the non-jumbo
>   frame case, and splitting the packets across multiple mbufs.
>   

I guess the minimum allowed value of rx_mbuf_sz is 2048 such that
old code will still produce 2(i.e. 2KB).  Do you use non-standard
rx_mbuf_sz which is not multiple of 1024?

>   Consequently the above problem exposed another issue, which is when
>   packets were splitted across multiple mbufs, and all of the mbufs in the
>   chain have the M_PKTHDR flag set.
>   
>   Submitted by:       original patch by Ray Ruvinskiy at BlueCoat dot com
>   Reviewed by:        jfv, kmacy, rwatson
>   Approved by:        re (rwatson)
>   MFC after:  5 days
> 
> Modified:
>   head/sys/dev/ixgbe/ixgbe.c
> 
> Modified: head/sys/dev/ixgbe/ixgbe.c
> ==============================================================================
> --- head/sys/dev/ixgbe/ixgbe.c        Mon Sep  5 17:45:24 2011        
> (r225404)
> +++ head/sys/dev/ixgbe/ixgbe.c        Mon Sep  5 17:54:19 2011        
> (r225405)
> @@ -3849,6 +3849,8 @@ fail:
>   **********************************************************************/
>  #define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2
>  
> +#define BSIZEPKT_ROUNDUP ((1<<IXGBE_SRRCTL_BSIZEPKT_SHIFT)-1)
> +     
>  static void
>  ixgbe_initialize_receive_units(struct adapter *adapter)
>  {
> @@ -3882,7 +3884,7 @@ ixgbe_initialize_receive_units(struct ad
>               hlreg &= ~IXGBE_HLREG0_JUMBOEN;
>       IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg);
>  
> -     bufsz = adapter->rx_mbuf_sz  >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
> +     bufsz = (adapter->rx_mbuf_sz + BSIZEPKT_ROUNDUP) >> 
> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
>  
>       for (int i = 0; i < adapter->num_queues; i++, rxr++) {
>               u64 rdba = rxr->rxdma.dma_paddr;
> @@ -4300,9 +4302,10 @@ ixgbe_rxeof(struct ix_queue *que, int co
>                       sendmp = rbuf->fmp;
>                       rbuf->m_pack = rbuf->fmp = NULL;
>  
> -                     if (sendmp != NULL) /* secondary frag */
> +                     if (sendmp != NULL) {  /* secondary frag */
> +                             mp->m_flags &= ~M_PKTHDR;
>                               sendmp->m_pkthdr.len += mp->m_len;
> -                     else {
> +                     } else {
>                               /* first desc of a non-ps chain */
>                               sendmp = mp;
>                               sendmp->m_flags |= M_PKTHDR;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to