Date: Sat, 06 Oct 2001 12:40:57 -0700 From: Terry Lambert <tlambert2@mindspring.com> To: current@freebsd.org Subject: KRIS: FOR YOU TO COMMIT: soft interrupt coelescing Message-ID: <3BBF5E49.65AF9D8E@mindspring.com>
next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------91B081D642AD277E202A411F Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Here are patches to three of the Gigabit ethernet drivers to implement soft interrupt coelescing. I have included patches for the dc, ti, and vr drivers... the ti driver is by far the cleanest. I don't use Bill Paul's Tigon III driver, so I haven't included patche for it (the patches should be obvious, anyway, from these). This does in software what the firmware interrupt coelescing that Bill Paul put in the Tigon II and Tigon III drivers does, namely, process more packets per interrupt than would otherwise be processed, and thus reduce interrupt overhead. The interrupt overhead is reduced by 33% on a full loaded system (for a Tigon III, this means 960 megabits a second), so most of you don't have the equipment necessary to test this. Note that it is only incremental, unless you also do the stack processing at interrupt time, but since it is a net positive (reduces a Tigon III from 12,000 to 8,000 interrupts a second for 960 megabits a second), it's worthwhile. This is based on ideas in the Jeff Mogul (DEC Western Research Labs) paper from 1995: http://www.research.digital.com/wrl/techreports/abstracts/95.8.html http://ftp.digital.com/%7emogul/usenix96.ps Kris: Commit this... K PLZ THX. -- Terry --------------91B081D642AD277E202A411F Content-Type: text/plain; charset=us-ascii; name="mogul.pat.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="mogul.pat.txt" Index: if_dc.c =================================================================== RCS file: /home/cvs/clickarray/FreeBSD/sys.releng4/pci/if_dc.c,v retrieving revision 1.1.1.2 diff -r1.1.1.2 if_dc.c 196,197c196,197 < static void dc_rxeof __P((struct dc_softc *)); < static void dc_txeof __P((struct dc_softc *)); --- > static int dc_rxeof __P((struct dc_softc *)); > static int dc_txeof __P((struct dc_softc *)); 2305c2305 < static void dc_rxeof(sc) --- > static int dc_rxeof(sc) 2313a2314 > int cnt = 0; 2358c2359 < return; --- > return(cnt); 2381a2383 > cnt++; 2392c2394 < static void dc_txeof(sc) --- > static int dc_txeof(sc) 2397a2400 > int cnt = 0; 2455c2458 < return; --- > return(cnt); 2468a2472 > cnt++; 2475c2479 < return; --- > return(cnt); 2614a2619 > int cnt = 0; 2632a2638 > again: 2640c2646 < dc_rxeof(sc); --- > cnt += dc_rxeof(sc); 2643c2649 < dc_rxeof(sc); --- > cnt += dc_rxeof(sc); 2648c2654 < dc_txeof(sc); --- > cnt += dc_txeof(sc); 2651c2657 < dc_txeof(sc); --- > cnt += dc_txeof(sc); 2665c2671 < dc_rxeof(sc); --- > cnt += dc_rxeof(sc); 2668c2674 < dc_rxeof(sc); --- > cnt += dc_rxeof(sc); 2675a2682,2686 > } > > if (cnt) { /* XXX limit repeats? */ > cnt = 0; > goto again; Index: if_ti.c =================================================================== RCS file: /home/cvs/clickarray/FreeBSD/sys.releng4/pci/if_ti.c,v retrieving revision 1.4 diff -r1.4 if_ti.c 162,163c162,163 < static void ti_txeof __P((struct ti_softc *)); < static void ti_rxeof __P((struct ti_softc *)); --- > static int ti_txeof __P((struct ti_softc *)); > static int ti_rxeof __P((struct ti_softc *)); 1818c1818 < static void ti_rxeof(sc) --- > static int ti_rxeof(sc) 1822a1823 > int cnt = 0; 1906a1908 > cnt++; 1931c1933 < return; --- > return(cnt); 1934c1936 < static void ti_txeof(sc) --- > static int ti_txeof(sc) 1938a1941 > int cnt = 0; 1974a1978 > cnt++; 1980c1984 < return; --- > return(cnt); 2003,2007c2007,2009 < /* Check RX return ring producer/consumer */ < ti_rxeof(sc); < < /* Check TX ring producer/consumer */ < ti_txeof(sc); --- > /* Check RX, TX return ring producer/consumer */ > while(ti_rxeof(sc) || ti_txeof(sc)) > continue; /* XXX limit repeats? */ Index: if_vr.c =================================================================== RCS file: /home/cvs/clickarray/FreeBSD/sys.releng4/pci/if_vr.c,v retrieving revision 1.1.1.1 diff -r1.1.1.1 if_vr.c 133,135c133,135 < static void vr_rxeof __P((struct vr_softc *)); < static void vr_rxeoc __P((struct vr_softc *)); < static void vr_txeof __P((struct vr_softc *)); --- > static int vr_rxeof __P((struct vr_softc *)); > static int vr_rxeoc __P((struct vr_softc *)); > static int vr_txeof __P((struct vr_softc *)); 956c956 < static void vr_rxeof(sc) --- > static int vr_rxeof(sc) 964a965 > int cnt = 0; 1042a1044,1045 > > cnt++; 1045c1048 < return; --- > return(cnt); 1048c1051 < void vr_rxeoc(sc) --- > int vr_rxeoc(sc) 1050a1054 > int cnt; 1052c1056 < vr_rxeof(sc); --- > cnt = vr_rxeof(sc); 1058c1062 < return; --- > return(cnt); 1066c1070 < static void vr_txeof(sc) --- > static int vr_txeof(sc) 1070a1075 > int cnt = 0; 1167a1173 > int cnt = 0; 1180a1187 > again: 1191c1198 < vr_rxeof(sc); --- > cnt += vr_rxeof(sc); 1197c1204 < vr_rxeoc(sc); --- > cnt += vr_rxeoc(sc); 1201c1208 < vr_txeof(sc); --- > cnt += vr_txeof(sc); 1207c1214 < vr_txeof(sc); --- > cnt += vr_txeof(sc); 1217a1225,1229 > } > > if (cnt) { /* XXX limit repeats? */ > cnt = 0; > goto again; --------------91B081D642AD277E202A411F-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3BBF5E49.65AF9D8E>