Date: Tue, 19 Feb 2013 14:05:51 -0800 From: Vijay Singh <vijju.singh@gmail.com> To: freebsd-net@freebsd.org Subject: Possible optimization in ether_output() Message-ID: <CALCNsJR-8wUztkBOhGPSMtSnC=0uusX60dLLn4_HSZ8TcGpDAg@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
Hi, this patch gives a modest performance improvement here @work. Please consider. [/u/vijay/bsd/CODE/cur/sys/net]# svn diff if_ethersubr.c Index: if_ethersubr.c =================================================================== --- if_ethersubr.c (revision 247012) +++ if_ethersubr.c (working copy) @@ -160,6 +160,7 @@ struct pf_mtag *t; int loop_copy = 1; int hlen; /* link layer header length */ + int use_lle_directly = 0; if (ro != NULL) { if (!(m->m_flags & (M_BCAST | M_MCAST))) @@ -184,7 +185,7 @@ #ifdef INET case AF_INET: if (lle != NULL && (lle->la_flags & LLE_VALID)) - memcpy(edst, &lle->ll_addr.mac16, sizeof(edst)); + use_lle_directly = 1; else error = arpresolve(ifp, rt0, m, dst, edst, &lle); if (error) @@ -222,7 +223,7 @@ #ifdef INET6 case AF_INET6: if (lle != NULL && (lle->la_flags & LLE_VALID)) - memcpy(edst, &lle->ll_addr.mac16, sizeof(edst)); + use_lle_directly = 1; else error = nd6_storelladdr(ifp, m, dst, (u_char *)edst, &lle); if (error) @@ -317,9 +318,13 @@ if (m == NULL) senderr(ENOBUFS); eh = mtod(m, struct ether_header *); - (void)memcpy(&eh->ether_type, &type, - sizeof(eh->ether_type)); - (void)memcpy(eh->ether_dhost, edst, sizeof (edst)); + eh->ether_type = type; + if (use_lle_directly) { + memcpy(eh->ether_dhost, &lle->ll_addr.mac16, + sizeof(eh->ether_dhost)); + } else { + (void)memcpy(eh->ether_dhost, edst, sizeof (edst)); + } if (hdrcmplt) (void)memcpy(eh->ether_shost, esrc, sizeof(eh->ether_shost));
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CALCNsJR-8wUztkBOhGPSMtSnC=0uusX60dLLn4_HSZ8TcGpDAg>