svn commit: r260501 - head/sys/dev/usb/wlan

Kevin Lo kevlo at FreeBSD.org
Fri Jan 10 14:49:46 UTC 2014


On 2014/01/10 18:20, Gleb Smirnoff wrote:
>   Kevin,
>
> On Fri, Jan 10, 2014 at 02:47:20AM +0000, Kevin Lo wrote:
> K> Author: kevlo
> K> Date: Fri Jan 10 02:47:20 2014
> K> New Revision: 260501
> K> URL: http://svnweb.freebsd.org/changeset/base/260501
> K>
> K> Log:
> K>   Use m_getcl() instead of MGETHDR/MCLGET macros.
> K>
> K>   Suggested by:	glebius
> K>
> K> Modified:
> K>   head/sys/dev/usb/wlan/if_rsu.c
> K>
> K> Modified: head/sys/dev/usb/wlan/if_rsu.c
> K> ==============================================================================
> K> --- head/sys/dev/usb/wlan/if_rsu.c	Fri Jan 10 01:44:34 2014	(r260500)
> K> +++ head/sys/dev/usb/wlan/if_rsu.c	Fri Jan 10 02:47:20 2014	(r260501)
> K> @@ -1145,16 +1145,9 @@ rsu_event_survey(struct rsu_softc *sc, u
> K>  	pktlen = sizeof(*wh) + le32toh(bss->ieslen);
> K>  	if (__predict_false(pktlen > MCLBYTES))
> K>  		return;
> K> -	MGETHDR(m, M_NOWAIT, MT_DATA);
> K> +	m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
> K>  	if (__predict_false(m == NULL))
> K>  		return;
> K> -	if (pktlen > MHLEN) {
> K> -		MCLGET(m, M_NOWAIT);
> K> -		if (!(m->m_flags & M_EXT)) {
> K> -			m_free(m);
> K> -			return;
> K> -		}
> K> -	}
> K>  	wh = mtod(m, struct ieee80211_frame *);
> K>  	wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_MGT |
> K>  	    IEEE80211_FC0_SUBTYPE_BEACON;
> K> @@ -1358,19 +1351,11 @@ rsu_rx_frame(struct rsu_softc *sc, uint8
> K>  	DPRINTFN(5, "Rx frame len=%d rate=%d infosz=%d rssi=%d\n",
> K>  	    pktlen, rate, infosz, *rssi);
> K>
> K> -	MGETHDR(m, M_NOWAIT, MT_DATA);
> K> +	m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
> K>  	if (__predict_false(m == NULL)) {
> K>  		ifp->if_ierrors++;
> K>  		return NULL;
> K>  	}
> K> -	if (pktlen > MHLEN) {
> K> -		MCLGET(m, M_NOWAIT);
> K> -		if (__predict_false(!(m->m_flags & M_EXT))) {
> K> -			ifp->if_ierrors++;
> K> -			m_freem(m);
> K> -			return NULL;
> K> -		}
> K> -	}
> K>  	/* Finalize mbuf. */
> K>  	m->m_pkthdr.rcvif = ifp;
> K>  	/* Hardware does Rx TCP checksum offload. */
>
> Sorry, but the correct code would be:
>
> 	if (pktlen > MHLEN)
> 		m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
> 	else
> 		m = m_gethdr(M_NOWAIT, MT_DATA);
> 	if (__predict_false(m == NULL)) {
> 		ifp->if_ierrors++;
> 		return NULL;
> 	}
>
> Alternatively, you can use:
>
> 	m = m_get2(pktlen, M_NOWAIT, MT_DATA, M_PKTHDR);
> 	if (__predict_false(m == NULL)) {
> 		ifp->if_ierrors++;
> 		return NULL;
> 	}
>
> With committed code we are wasting memory for small packets.
>

Fixed.  Thanks for pointing that out!
Seems like I was not clear headed. I thought I used m_get2 but 
apparently not.

     Kevin



More information about the svn-src-head mailing list