Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 Nov 2002 14:56:27 -0800
From:      Terry Lambert <tlambert2@mindspring.com>
To:        David Gilbert <dgilbert@velocet.ca>, dolemite@wuli.nu, freebsd-hackers@freebsd.org, freebsd-net@freebsd.org
Subject:   Re: Small initial LRP processing patch vs. -current
Message-ID:  <3DD9701B.45721397@mindspring.com>
References:  <20021109180321.GA559@unknown.nycap.rr.com> <3DCD8761.5763AAB2@mindspring.com> <15823.51640.68022.555852@canoe.velocet.net> <3DD1865E.B9C72DF5@mindspring.com> <15826.24074.605709.966155@canoe.velocet.net> <3DD2F33E.BE136568@mindspring.com> <3DD96FC0.B77331A1@mindspring.com>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------1D72D59BF6FA248F67ED8B8A
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Probably help if I attach the patch.  8-).

-- Terry

Terry Lambert wrote:
> 
> > Well... I have all those stats, but I wasn't wanting to type that
> > much.  IIRC, we normally test with 80 byte packets ... they can be UDP
> > or TCP ... we're testing the routing.  The box has two interfaces and
> > we measure the number of PPS that get to the box on the other side.
> >
> > Without polling patches, the single processor box definately
> > experiences live lock.  Interestingly, the degree of livelock is
> > fairly motherboard dependant.  We have tested many cards and so far
> > fxp's are our best performers.
> 
> Please try the attached patch, with and without DEVICE_POLLING.
> 
> The patch gets rid of the NETISR calls to ipintr(), by calling
> the ip_input() routine directly from the ether_input() called
> at input interrupt time by the ethernet controller.
> 
> The effect of this should be that the input processing will run
> to completion at interrupt time, and therefore avoid input
> livelock, all the way up to the top of the TCP stack, but not
> past the bottom of the sockets layer (I have patches to take it
> all the way to the system call layer).
> 
> What this will basically do is get rid of the latency in the
> NETISR delay for processing input IP packets via ipintr, and it
> should avoid locking out IP and TCP processing, if the interrupt
> load is very high.
> 
> I've tested this locally, with no ill effects (so far).
> 
> This should drastically increase your packets per second number
> for performance under load.  It will also increase your connections
> per second number on the peak before falloff, by about a factor of
> 1.5 (I have been unable to load it sufficiently in the DEVICE_POLLING
> case to guess a number in the non-falloff case).
> 
> The connections per second number will be better when connection
> requests run to completion from the TCP stack, up through the
> sockets layer (I will provide patches for this, after you have
> tested this one).
> 
> The basic theory here is that ipintr processing can be delayed
> indefinitely, if interrupt load is high enough, and there will
> be a maximum latency of 10ms for IP processing after ether_input(),
> in the normal stack case, without the patches.
> 
> Let me know how this works.
> 
> -- Terry
--------------1D72D59BF6FA248F67ED8B8A
Content-Type: text/plain; charset=us-ascii;
 name="lrp1.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="lrp1.diff"

Index: net/if_ethersubr.c
===================================================================
RCS file: /cvs/src/sys/net/if_ethersubr.c,v
retrieving revision 1.125
diff -c -r1.125 if_ethersubr.c
*** net/if_ethersubr.c	28 Sep 2002 17:15:22 -0000	1.125
--- net/if_ethersubr.c	18 Nov 2002 18:03:15 -0000
***************
*** 34,39 ****
--- 34,43 ----
   * $FreeBSD: src/sys/net/if_ethersubr.c,v 1.125 2002/09/28 17:15:22 phk Exp $
   */
  
+ #define	TERRY_LRP
+ /*
+ */
+ 
  #include "opt_atalk.h"
  #include "opt_inet.h"
  #include "opt_inet6.h"
***************
*** 720,728 ****
--- 724,738 ----
  	case ETHERTYPE_IP:
  		if (ipflow_fastforward(m))
  			return;
+ #ifndef TERRY_LRP
  		schednetisr(NETISR_IP);
  		inq = &ipintrq;
  		break;
+ #else	/* !TERRY_LRP */
+ 		/* call ip_input directly, without queueing */
+ 		ip_input(m);
+ 		return;
+ #endif	/* !TERRY_LRP */
  
  	case ETHERTYPE_ARP:
  		if (ifp->if_flags & IFF_NOARP) {
Index: netinet/ip_input.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_input.c,v
retrieving revision 1.210
diff -c -r1.210 ip_input.c
*** netinet/ip_input.c	28 Sep 2002 17:15:25 -0000	1.210
--- netinet/ip_input.c	18 Nov 2002 18:03:20 -0000
***************
*** 35,40 ****
--- 35,43 ----
   */
  
  #define	_IP_VHL
+ #define	TERRY_LRP
+ /*
+ */
  
  #include "opt_bootp.h"
  #include "opt_ipfw.h"
***************
*** 221,227 ****
--- 224,232 ----
  static void	ip_freef(struct ipqhead *, struct ipq *);
  static struct	mbuf *ip_reass(struct mbuf *, struct ipqhead *,
  		struct ipq *, u_int32_t *, u_int16_t *);
+ #ifndef TERRY_LRP
  static void	ipintr(void);
+ #endif	/* !TERRY_LRP*/
  
  /*
   * IP initialization: fill in IP protocol switch table.
***************
*** 259,265 ****
--- 264,272 ----
  	mtx_init(&ipintrq.ifq_mtx, "ip_inq", NULL, MTX_DEF);
  	ipintrq_present = 1;
  
+ #ifndef TERRY_LRP
  	register_netisr(NETISR_IP, ipintr);
+ #endif	/* !TERRY_LRP*/
  }
  
  /*
***************
*** 848,853 ****
--- 855,861 ----
  	m_freem(m);
  }
  
+ #ifndef TERRY_LRP
  /*
   * IP software interrupt routine - to go away sometime soon
   */
***************
*** 863,868 ****
--- 871,877 ----
  		ip_input(m);
  	}
  }
+ #endif	/* !TERRY_LRP */
  
  /*
   * Take incoming datagram fragment and try to reassemble it into

--------------1D72D59BF6FA248F67ED8B8A--


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-net" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3DD9701B.45721397>