Re: Possible optimization in ether_output()

2013-02-22 Thread Alexander V. Chernikov

On 20.02.2013 02:05, Vijay Singh wrote:

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));

This is use-after-free since lle is returned unlocked by arpresolve().
This probably can be changed by supplying eh directly instead of edst,
but this is tricky, too.

I'm currently working on new arp stack implementation where such 
problems are handled more efficient.



+   } else {
+   (void)memcpy(eh->ether_dhost, edst, sizeof (edst));
+   }
if (hdrcmplt)
(void)memcpy(eh->ether_shost, esrc,
sizeof(eh->ether_shost));
___
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"



___
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"


FreeBSD 9.1-RELEASE + bge0 == watchdog timeout

2013-02-22 Thread Marc Fournier



We just picked up 5 new HP DL 360p Gen8 E5-2630 2P servers … just installed 
9.1-RELEASE, and it looks like all of the hardware is detected properly, and 
being configured … 

After reboot, I start getting the 'watchdog timeout - resetting' message on 
bge0 … I've searched the web, and found the references to setting:

hw.bge.allow_asf="0"
hw.pci.enable_msi="0"

but after reboot with those set in /boot/loader.conf (and confirmed via sysctl 
-a after login), its still doing it …

Looking at sysctl -a, even though:

hw.pci.enable_msi="0"

is set, I do see:

dev.bge.0.msi=1
dev.bge.1.msi=1
dev.bge.2.msi=1
dev.bge.3.msi=1

still all set to 1 … is that right?

Don't know if this is useful, but, again, according to sysctl -a:

dev.bge.0.%desc: Broadcom unknown BCM5719, ASIC rev. 0x5719001

===

If I do an 'ifconfig bge0', it does show the interface as being active, but I 
can't ping out on it …

I even found someone's reference to doing a 'ifconfig bge0 -tso -vlanhwtso' and 
tried that … no go …

Something else I can look at?

Thx



___
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"