svn commit: r248323 - head/sys/netinet

Andre Oppermann andre at freebsd.org
Fri Mar 15 13:01:02 UTC 2013


On 15.03.2013 13:53, Gleb Smirnoff wrote:
> Author: glebius
> Date: Fri Mar 15 12:53:53 2013
> New Revision: 248323
> URL: http://svnweb.freebsd.org/changeset/base/248323
>
> Log:
>    - Use m_getcl() instead of hand allocating.
>
>    Sponsored by:	Nginx, Inc.
>
> Modified:
>    head/sys/netinet/tcp_output.c
>
> Modified: head/sys/netinet/tcp_output.c
> ==============================================================================
> --- head/sys/netinet/tcp_output.c	Fri Mar 15 12:52:59 2013	(r248322)
> +++ head/sys/netinet/tcp_output.c	Fri Mar 15 12:53:53 2013	(r248323)
> @@ -842,23 +842,19 @@ send:
>   			TCPSTAT_INC(tcps_sndpack);
>   			TCPSTAT_ADD(tcps_sndbyte, len);
>   		}
> -		MGETHDR(m, M_NOWAIT, MT_DATA);
> +#ifdef INET6
> +		if (MHLEN < hdrlen + max_linkhdr)
> +			m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
> +		else
> +#endif
> +			m = m_gethdr(M_NOWAIT, MT_DATA);
> +

m = m_getm2(hdrlen + max_linkhdr, M_NOWAIT, MT_DATA, M_PKTHDR);

would be even more compact.  Since max_linkhdr could be large as well,
the possibility of a cluster applies to IPv4 too.

-- 
Andre

>   		if (m == NULL) {
>   			SOCKBUF_UNLOCK(&so->so_snd);
>   			error = ENOBUFS;
>   			goto out;
>   		}
> -#ifdef INET6
> -		if (MHLEN < hdrlen + max_linkhdr) {
> -			MCLGET(m, M_NOWAIT);
> -			if ((m->m_flags & M_EXT) == 0) {
> -				SOCKBUF_UNLOCK(&so->so_snd);
> -				m_freem(m);
> -				error = ENOBUFS;
> -				goto out;
> -			}
> -		}
> -#endif
> +
>   		m->m_data += max_linkhdr;
>   		m->m_len = hdrlen;
>
>
>



More information about the svn-src-all mailing list