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

_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to