<?xml version="1.0" ?>

<kc>

<title>Kernel Traffic</title>

<author contact="mailto:zbrown@tumblerings.org">Zack Brown</author>

<issue num="256" date="02 Apr 2004 00:00:00 -0800" />

<stats posts="1601" size="7819" contrib="508" multiples="241" lastweek="224">

<person posts="50" size="164" who="Andrew Morton" />
<person posts="40" size="259" who="Benjamin Herrenschmidt" />
<person posts="33" size="117" who="Mike Fedyk" />
<person posts="29" size="254" who="&quot;Amit S. Kale&quot;" />
<person posts="24" size="123" who="David Mosberger" />
<person posts="22" size="79" who="&quot;Randy.Dunlap&quot;" />
<person posts="21" size="101" who="Jeff Garzik" />
<person posts="21" size="90" who="Peter Williams" />
<person posts="20" size="107" who="Jean Tourrilhes" />
<person posts="20" size="76" who="Greg KH" />
<person posts="20" size="70" who="Jens Axboe" />
<person posts="20" size="64" who="Christoph Hellwig" />
<person posts="19" size="79" who="&quot;Paul E. McKenney&quot;" />
<person posts="18" size="59" who="Andi Kleen" />
<person posts="18" size="56" who="Ron Peterson" />
<person posts="17" size="73" who="George Anzinger" />
<person posts="16" size="167" who="Pavel Machek" />
<person posts="16" size="84" who="Daniel Phillips" />
<person posts="16" size="50" who="Tom Rini" />
<person posts="15" size="101" who="&quot;Michael Frank&quot;" />
<person posts="14" size="57" who="Linus Torvalds" />
<person posts="14" size="53" who="Andrea Arcangeli" />
<person posts="13" size="55" who="Grigor Gatchev" />
<person posts="13" size="39" who=" (=?iso-8859-1?q?M=E5ns_Rullg=E5rd?=)" />
<person posts="12" size="110" who="Pavel Machek" />
<person posts="12" size="91" who="Russell King" />
<person posts="12" size="51" who="David Brownell" />
<person posts="12" size="44" who="Sam Ravnborg" />
<person posts="12" size="42" who="Timothy Miller" />
<person posts="11" size="72" who="Denis Vlasenko" />
<person posts="11" size="41" who="Chris Friesen" />
<person posts="11" size="39" who="Arjan van de Ven" />
<person posts="11" size="31" who="&quot;David S. Miller&quot;" />
<person posts="10" size="82" who="john stultz" />
<person posts="10" size="75" who="Rik van Riel" />
<person posts="10" size="57" who=" (Eric W. Biederman)" />
<person posts="10" size="44" who="Dmitry Torokhov" />
<person posts="10" size="31" who="Dave Jones" />
<person posts="10" size="30" who=" (H. Peter Anvin)" />
<person posts="9" size="42" who="Tim Schmielau" />
<person posts="8" size="87" who="Rusty Russell" />
<person posts="8" size="36" who="&quot;Richard B. Johnson&quot;" />
<person posts="8" size="32" who="Philippe Elie" />
<person posts="8" size="27" who="Krzysztof Halasa" />
<person posts="8" size="25" who="Nick Piggin" />
<person posts="7" size="49" who="vda" />
<person posts="7" size="27" who="Jean-Luc Cooke" />
<person posts="7" size="26" who="Arthur Corliss" />
<person posts="7" size="25" who="Bjorn Helgaas" />
<person posts="7" size="23" who="Thomas Schlichter" />
<person posts="7" size="19" who="Zwane Mwaikambo" />
<person posts="7" size="18" who="William Lee Irwin III" />
<person posts="6" size="34" who="Andreas Gruenbacher" />
<person posts="6" size="29" who="Kenji Kaneshige" />
<person posts="6" size="25" who="Brian Gerst" />
<person posts="6" size="24" who="Bartlomiej Zolnierkiewicz" />
<person posts="6" size="23" who="Hans Reiser" />
<person posts="6" size="23" who="David Weinehall" />
<person posts="6" size="19" who="Adrian Bunk" />
<person posts="6" size="17" who="Mariusz Mazur" />
<person posts="6" size="17" who="&quot;Jinu M.&quot;" />
<person posts="5" size="37" who="Matthias Andree" />
<person posts="5" size="28" who="John Lee" />
<person posts="5" size="20" who="Paulo Marques" />
<person posts="5" size="19" who="Kliment Yanev" />
<person posts="5" size="18" who="Marcelo Tosatti" />
<person posts="5" size="18" who="Albert Cahalan" />
<person posts="5" size="17" who="Ulrich Drepper" />
<person posts="5" size="17" who="Muli Ben-Yehuda" />
<person posts="5" size="16" who="Rolf Eike Beer" />
<person posts="5" size="16" who="Matt Mackall" />
<person posts="5" size="15" who="Lars Marowsky-Bree" />
<person posts="5" size="14" who="Bill Davidsen" />
<person posts="5" size="13" who="walt" />
<person posts="5" size="13" who="(viro)" />
<person posts="4" size="113" who="Daniel McNeil" />
<person posts="4" size="69" who="Thomas Horsten" />
<person posts="4" size="58" who="Mikael Wahlberg" />
<person posts="4" size="37" who="Jaco Kroon" />
<person posts="4" size="23" who="Wouter Lueks" />
<person posts="4" size="20" who="Carlo Orecchia" />
<person posts="4" size="20" who="Len Brown" />
<person posts="4" size="15" who="David Eger" />
<person posts="4" size="15" who="&quot;Ihar 'Philips' Filipau&quot;" />
<person posts="4" size="15" who="Geert Uytterhoeven" />
<person posts="4" size="15" who="Deepak Saxena" />
<person posts="4" size="14" who="Felipe Alfaro Solana" />
<person posts="4" size="14" who="Srivatsa Vaddagiri" />
<person posts="4" size="14" who="&quot;Martin J. Bligh&quot;" />
<person posts="4" size="14" who="Juan Pablo Abuyeres" />
<person posts="4" size="13" who="Jouni Malinen" />
<person posts="4" size="12" who="Jesse Pollard" />
<person posts="4" size="12" who="&quot;Prakash K. Cheemplavam&quot;" />
<person posts="4" size="12" who="Paul Jackson" />
<person posts="4" size="12" who="&quot;Justin Piszcz&quot;" />
<person posts="4" size="12" who="Dave McCracken" />
<person posts="4" size="11" who="John Cherry" />
<person posts="4" size="11" who="Jamie Lokier" />
<person posts="4" size="11" who="Dave Hansen" />
<person posts="4" size="10" who="Andi Kleen" />
<person posts="4" size="10" who="Stefan Smietanowski" />
<person posts="4" size="10" who="Sean Neakums" />
<person posts="4" size="8" who="Vojtech Pavlik" />
<person posts="4" size="8" who="Meelis Roos" />
<person posts="3" size="55" who="Martin Dorey" />
<person posts="3" size="41" who="David Lang" />
<person posts="3" size="39" who="&quot;Kumar, Rajneesh \(MED\)&quot;" />
<person posts="3" size="35" who="Arjen Verweij" />
<person posts="3" size="29" who="Wim Van Sebroeck" />
<person posts="3" size="26" who="Grigor Gatchev" />
<person posts="3" size="25" who="=?ISO-8859-1?Q?=22Fabian_LoneStar_Fr=E9d=E9rick=22?=" />
<person posts="3" size="19" who="Kingsley Cheung" />
<person posts="3" size="19" who="Willem Riede" />
<person posts="3" size="19" who="Jurriaan" />
<person posts="3" size="18" who="&quot;Liu, Benjamin&quot;" />
<person posts="3" size="17" who="Thomas Mueller" />
<person posts="3" size="16" who="James Bottomley" />
<person posts="3" size="14" who="Pat Gefre" />
<person posts="3" size="13" who="Chris Mason" />
<person posts="3" size="13" who="Stephen Rothwell" />
<person posts="3" size="12" who="Shailabh Nagar" />
<person posts="3" size="12" who="Olaf Hering" />
<person posts="3" size="11" who="Jan Kara" />
<person posts="3" size="11" who="Jakub Jelinek" />
<person posts="3" size="10" who="&quot;Maggio&quot;" />
<person posts="3" size="10" who="&quot;Miller, Mike (OS Dev)&quot;" />
<person posts="3" size="10" who="Anton Blanchard" />
<person posts="3" size="10" who="Andy Isaacson" />
<person posts="3" size="10" who="Daniel Mack" />
<person posts="3" size="10" who="Peter Zijlstra" />
<person posts="3" size="10" who="WU Fengguang" />
<person posts="3" size="10" who="Tim Bird" />
<person posts="3" size="10" who="dean gaudet" />
<person posts="3" size="9" who="&quot;Stephen C. Tweedie&quot;" />
<person posts="3" size="9" who="&quot;H. Peter Anvin&quot;" />
<person posts="3" size="9" who="Robin Rosenberg" />
<person posts="3" size="9" who="David Ford" />
<person posts="3" size="9" who="Rick Knight" />
<person posts="3" size="9" who="Rumi Szabolcs" />
<person posts="3" size="9" who="Stuart Young" />
<person posts="3" size="9" who="Chris Wright" />
<person posts="3" size="9" who="Dave Kleikamp" />
<person posts="3" size="9" who="Willy Tarreau" />
<person posts="3" size="8" who="&quot;J.A. Magallon&quot;" />
<person posts="3" size="8" who="Andreas Schwab" />
<person posts="3" size="8" who="&quot;Carlos Silva&quot;" />
<person posts="3" size="8" who="Daniel Fenert" />
<person posts="3" size="8" who="Jakub Bogusz" />
<person posts="3" size="7" who="Roland Dreier" />
<person posts="3" size="7" who="Stian Jordet" />
<person posts="3" size="7" who="Billy Rose" />
<person posts="3" size="7" who="David Woodhouse" />
<person posts="3" size="7" who="John Bradford" />
<person posts="2" size="57" who="Florian Krueger" />
<person posts="2" size="52" who="Badari Pulavarty" />
<person posts="2" size="52" who="Rob Landley" />
<person posts="2" size="49" who="Tobias Diedrich" />
<person posts="2" size="43" who="Johnny Strom" />
<person posts="2" size="38" who="Ross Dickson" />
<person posts="2" size="30" who="&quot;john&quot;" />
<person posts="2" size="24" who="&quot;Igor Yu. Zhbanov&quot;" />
<person posts="2" size="24" who="Craig Bradney" />
<person posts="2" size="21" who="=?ISO-8859-1?Q?Fran=E7ois?= Chenais" />
<person posts="2" size="21" who="&quot;Sasidhar Mukkmalla&quot;" />
<person posts="2" size="20" who="Manfred Spraul" />
<person posts="2" size="16" who="Rui Saraiva" />
<person posts="2" size="13" who="(mikem)" />
<person posts="2" size="13" who="Johannes Resch" />
<person posts="2" size="12" who="Bruno Ducrot" />
<person posts="2" size="10" who="Christophe Saout" />
<person posts="2" size="10" who="Bjoern Schmidt" />
<person posts="2" size="10" who="john moser" />
<person posts="2" size="9" who="Piet Delaney" />
<person posts="2" size="9" who="Erik van Engelen" />
<person posts="2" size="9" who="Grzegorz Kulewski" />
<person posts="2" size="9" who="&quot;Bailey, Scott&quot;" />
<person posts="2" size="9" who="Hollis Blanchard" />
<person posts="2" size="8" who="Peter Nelson" />
<person posts="2" size="8" who="Hanna Linder" />
<person posts="2" size="8" who="&quot;H. J. Lu&quot;" />
<person posts="2" size="8" who="Christer Weinigel" />
<person posts="2" size="7" who="Greg Weeks" />
<person posts="2" size="7" who="Joachim B Haga" />
<person posts="2" size="7" who="(Valdis.Kletnieks)" />
<person posts="2" size="7" who="Hugo Mills" />
<person posts="2" size="7" who="Rene Herman" />
<person posts="2" size="7" who="(Stuart_Hayes)" />
<person posts="2" size="7" who="(wdebruij)" />
<person posts="2" size="7" who="Clemens Schwaighofer" />
<person posts="2" size="6" who="Carl-Daniel Hailfinger" />
<person posts="2" size="6" who="Takayoshi Kochi" />
<person posts="2" size="6" who="Stephen Samuel" />
<person posts="2" size="6" who="Marc-Christian Petersen" />
<person posts="2" size="6" who="&quot;Tolentino, Matthew E&quot;" />
<person posts="2" size="6" who="&quot;Smart, James&quot;" />
<person posts="2" size="6" who="Armin Schindler" />
<person posts="2" size="6" who="Jeremy Jackson" />
<person posts="2" size="6" who="&quot;Jason Munro&quot;" />
<person posts="2" size="6" who="Paul Wagland" />
<person posts="2" size="6" who="Grant Grundler" />
<person posts="2" size="6" who="cliff white" />
<person posts="2" size="6" who="&quot;Viorel Canja, Softwin&quot;" />
<person posts="2" size="6" who="Andy Lutomirski" />
<person posts="2" size="6" who="Lawrence Walton" />
<person posts="2" size="6" who="Peter Chubb" />
<person posts="2" size="6" who="Eric Sandeen" />
<person posts="2" size="6" who="Alan Stern" />
<person posts="2" size="6" who="Adrian Cox" />
<person posts="2" size="5" who="Miek Gieben" />
<person posts="2" size="5" who="Mikael Pettersson" />
<person posts="2" size="5" who="Voicu Liviu" />
<person posts="2" size="5" who="&quot;Miquel van Smoorenburg&quot;" />
<person posts="2" size="5" who="Mike Christie" />
<person posts="2" size="5" who="Richard Henderson" />
<person posts="2" size="5" who="Alistair John Strachan" />
<person posts="2" size="5" who="Trond Myklebust" />
<person posts="2" size="5" who="&quot;obiozor_consults&quot;" />
<person posts="2" size="5" who="Sridhar Samudrala" />
<person posts="2" size="5" who="Aneesh Kumar KV" />
<person posts="2" size="5" who=" (David Wagner)" />
<person posts="2" size="5" who="Xavier Bestel" />
<person posts="2" size="5" who="James Morris" />
<person posts="2" size="5" who="&quot;Zeno R.R. Davatz&quot;" />
<person posts="2" size="5" who="Keith Owens" />
<person posts="2" size="5" who="(paul.devriendt)" />
<person posts="2" size="5" who="Christoph Pleger" />
<person posts="2" size="5" who="Hayim Shaul" />
<person posts="2" size="5" who="Matti Aarnio" />
<person posts="2" size="5" who="Rik van Riel" />
<person posts="2" size="5" who="Fredrik Tolf" />
<person posts="2" size="4" who="Ludovic Drolez" />
<person posts="2" size="4" who="Karim Yaghmour" />
<person posts="2" size="4" who="Jes Sorensen" />
<person posts="2" size="4" who="Colin Leroy" />
<person posts="2" size="4" who="Patrick Petermair" />
<person posts="2" size="4" who="Markus =?ISO-8859-1?Q?H=E4stbacka?=" />
<person posts="2" size="4" who="mjl" />
<person posts="2" size="4" who="Pascal Schmidt" />
<person posts="2" size="4" who="Meelis Roos" />
<person posts="2" size="4" who="(RANDAZZO)" />
<person posts="2" size="3" who="&quot;Kyle Wong&quot;" />
<person posts="1" size="75" who="Jan Kara" />
<person posts="1" size="56" who="Damien Tabouillon - -- ---- --- --" />
<person posts="1" size="55" who="David Gibson" />
<person posts="1" size="46" who="Eugen Dedu" />
<person posts="1" size="36" who="Eric Valette" />
<person posts="1" size="34" who="Daniel Brahneborg" />
<person posts="1" size="30" who="Brice Figureau" />
<person posts="1" size="24" who="Ludootje" />
<person posts="1" size="18" who="Otto Meier" />
<person posts="1" size="16" who="Matt Domsch" />
<person posts="1" size="15" who="Jesper Dangaard Brouer" />
<person posts="1" size="15" who="Vince" />
<person posts="1" size="13" who="&quot;Delilah Chan&quot;" />
<person posts="1" size="12" who="Vincent Touquet" />
<person posts="1" size="12" who=" &lt;zqapoiksqev@accountant.com&gt;" />
<person posts="1" size="11" who="David Gibson" />
<person posts="1" size="11" who="Mikael Wahlberg" />
<person posts="1" size="10" who="(lode.leroy)" />
<person posts="1" size="9" who="large" />
<person posts="1" size="8" who="Michael Sauer" />
<person posts="1" size="8" who="&quot;David B. Stevens&quot;" />
<person posts="1" size="7" who="(j-nomura)" />
<person posts="1" size="7" who=" (Luis R. Rodriguez)" />
<person posts="1" size="6" who="Tomas Szepe" />
<person posts="1" size="6" who="Hariprasad Nellitheertha" />
<person posts="1" size="6" who="=?ISO-8859-1?Q?Ram=F3n?= Rey Vicente" />
<person posts="1" size="6" who="Marc Schiffbauer" />
<person posts="1" size="6" who="&quot;Dubler, Raymond&quot;" />
<person posts="1" size="6" who="Dino Klein" />
<person posts="1" size="5" who="Hugh Dickins" />
<person posts="1" size="5" who="Brice Figureau" />
<person posts="1" size="5" who="Dave Olien" />
<person posts="1" size="5" who="Frank Fiene" />
<person posts="1" size="5" who="Eric Wong" />
<person posts="1" size="5" who="&quot;Tomi Orava&quot;" />
<person posts="1" size="5" who="Johannes Stezenbach" />
<person posts="1" size="5" who="Doug Ledford" />
<person posts="1" size="5" who="&quot;Peter S. Mazinger&quot;" />
<person posts="1" size="5" who="Theodore Ts'o" />
<person posts="1" size="5" who="&quot;Robert White&quot;" />
<person posts="1" size="5" who="&quot;Salyzyn, Mark&quot;" />
<person posts="1" size="5" who="Bart Hartgers" />
<person posts="1" size="5" who="Jonathan Thorpe" />
<person posts="1" size="5" who="jw schultz" />
<person posts="1" size="5" who="Grischa Jacobs" />
<person posts="1" size="5" who="(RG.Schneider)" />
<person posts="1" size="4" who="Matthew Jacob" />
<person posts="1" size="4" who="&quot;Voluspa&quot;" />
<person posts="1" size="4" who="DragonK" />
<person posts="1" size="4" who="Andy Lutomirski" />
<person posts="1" size="4" who="&quot;G. Gerritsen&quot;" />
<person posts="1" size="4" who="&quot;Dachepalli, Sudhir&quot;" />
<person posts="1" size="4" who="Matthias Jim Knopf" />
<person posts="1" size="4" who="Con Kolivas" />
<person posts="1" size="4" who="Matthew Strait" />
<person posts="1" size="4" who="Jeff Lightfoot" />
<person posts="1" size="4" who="&quot;Info&quot;" />
<person posts="1" size="4" who="Trent Lloyd" />
<person posts="1" size="4" who="Luiz Fernando Capitulino" />
<person posts="1" size="4" who="Andy Lutomirski" />
<person posts="1" size="4" who="&quot;Marco Molinaro&quot;" />
<person posts="1" size="4" who="David Howells" />
<person posts="1" size="4" who="&quot;Robert L. Harris&quot;" />
<person posts="1" size="4" who="alsood" />
<person posts="1" size="4" who="&quot;Randy.Dunlap&quot;" />
<person posts="1" size="4" who="Paul Wagland" />
<person posts="1" size="4" who="Jesper Juhl" />
<person posts="1" size="4" who="Herbert Poetzl" />
<person posts="1" size="4" who="Helge Hafting" />
<person posts="1" size="4" who="Christian Hammers" />
<person posts="1" size="4" who="Daniel Ritz" />
<person posts="1" size="4" who="Peter Osterlund" />
<person posts="1" size="4" who="Gerd Knorr" />
<person posts="1" size="4" who="&quot;Joseph Fannin&quot;" />
<person posts="1" size="3" who="&quot;Bob Dobbs&quot;" />
<person posts="1" size="3" who="Sergey Vlasov" />
<person posts="1" size="3" who="Disconnect" />
<person posts="1" size="3" who="Olaf =?iso-8859-2?Q?Fr=B1czyk?=" />
<person posts="1" size="3" who="Liam Girdwood" />
<person posts="1" size="3" who="Andrew Ho" />
<person posts="1" size="3" who="Jesse Allen" />
<person posts="1" size="3" who="Rob Couto" />
<person posts="1" size="3" who="&quot;Petr Vandrovec&quot;" />
<person posts="1" size="3" who="Heinz Mauelshagen" />
<person posts="1" size="3" who="Lukasz Trabinski" />
<person posts="1" size="3" who="Paul Mundt" />
<person posts="1" size="3" who="Suparna Bhattacharya" />
<person posts="1" size="3" who="Andre Hedrick" />
<person posts="1" size="3" who="Woody Suwalski" />
<person posts="1" size="3" who="adsl" />
<person posts="1" size="3" who="Kristian =?iso-8859-15?q?K=F6hntopp?=" />
<person posts="1" size="3" who="Torrey Hoffman" />
<person posts="1" size="3" who="Paul Armor" />
<person posts="1" size="3" who="John M Flinchbaugh" />
<person posts="1" size="3" who="Segher Boessenkool" />
<person posts="1" size="3" who="Elikster" />
<person posts="1" size="3" who="Anton Ivanov" />
<person posts="1" size="3" who="Pete Zaitcev" />
<person posts="1" size="3" who="Josh McKinney" />
<person posts="1" size="3" who="Ethan Benson" />
<person posts="1" size="3" who="Sid Boyce" />
<person posts="1" size="3" who="John Fremlin" />
<person posts="1" size="3" who="Colin Marquardt" />
<person posts="1" size="3" who="Pascal Gienger" />
<person posts="1" size="3" who="Bruno Ducrot" />
<person posts="1" size="3" who="(richard.brunner)" />
<person posts="1" size="3" who="Urban Widmark" />
<person posts="1" size="3" who="&quot;Michael Kerrisk&quot;" />
<person posts="1" size="3" who="Ville Nuorvala" />
<person posts="1" size="3" who="Nigel Cunningham" />
<person posts="1" size="3" who="Jeff Chua" />
<person posts="1" size="3" who=" (Pedro Larroy)" />
<person posts="1" size="3" who="Gabriel Dos Reis" />
<person posts="1" size="3" who="Wim Coekaerts" />
<person posts="1" size="3" who="(markus.amsler)" />
<person posts="1" size="3" who="Anton Empl" />
<person posts="1" size="3" who="&quot;Stephen D. Williams&quot;" />
<person posts="1" size="3" who="James Ketrenos" />
<person posts="1" size="3" who="Martin Schlemmer" />
<person posts="1" size="3" who="=?ISO-8859-15?Q?Sven_K=F6hler?=" />
<person posts="1" size="3" who="&quot;Mukker, Atul&quot;" />
<person posts="1" size="3" who="Richard Dawe" />
<person posts="1" size="3" who="&quot;Adam J. Richter&quot;" />
<person posts="1" size="3" who="Wilfried Weissmann" />
<person posts="1" size="3" who="Andreas Dilger" />
<person posts="1" size="3" who="David Weinehall" />
<person posts="1" size="3" who="&quot;psycosonic&quot;" />
<person posts="1" size="3" who="Eyal Lebedinsky" />
<person posts="1" size="3" who="&quot;Joseph S. Myers&quot;" />
<person posts="1" size="3" who="Neil Brown" />
<person posts="1" size="3" who="Gerhard Jaeger" />
<person posts="1" size="3" who="Swapnil" />
<person posts="1" size="3" who="Martin Josefsson" />
<person posts="1" size="3" who="&quot;Xiong, Crystal&quot;" />
<person posts="1" size="3" who="&quot;Mike Gigante&quot;" />
<person posts="1" size="3" who="&quot;La Monte H.P. Yarroll&quot;" />
<person posts="1" size="3" who="Brian King" />
<person posts="1" size="3" who="Paul Koning" />
<person posts="1" size="3" who="Nuno Silva" />
<person posts="1" size="3" who="(ibrahimpashahotel)" />
<person posts="1" size="3" who="Itay Ben-Yaacov" />
<person posts="1" size="3" who="Andries Brouwer" />
<person posts="1" size="3" who="&quot;Ramy M. Hassan&quot;" />
<person posts="1" size="3" who="Michael Still" />
<person posts="1" size="3" who="Dax Kelson" />
<person posts="1" size="3" who="Michael Clark" />
<person posts="1" size="3" who="&quot;dan carpenter&quot;" />
<person posts="1" size="3" who="Miles Bader" />
<person posts="1" size="3" who="Charles Bueche" />
<person posts="1" size="3" who="Jan-Benedict Glaw" />
<person posts="1" size="3" who="&quot;Joshua M. Schmidlkofer&quot;" />
<person posts="1" size="3" who="Mike Kravetz" />
<person posts="1" size="3" who="Ruben Puettmann" />
<person posts="1" size="3" who="Jon Smirl" />
<person posts="1" size="3" who="Mike Gabriel" />
<person posts="1" size="3" who="Nathan Scott" />
<person posts="1" size="3" who="Davi Leal" />
<person posts="1" size="3" who="Per Andreas Buer" />
<person posts="1" size="3" who="Ben Collins" />
<person posts="1" size="2" who="Ingo Oeser" />
<person posts="1" size="2" who="Horst von Brand" />
<person posts="1" size="2" who="Seth Mos" />
<person posts="1" size="2" who="Max Valdez" />
<person posts="1" size="2" who="Gerhard Mack" />
<person posts="1" size="2" who="Palko Jukka" />
<person posts="1" size="2" who="Tony Breeds" />
<person posts="1" size="2" who="Andrew Haley" />
<person posts="1" size="2" who="Yoichi Yuasa" />
<person posts="1" size="2" who="Joshua Kwan" />
<person posts="1" size="2" who="Alex Belits" />
<person posts="1" size="2" who="Bob Glamm" />
<person posts="1" size="2" who="Patrick McHardy" />
<person posts="1" size="2" who="Jesper Juhl" />
<person posts="1" size="2" who="&quot;Colin Leroy&quot;" />
<person posts="1" size="2" who="Keith Duthie" />
<person posts="1" size="2" who="Arkadiusz Miskiewicz" />
<person posts="1" size="2" who="Jose Alonso" />
<person posts="1" size="2" who="(mator)" />
<person posts="1" size="2" who="=?ISO-8859-1?Q?S=F8ren?= Hansen" />
<person posts="1" size="2" who="Kendrick Hamilton" />
<person posts="1" size="2" who="=?iso-8859-1?q?Dinesh=20Ahuja?=" />
<person posts="1" size="2" who="&quot;Garry Dickson&quot;" />
<person posts="1" size="2" who="Olivier ARCHER" />
<person posts="1" size="2" who="Nicolas George" />
<person posts="1" size="2" who="Michael Hunold" />
<person posts="1" size="2" who="Frank van Maarseveen" />
<person posts="1" size="2" who="(comandante)" />
<person posts="1" size="2" who="Krzysztof Benedyczak" />
<person posts="1" size="2" who="&quot;Matthias Urlichs&quot;" />
<person posts="1" size="2" who="Peter Zaitsev" />
<person posts="1" size="2" who="&quot;hiro&quot;" />
<person posts="1" size="2" who="=?ISO-8859-2?Q?Damian_Wojs=B3aw?=" />
<person posts="1" size="2" who="Frederic Roussel" />
<person posts="1" size="2" who="Junio C Hamano" />
<person posts="1" size="2" who="Kelledin" />
<person posts="1" size="2" who="Dominik Kubla" />
<person posts="1" size="2" who="mark kandianis" />
<person posts="1" size="2" who="Michal Schmidt" />
<person posts="1" size="2" who="Nerijus Baliunas" />
<person posts="1" size="2" who="Matthias Urlichs" />
<person posts="1" size="2" who="Marc Singer" />
<person posts="1" size="2" who="Charles Cazabon" />
<person posts="1" size="2" who="Nikita Danilov" />
<person posts="1" size="2" who="Maggio" />
<person posts="1" size="2" who="(quadong)" />
<person posts="1" size="2" who="&quot;Voyages-SNCF.com&quot;" />
<person posts="1" size="2" who="Lee Howard" />
<person posts="1" size="2" who="Florian Schanda" />
<person posts="1" size="2" who="Redeeman" />
<person posts="1" size="2" who="Ian Lenzen" />
<person posts="1" size="2" who="&quot;SAR&quot;" />
<person posts="1" size="2" who="KyoungSoo Park" />
<person posts="1" size="2" who="(Administrator)" />
<person posts="1" size="2" who="&quot;Krishnakumar. R&quot;" />
<person posts="1" size="2" who="Felix von Leitner" />
<person posts="1" size="2" who="Benjamin LaHaise" />
<person posts="1" size="2" who="(glennpj)" />
<person posts="1" size="2" who=" (Danny ter Haar)" />
<person posts="1" size="2" who="Andreas Jellinghaus" />
<person posts="1" size="2" who="Stelian Pop" />
<person posts="1" size="2" who="Markus Klotzbuecher" />
<person posts="1" size="2" who="Chris Wedgwood" />
<person posts="1" size="2" who="&quot;Karpurapu, Suresh (Suresh)** CTR **&quot;" />
<person posts="1" size="2" who="=?iso-8859-1?Q?Markus_H=E4stbacka?=" />
<person posts="1" size="2" who="&quot;&quot;" />
<person posts="1" size="2" who="Gilad Ben-Yossef" />
<person posts="1" size="2" who="=?iso-8859-1?q?Anticipating=20a=20Reply?=" />
<person posts="1" size="2" who="Soeren Sonnenburg" />
<person posts="1" size="2" who="Romain Lievin" />
<person posts="1" size="2" who="Jes Sorensen" />
<person posts="1" size="2" who="&quot;Richard W. Knight&quot;" />
<person posts="1" size="2" who="&quot;Pravin Nanaware , Gurgaon&quot;" />
<person posts="1" size="2" who="Dennis Lubert" />
<person posts="1" size="2" who="Francois Romieu" />
<person posts="1" size="2" who="Tim Hockin" />
<person posts="1" size="2" who="Jett Tayer" />
<person posts="1" size="2" who="&quot;Cawley, Stephen&quot;" />
<person posts="1" size="2" who="Roman Zippel" />
<person posts="1" size="2" who="&quot;paolo ciarrocchi&quot;" />
<person posts="1" size="2" who="(mail-postmaster)" />
<person posts="1" size="2" who="Frank Myhr" />
<person posts="1" size="2" who="&quot;J. Ryan Earl&quot;" />
<person posts="1" size="2" who="Ashwin Rao" />
<person posts="1" size="2" who="Ray Lee" />
<person posts="1" size="2" who=" (Frank A. Uepping)" />
<person posts="1" size="2" who="Davide Rossetti" />
<person posts="1" size="2" who="&quot;monte&quot;" />
<person posts="1" size="2" who="(postmaster)" />
<person posts="1" size="2" who="&quot;Heinz Diehl&quot;" />
<person posts="1" size="2" who="&quot;pat&quot;" />
<person posts="1" size="2" who="Karl Dahlke" />
<person posts="1" size="2" who="Co_derrylad" />
<person posts="1" size="2" who="Customer48" />
<person posts="1" size="2" who="Catalin BOIE" />
<person posts="1" size="2" who="(CHGVA10)" />
<person posts="1" size="1" who="&quot;Patrik Johansson&quot;" />
<person posts="1" size="1" who="&quot;octavio&quot;" />
<person posts="1" size="1" who="&quot;kha0s&quot;" />
<person posts="1" size="1" who="&quot;Garst R. Reese&quot;" />
<person posts="1" size="1" who="&quot;Aide de JouerAvecLeFantasme&quot;" />
<person posts="1" size="1" who="(administrator)" />
<person posts="1" size="1" who="&quot;lyle&quot;" />
<person posts="1" size="1" who="Jan Bernatik" />
<person posts="1" size="1" who="(kurt)" />
<person posts="1" size="1" who="(markstone)" />
<person posts="1" size="1" who="(listguru)" />

</stats>

<section
  title="Status Of KGDB Support In 2.6"
  subject="kgdb support in vanilla 2.6.2"
  archive="http://www.google.com/groups?hl=en&amp;lr=&amp;ie=UTF-8&amp;selm=1lGvj-yI-9%40gated-at.bofh.it&amp;prev=/groups%3Fas_ugroup%3Dlinux.kernel%26as_uauthors%3DPavel%2520Machek%26as_usubject%3Dkgdb%2520support%2520in%2520vanilla%25202.6.2%26as_drbb%3Db%26as_mind%3D04%26as_minm%3DFeb%26as_miny%3D2004%26as_maxd%3D04%26as_maxm%3DFeb%26as_maxy%3D2004"
  posts="52"
  startdate="04 Feb 2004 15:01:33 -0800"
  enddate="04 Mar 2004 15:15:24 -0800"
>
<topic>Version Control</topic>

<mention>Linus Torvalds</mention>

<p>Pavel Machek noticed that there was some kgdb support in Linus Torvalds'
kernel tree, at least for certain architectures. He asked, <quote who="Pavel
Machek">That's great, can we get i386 kgdb, too? Or at least amd64 kgdb
;-). [Or was it a mistake? It seems unlikely that kgdb could enter Linus
tree without major flamewar...]</quote> Tom Rini replied, <quote who="Tom
Rini">there has been PPC32 KGDB support in kernel.org for ages.  OTOH, I'm
quite happy that SH kgdb support came in (mental note made to talk to Henry
about the KGDB merging stuffs).</quote> Paul Mundt said:</p>

<quote who="Paul Mundt">

<p>The SH kgdb work is a combination of effort by Henry Bell and Jeremy
Siegel, (ST and MV both had their own versions, Jeremy did the sync work
between the two) neither of which have touched it since mid 2.4 or so when
it was first merged into the LinuxSH tree.</p>

<p>Getting the SH kgdb stuff updated is on my TODO list, I'd definitely
be interested in getting this stuff in sync with Amit's work as well. Any
pointers?</p>

</quote>

Tom replied, <quote who="Tom Rini">What Amit has is at <a
href="http://kgdb.sf.net/">http://kgdb.sf.net/</a>.  What I've
done on top of this is at bk://ppc.bkbits.net/linux-2.6-kgdb and <a
href="http://www.codemonkey.org.uk/projects/bitkeeper/kgdb">http://www.codemonkey.org.uk/projects/bitkeeper/kgdb</a>.</quote>

<p>Andrew Morton replied to Pavel's initial post, saying:</p>

<quote who="Andrew Morton">

<p>Lots of architectures have had in-kernel kgdb support for a long time.
Just none of the three which I use :(</p>

<p>I wouldn't support inclusion of i386 kgdb until it has had a lot of
cleanup, possible de-featuritisification and some thought has been applied
to splitting it into arch and generic bits.  It's quite a lot of work.</p>

</quote>

<p>A bunch of folks started talking about what work still remained to do
before kgdb could be solidly supported in the official kernel. There were
also indications that some companies might be willing to pay to have the
work done.  At one point Andrew remarked, <quote who="Andrew Morton">there's
a lot of interest in this and I of course am fully supportive.</quote></p>

</section>

<section
  title="Proposal: A Layered Kernel"
  subject="A Layered Kernel: Proposal"
  archive="http://www.google.com/groups?hl=en&amp;lr=&amp;ie=UTF-8&amp;selm=1sRc8-Ir-1%40gated-at.bofh.it&amp;prev=/groups%3Fas_ugroup%3Dlinux.kernel%26as_uauthors%3DGrigor%2520Gatchev%26as_usubject%3DA%2520Layered%2520Kernel:%2520Proposal%26as_drbb%3Db%26as_mind%3D24%26as_minm%3DFeb%26as_miny%3D2004%26as_maxd%3D24%26as_maxm%3DFeb%26as_maxy%3D2004"
  posts="47"
  startdate="24 Feb 2004 12:05:33 -0800"
  enddate="09 Mar 2004 15:24:00 -0800"
>
<topic>BSD</topic>
<topic>Backward Compatibility</topic>
<topic>Disks: IDE</topic>
<topic>Executable File Format</topic>
<topic>FS: sysfs</topic>
<topic>Microkernels</topic>
<topic>Networking</topic>
<topic>Sound</topic>

<mention>Mike Fedyk</mention>
<mention>Alexander Viro</mention>

<p>Grigor Gatchev said:</p>

<quote who="Grigor Gatchev">

<p align="center">A Layered Kernel</p>

<p align="center">Proposal</p>

<p>The idea is to structure logically the kernel into two (or more) layers,
with explicitly defined interfaces between them.</p>

<p align="center">Not a Microkernel</p>

<p>Some of my friends decided that this is actually a (partial) microkernel
idea. Not so:</p>

<p>

<ul>

<li>a microkernel is _physically_ divided into separate modules, while
logically it may consist of one or more layers;</li>
<li>a layered kernel is _logically_ divided into layers, while physically
it may consist of one or more modules.</li>

</ul>

</p>

<p>A microkernel may be (and often is) logically single-layered. A
many-layered kernel may be compiled as a big kernel.</p>

<p align="center">Comparison</p>

<p>Both models have advantages. Single layer provides for better
integration, and apparently saving some work. Multi-layer provides for
better security, abstraction, code, and eventually quality.</p>

<p>Traditionally, Unixes use a layered approach - its assets have proven to
give more than the single-block. So, a layered kernel may be more natural
to a Unix-rooted system, and may give better results.</p>

<p align="center">Details</p>

<p>Currently, it seems reasonable to form two layers: Resources and
Personality.</p>

<p>The Resources layer is the natural place for the low-level stuff - device
drivers, basic sheduler, basic memory management and protection, etc.</p>

<p>The Personality layer is the place for the Linux API and ABI, etc.</p>

<p>Some parts, eg. filesystems, TCP/IP stack etc, may bear a discussion over
their exact place. If need, an intermediate layer may be defined.</p>

<p>Each layer draws resources from the lower one, adds functionality on its
top, and possibly changes or hides some of its functionalities,
class-like. It runs the upper layer in encapsulation, eg. protected mode,
and works on top of the lower layer (Resources - over the physical
hardware). Possibly a lower layer can run simultaneously two or more
upper layers, in a multi-tasking way.</p>

<p>If a layer is a separate file, can be called like a program. If part of a
"big kernel", can be called directly, or through exported hooks. Other
models are possible, too.</p>

<p>A layer may be emulated by a layer interface emulator. For example, you
may run a Resources emulator as a program, and a standard Personality
over it, achieving "kernel over kernel". Configuring the emulator, you
pass to the child kernel, and its users and software, a virtual machine
of your choice.</p>

<p align="center">Advantages</p>

<p>Improved source: A well defined inter-layer interface separates logically
the kernel source into more easily manageable parts. It makes the testing
easier. A simple and logical lower layer interface makes learning the
base and writing the code easier; a simple and logical upper layer
interface enforces and helps clarity in design and implementation. This
may attract more developers, ease the work of the current ones, and
increase the kernel quality while decreasing the writing efforts. The
earlier this happens, the better for us all.</p>

<p>Anti-malware protection: Sources of potentially dangerous content can be
filtered between the kernel layers by hooked or compiled-in modules. As
with most other advantages, this is achievable in a non-layered kernel
too, but is more natural in a layered one. Also, propagation of malware
between layers is mode difficult.</p>

<p>Security: A layer, eg. Personality, if properly written, is eventually a
sandbox. Most exploits that would otherwise allow a user to gain
superuser access, will give them control over only this layer, not over
the entire machine. More layers will have to be broken.</p>

<p>Sandboxing: A layer interface emulator of a lower, eg. Resources layer
can pass a configurable "virtual machine" to an upper, eg. Personality
layer. You may run a user or software inside it, passing them any
resources, real or emulated, or any part of your resources. All
advantages of a sandbox apply.</p>

<p>User nesting: The traditional Unix user management model has two levels:
superuser (root) and subusers (ordinary users). Subusers cannot create
and administrate their subusers, install system-level resources, etc.
Running, however, a subuser in their own virtual machine and Personality
layer as its root, will allow tree-like management of users and resources
usage/access. (Imagine a much enhanced chroot.)</p>

<p>Platforming: It is much easier to write only a Personality layer than an
entire kernel, esp. if you have a layer interface open standard as a
base. Respectively, it's easier to write only a Resources layer, adding a
new hardware to the "Supported by Linux" list. This will help increasing
supported both hardware and platforms. Also, thus you may run any
platform on any hardware, or many platforms concurrently on the same
hardware.</p>

<p>Heterogeneous distributed resources usage: Under this security model,
networks of possibly different hardware may share and redistribute
resources, giving to the users resource pools. Pools may be dynamical,
thus redistributing the resources flexibly. This mechanism is potentially
very powerful, and is inherently consistent with the open source spirit
of cooperativity and freedom.</p>

<p align="center">Disadvantages:</p>

<p>More work to start: Initially the model change will take more effort.
(Most will be spent on clarifying and improving the code; most of the
layered model requirements are actually code quality requirements.
Without the new model, the bad design/code correction can be left for a
later stage.)</p>

<p>Performance: Badly designed and/or implemented inter-layer interfaces may
slow down the kernel speed, decreasing the system performance.</p>

<p>Compatibility: Even if the new model is 100% compatible with old
upper-level software, in practice it will surface better the advantages
of some newer stuff, eg. sysfs, and will increase the stress on them,
thus obsoleting sooner some old software. With the old model, the change
may be delayed further.</p>

<p align="center">Other issues:</p>

<p>Need for it: Without any consideration for a layered model, the kernel
source is already structured in a way convenient for going with it; in a
sense, most of the work is already done. Which shows that the need for a
layered model is inherent to the kernel, even if not explicitly defined
and noticed. This way we just follow the system logic.</p>

<p>Authority: If not approved by the top developers, the restructuring may
fork the kernel development. As a result, the layered model may not be
able to gain sufficient resources to survive. The standard model will
probably survive, but may also suffer a loss of developers.</p>

<p>The right moment: The best moment for starting the change is when a new
kernel is declared stable version, and the tree for the next development
version is to be formed. This doesn't happen often, and the change will
be more difficult in another time. (That is why this proposal is made
now.)</p>

<p align="center">Why all this?</p>

<p>Like the mutations, radical ideas are most often bad. Banning them as a
principle, however, may eventually doom Linux to a dinosaur fate. (And we
tend to do it - lately big improvements come to Linux only from outside.
The ELF format, sysfs, NUMA support... However, BSD, Solaris and IRIX
seem to fade; soon we will have only Windows to rely on for new
kernel-level things.)</p>

<p>The advantages of the idea above seems to overweight the disadvantages;
even its disadvantages have strong positive traits. Is it possible that a
discussion may prove it good?</p>

</quote>

<p>Carlos Silva thought this would be a great thing for 2.7; and Rik van Riel
also said:</p>

<quote who="Rik van Riel">

<p>Sounds like a reasonable description of how Linux already
works, with the exception of badly written code that has
layering violations.</p>

<p>I'm all for cleaning up the badly written code so it fits
in better with the rest of the kernel ;)</p>

</quote>

<p>Grigor replied, <quote who="Grigor Gatchev">Unhappily, cleaning up would
not be enough. A separation of the kernel layers, to the extent that one
may be able to use them independently, and to plug modules between them
(having the appropriate access) may be better.</quote> And Rik replied:</p>

<quote who="Rik van Riel">

<p>Some parts of the kernel (eg. the VFS or the device driver layers) can
already do that, while others still have layering violations.</p>

<p>I suspect that the least destabilising way of moving to a more modular
model would be to gradually clean up the layering violations in the rest of
the code, until things are modular.</p>

<p>Yes, I know it's a lot of work ...</p>

</quote>

<p>At this point the discussion skewed into a debate over whether elegant
code should win out over practical code, in other words whether any sort
of overarching structure (like layering) coule possibly take account of all
real-world needs. But at some point Grigor added to his previous proposal:</p>

<quote who="Grigor Gatchev">

<p>Here it is. Get your axe ready! :-)</p>

<p align="center">---</p>

<p align="center">Driver Model Types: A Short Description.</p>

<p>(Note:  This is NOT a complete description of a layer,
according to the kernel layered model I dared to offer.  It
concerns only the hardware drivers in a kernel.)</p>

<p align="center">Direct binding models:</p>

<p>In these models, kernel layers that use drivers bind to
their functions more or less directly.  (The degree of
directness and the specific methods depend much on the
specific implementation.)  This is as opposed to the
indirect binding models, where driver is expected to provide
first a description what it can do, and binding is done
after that, depending on the description provided.</p>

<p align="center">Chaotic Model</p>

<p>This is not a specific model, but rather a lack of any model
that is designed in advance.  Self-made OS most often start
with it, and add a model on a later stage, when more drivers
appear.</p>

<p align="center">Advantages:</p>

<p>The model itself requires no design efforts at all.</p>

<p>No fixed sets of functions to conform to.  Every coder is
free to implement whatever they like.</p>

<p>Unlimited upgradeability - a new super-hardware driver is
not bound by a lower common denominator.</p>

<p>Gives theoretically the best performance possible, as no
driver is bound to conform to anything but to the specific
hadrware abilities.</p>

<p align="center">Disadvantages:</p>

<p>Upper layers can rely on nothing with it.  As more than one
driver for similar devices (eg.  sound cards) adds, upper
layers must check the present drivers for every single
function - which is actually implementing an in-built driver
model.  (Where its place is not, and therefore in a rather
clumsy way.)</p>

<p align="center">Summary:</p>

<p>Good for homebrewn OS alikes, and for specific hardware that
is not subject to differencies, eg.  some mainframe that may
have only one type of NIC, VDC etc.  Otherwise, practically
unusable - the lack of driver systematics severely limits
the kernel internal flexibility.  Often upgraded with
functions that identify for each driver what it is capable
of, or requiring some (typically low) common denominator.</p>

<p align="center">Common Denominator Model</p>

<p>With it, hardware drivers are separated in groups - eg.  NIC
drivers, sound drivers, IDE drivers.  Within a group, all
drivers export the same set of functions.</p>

<p>This set sometimes covers only the minimal set of
functionalities, shared by all hardware in the group - in
this case it acts as a smallest common denominator.  Other
possibility is a largest common denominator - to include
functions for all functionalities possible for the group,
and if the specific hardware doesn't support them directly,
to either emulate them, or to signal for an invalid
function.  Intermediate denominator levels are possible,
too.</p>

<p>The larger the common denominator, and the less emulation
("bad function" signal instead), the closer the model goes
to the chaotic model.</p>

<p align="center">Advantages:</p>

<p>It requires little model design (esp.  the smallest common
denominator types), and as little driver design as possible.
(You may create an excellent design, of course, but you are
not required to.)  You can often re-use most of the design
of the other drivers in the group.</p>

<p>It practically doesn't require a plan, or coordination.  The
coder just tries either to give the functionality that is
logical (if this is the first driver in a new group), or
tries to give the same functionality that the other drivers
in the group give.</p>

<p>Coupling the driver to the upper levels that use it is very
simple and easy.  You practically don't need to check what
driver actually is down there.  You know what it can offer,
no matter the hardware, and don't need to check what the
denominator level ac ually is, unlike the chaotic model.</p>

<p>It encapsulates well the hardware groups, and fixes them to
a certain level of development.  This decreases the
frequency of the knowledge refresh for the programmers, and
to some extent the need for upper levels rewrite.</p>

<p align="center">Disadvantages:</p>

<p>The common denominator denies to the upper level the exact
access to underlaying hardware functionality, and thus
decreases the performance.  With hardware that is below the
denominator line, you risk getting a lot of emulation, which
you potentially could avoid to a large degree on the upper
level (it is often better informed what exactly is desired).
With hardware above the denominator line, you may be denied
access to built-in, hardware-accelerated higher level
functions, that would increase performance and save you
doing everything in your code.</p>

<p>Once the denominator level is fixed, it is hard to move
without seriously impairing the backwards compatibility.
The hardware, however, advances, and offers built-in
upper-level functions and new abilities.  Thus, this model
quickly obsoletes its denominator levels (read:
performance and usability).</p>

<p>The larger the common denominator, the more design work the
model requires.  (And the quicker it obsoletes, given the
need to keep with the front.)</p>

<p align="center">Summary:</p>

<p>This model is the opposite of the chaotic model.  It is
canned and predictable, but non-flexible and with generally
bad performance.  Model upgrades are often needed (and done
more rarely, at the expense of losing efficiency), and often
carry major rewrites of other code with them.</p>

<p>Dlign="center"iscussion:</p>

<p>These two models are the opposites of the scale.  They are
rarely, if ever, used in clear form.  Most often, a driver
model will combine them to some extent, falling somewhere in
the middle.</p>

<p>The simplest combination is defining a (typically low)
common denominator, and going chaotic above.  While it
theoretically provides both full access to the hardware
abilities and something granted to base on, the granted is
little, and the full access is determinable like with the
chaotic model, in a complex way.</p>

<p align="center">This combination also has some advantages:</p>

<p>Where more flexibility and performance is needed, you may go
closer to the chaotic model.  And where more replaceability
and predictability is needed, you may go closer to the CD
model.  The result will be a driver model that gives more
assets where they are really needed, and also has more
negatives, but in an area where they aren't that important.</p>

<p>If the optimum for a specific element, eg.  driver group,
shifts, you may always make the shift obvious.  Then, moving
the model balance for this element will be more readily
accepted by all affected by it.</p>

<p>Another way to combine the models is to break the big
denominator levels into multiple sublevels, and to provide a
way to describe the driver's sublevel, turning this model
into indirect binding type.</p>

<p>All this group of models, however, has a big drawback:
really good replaceability is provided only very close to
the common denominator end of the scale, where flexibiility,
performance, upgradeability and usability already tend to
suffer.  Skillful tuning may postpone the negatives to a
degree, but not forever.  Attempts to solve this problem are
made by developing driver models with indirect binding.</p>

<p align="center">Indirect binding models:</p>

<p>With this model, drivers are expected to provide first a
description what they can do, and what they cannot.  Then,
the code that uses the driver binds to it, using the
description.</p>

<p>Most of these models take the many assets of the chaotic
model as a base, and try to add the good replaceability and
function set predictability of the common denominator model.</p>

<p align="center">Class-like model</p>

<p>In it, the sets of functions that drivers offer are
organized in a class-like manner.  Every class has a defined
set of functions.  Classes create a hierarchy, like the
classes of OOP languages.  (Drivers do not necessarily have
to be written in an OO language, or to be accessed only
from such one.)  A class typically implements all functions
found in its predecessor, and adds more (but, unlike OOP
classes, rarely reuses predecessor code).</p>

<p>Classes and their sets of functions are pre-defined, but the
overall model is extendable without changing what is
present.  When a new type of device appears, or a new device
offers functionality above the current classes appropriate
for it, a new class may be defined.  The description of the
class is created, approved and registered (earlier stages
may be made by a driver writer, later - by a central body),
and is made available to the concerned.</p>

<p>Every driver has a mandatory set of functions that report
the driver class identification.  Using them, an upper layer
can quickly define what functionality is present.  After
this, the upper layer binds to the driver much like in the
direct binding models.</p>

<p align="center">Advantages:</p>

<p>If properly implemented, gives practically the same
performance as the chaotic model.  Additional checking is
performed only once, when the driver is loaded.  Class
defining may be fine-grained enough to allow for practically
exact covering of the hardware functionality.</p>

<p>The upgradeability and usability of the specific drivers are
practically the same as those of the chaotic model.  And the
model global extendability and upgradeability, if properly
designed, are practically limitless.</p>

<p>If properly designed, gives nearly the same replaceability
as the CD model.  (The things to check are more, but much
less than with the chaotic model.  What you will find in
each of them is usually well documented.  And the check
procedure is standard and simple.)</p>

<p align="center">Disadvantages:</p>

<p>The model itself requires more design and maintenance work
than the direct binding models (except the larger CD
models).  (Actually, the amount of maintenance work is the
same as with any CD model, but the work comes before the
need for it is felt by everybody.)</p>

<p align="center">Discussion:</p>

<p>This is probably the best of all driver models I have
examined more carefully.  Unhappily, most implementations I
have seen are rather clumsy, to say the least.</p>

<p align="center">Function map model</p>

<p>This model is actually a largest common denominator model,
extended with the ability to provide a map of the
implemented functions.  In the simplest case, the map is a
bitspace, where every bit marks whether its function is
implemented.  In other cases, the map is a space of accesses
(eg.  function pointers).</p>

<p align="center">Advantages:</p>

<p>In some architectures and platforms, this is a very
convenient way to describe a function array.</p>

<p>The model is simple, and therefore easy to use.</p>

<p align="center">Disadvantages:</p>

<p>The model has all disadvantages of a LCD model.</p>

<p align="center">Discussion:</p>

<p>The advantages of the model are relatively little, while the
disadvantages are big.  For this reason, it is used mostly
as an addition to another model - eg.  to the class-like
model.</p>

<p align="center">Global discussion:</p>

<p>The models list provided here is rather global, This is
intentional:  while designing, one must clarify one level at
a time, much like with coding.</p>

<p>The list also is incomplete.  For example, I never had the
time to look properly for ideas into the OS/2 SOM, and it is
said to work very well, and provide excellent performance.
Of interest might be also more details of the QNX driver
model.  Someone with in-depth knowledge of these might be
able to enhance this list.</p>

</quote>

<p>In the course of discussion, Mike Fedyk, Theodore Y. T'so, Alexander Viro
and others felt that Grigor's proposal was not specific enough. They said
it was just hand-waving, with nothing concrete behind it. Grigor objected
that it was important to do a thorough design before coding. At some point
Timothy Miller said:</p>

<quote who="Timothy Miller">

<p>As one of the people who has been told "show me the code" before, let me
try to help you understand what the kernel developers are asking of you.</p>

<p>First of all, they are NOT asking you to do the bottom-up approach that
you seem to think they're asking for.  They're not asking you to show them
code which was not the result of careful design.  No.  Indeed, they all agree
with you that careful planning is always a good idea, in fact critical.</p>

<p>Rather, what they are asking you to do is to create the complete top-down
design _yourself_ and then show it to them.  If you do a complete design
that is well-though-out and complete, then code (ie.  function prototypes)
will naturally and easily fall out from that.  Present your design and the
resultant code for evaluation.</p>

<p>Only then can kernel developers give you meaningful feedback.  You'll
notice that the major arguments aren't about your design but rather about
there being a lack of anything to critique.  If you want feedback, you must
produce something which CAN be critiqued.</p>

<p>Follow the scientific method:</p>

<p>

<ol>

<li>Construct a hypothesis (the document you have already written plus
more detail).</li>

<li>Develop a means to test your hypothesis (write the code that your design
implies).</li>

<li>Test your hypothesis (present your code and design for criticism).</li>

<li>If your hypothesis is proven wrong (someone has a valid criticism),
adjust the hypothesis and then goto step (2).</li>

</ol>

</p>

<p>Perhaps you have not done this because you feel that your "high level"
design (which you have presented) is not complete.  The problem is that,
based on what you have presented, no one can help you complete it.  Therefore,
the thing to do is to complete it yourself, right or wrong.  Only when you
have actually done something which is wrong can you actually go about doing
things correctly.  Actually wrong is better than hypothetically correct.</p>

<p>Then, you may be thinking that this will result in more work, because
you'll create a design and write come code just to find out that it needs
to be rewritten.  But this would be poor reasoning.  It would be extremely
unrealistic to think that you could create a design a priori that was good
and correct, before you've ever done anything to test its implications.</p>

<p>Mostly likely, you would go through several iterations of your spec and
the implied code before it's acceptable to anyone, regardless of how good
it is to begin with.  Just think about how many iterations Con and Nick
have gone through for their interativity schedulers; they've had countless
good ideas, but only experimentation and user criticism could tell them
what really worked and what didn't.  And these are just the schedulers --
you're talking about the architecture of the whole kernel!</p>

</quote>

<p>Mike agreed with this, but there was no further discussion.</p>

</section>

<section
  title="New kpatchup Kernel Patching Script Version 0.02"
  subject="[ANNOUNCE] kpatchup 0.02 kernel patching script"
  archive="http://www.google.com/groups?hl=en&amp;lr=&amp;ie=UTF-8&amp;selm=1vujb-4Ip-13%40gated-at.bofh.it"
  posts="8"
  startdate="02 Mar 2004 18:24:44 -0800"
  enddate="04 Mar 2004 11:14:02 -0800"
>
<topic>Version Control</topic>

<mention>Rusty Russell</mention>

<p>Matt Mackall said:</p>

<quote who="Matt Mackall">

<p>This is the first release of kpatchup, a script for managing switching
between kernel releases via patches with some smarts:</p>

<p>

<ul>

<li>understands -pre and -rc version numbering</li>
<li>aware of various external trees</li>
<li>automatically patch between any tree in an x.y release</li>
<li>automatically download and cache patches on demand</li>
<li>automatically determine the latest patch in various series</li>
<li>optionally print version strings or URLs for patches</li>

</ul>

</p>

<p>Currently it knows about 2.4, 2.4-pre, 2.6, 2.6-pre, 2.6-bk, 2.6-mm,
and 2.6-tiny.</p>

<p>Example usage:</p>

<pre> $ head Makefile
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 2
 EXTRAVERSION =-rc2
 [...]
 $ kpatchup 2.6-mm
 2.6.2-rc2 -&gt; 2.6.4-rc1-mm1
 Applying patch-2.6.2-rc2.bz2 -R
 Applying patch-2.6.2.bz2
 Applying patch-2.6.3.bz2
 Downloading patch-2.6.4-rc1.bz2...
 Applying patch-2.6.4-rc1.bz2
 Downloading 2.6.4-rc1-mm1.bz2...
 Applying 2.6.4-rc1-mm1.bz2
 $ head Makefile
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 4
 EXTRAVERSION =-rc1-mm1
 NAME=Feisty Dunnart
 [...]
 $ kpatchup -q 2.6.3-rc1
 $ head Makefile
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 3
 EXTRAVERSION =-rc1
 NAME=Feisty Dunnart
 [...]
 $ kpatchup -s 2.6-bk
 2.6.4-rc1-bk3
 $ kpatchup -u 2.4-pre
 <a href="http://www.kernel.org/pub/linux/kernel/v2.4/testing/patch-2.4.26-pre1.bz2">http://www.kernel.org/pub/linux/kernel/v2.4/testing/patch-2.4.26-pre1.bz2</a></pre>

<p>This is an alpha release for people to experiment with. Feedback and
patches encouraged. Grab your copy today at:</p>

<p><a href="http://selenic.com/kpatchup/">http://selenic.com/kpatchup/</a></p>

</quote>

<p>Zwane Mwaikambo was very excited by this, saying, <quote who="Zwane Mwaikambo">Oh i definitely owe you one now, this is replacing the ugly shell script i
had before, i'm mostly using this now to download and patch up trees
before cvs import'ing them.</quote> Rusty Russell was also happy to see this,
and offered his own scripts in case they had anything worth merging. Dave Hansen
also liked Matt's script, but said:</p>

<quote who="Dave Hansen">

<p>it doesn't look like it properly handles empty directories.  I tried this
command, this morning, and it blew up.  I think it's because this directory
http://www.kernel.org/pub/linux/kernel/v2.6/snapshots/ is empty because of last
night's 2.6.4-rc2 release.  I don't grok python very well but is the "return
p[-1]" there just to cause a fault like this?  Would it be better if it just
returned a "no version of that patch right now" message and exited nicely?</p>

<pre>[dave@nighthawk linux-2.6]$ kpatchup-0.02 2.6-bk
"Traceback (most recent call last):
  File "/home/dave/bin/kpatchup-0.02", line 283, in ?
    b = find_ver(args[0])
  File "/home/dave/bin/kpatchup-0.02", line 240, in find_ver
    return v[0](os.path.dirname(v[1]), v[2])
  File "/home/dave/bin/kpatchup-0.02", line 147, in latest_dir
    return p[-1]
IndexError: list index out of range</pre>

<p>I think your script, combined with Rusty's latest-kernel-version could
make me a very happy person.</p>

</quote>

<p>They debugged for a bit, and the thread ended.</p>

</section>

<section
  title="Linux 2.6.4-rc1-mm2 Released"
  subject="2.6.4-rc1-mm2"
  archive="http://www.google.com/groups?hl=en&amp;lr=&amp;ie=UTF-8&amp;selm=1vw1y-6Rj-7%40gated-at.bofh.it"
  posts="17"
  startdate="02 Mar 2004 20:15:36 -0800"
  enddate="10 Mar 2004 16:25:03 -0800"
>
<topic>FS: NFS</topic>
<topic>Kernel Release Announcement</topic>
<topic>Virtual Memory</topic>

<p>Andrew Morton announced 2.6.4-rc1-mm2, saying:</p>

<quote who="Andrew Morton">

<p><a href="ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.4-rc1/2.6.4-rc1-mm2/">ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.4-rc1/2.6.4-rc1-mm2/</a></p>

<p>

<ul>

<li>More VM tweaks and tuneups</li>

<li>Added a 4k kernel- and irq-stack option for x86</li>

<li>Largeish NFS client update</li>

</ul>

</p>

</quote>

</section>

<section
  title="Long-Time LBD Overflow Bug Caught"
  subject="[PATCH] LBD fix for 2.6.3"
  archive="http://www.google.com/groups?hl=en&amp;lr=&amp;ie=UTF-8&amp;selm=1vUnd-8dT-5%40gated-at.bofh.it"
  posts="3"
  startdate="03 Mar 2004 22:09:48 -0800"
  enddate="04 Mar 2004 15:41:22 -0800"
>

<p>Eric Sandeen said, <quote who="Eric Sandeen">A couple xfs users stumbled
upon this problem while trying to use 2.6 + CONFIG_LBD on ia32 boxes -
mkfs.xfs followed by xfs_repair was failing.  At first we thought it was
a raid/md problem, but it's more generic than that.  There's a problem in
__block_write_full_page()</quote>. The posted a patch to adjust the data types
of a couple variables, so they wouldn't overflow; and Andrew Morton said:</p>

<quote who="Andrew Morton">

<p>egads.  That bug has been there from day one.  CONFIG_LBD cannot possibly
work correctly due to this error.</p>

<p>Thanks.</p>

<p>Actually, there more instances of this bug in buffer.c.  This should fix
them up, and also let's be clearer about discriminating between block numbers,
pagecache indices and offsets-within-pages.</p>

</quote>

<p>He posted a patch with some remaining fixes, and Eric Sandeen offered a
patch for one that Andrew apparently missed.</p>

</section>

<section
  title="Linux 2.6.4-rc2 Released"
  subject="Linux 2.6.4-rc2"
  archive="http://www.google.com/groups?hl=en&amp;lr=&amp;ie=UTF-8&amp;selm=1vUGy-8uZ-5%40gated-at.bofh.it"
  posts="5"
  startdate="03 Mar 2004 22:32:22 -0800"
  enddate="09 Mar 2004 11:28:54 -0800"
>
<topic>FS: XFS</topic>
<topic>Hot-Plugging</topic>
<topic>Kernel Build System</topic>
<topic>Kernel Release Announcement</topic>
<topic>PCI</topic>

<mention>Jeff Garzik</mention>

<p>Linus Torvalds announced 2.6.4-rc2, saying:</p>

<quote who="Linus Torvalds">

<p>Here's mainly ARM, XFS, PCI hotplug and firewire updates. And some parport
cleanups and fixes from Al.</p>

<p>And a fairly small merge from Andrew (s390 and random stuff).</p>

</quote>

<p>Lukasz Trabinski reported a compilation error, and Jeff Garzik suggested
running 'make oldconfig' to clear it up. Sam Ravnborg replied, <quote
who="Sam Ravnborg">If this cured it I would like to know.  Because kbuild
should run "make silentoldconfig" if needed.  Timestamps of all KConfig
files are checked etc.</quote></p>

</section>

<section
  title="KGDB Documentation"
  subject="Added KGDB documentation"
  archive="http://groups.google.com/groups?hl=en&amp;lr=lang_en&amp;ie=UTF-8&amp;oe=UTF-8&amp;safe=off&amp;selm=1vXlm-2VO-31%40gated-at.bofh.it"
  posts="1"
  startdate="04 Mar 2004 01:26:43 -0800"
>
<topic>Modems</topic>

<p>Amit S. Kale posted some KGDB documentation:</p>

<quote who="Amit S. Kale">

<p align="center">Introduction:</p>

<p>kgdb is a source level debugger for linux kernel. It is used along with gdb to
debug a linux kernel. Kernel developers can debug a kernel similar to
application programs with use of kgdb. It makes it possible to place
breakpoints in kernel code, step through the code and observe variables.</p>

<p>Two machines are required for using kgdb. One of these machines is a
development machine and the other is a test machine. The machines are
connected through a serial line, a null-modem cable which connects their
serial ports. The kernel to be debugged runs on the test machine. gdb runs on
the development machine. The serial line is used by gdb to communicate to the
kernel being debugged.</p>

<p>This version of kgdb is a lite version. It is available on i386 platform uses
a serial line for communicating to gdb. Full kgdb containing more features and
support more architecture is available along with plenty of documentation at
<a href="http://kgdb.sourceforge.net/">http://kgdb.sourceforge.net/</a></p>

<p align="center">Compiling a kernel:</p>

<p>Enable Kernel hacking -&gt; Kernel Debugging -&gt; KGDB: kernel debugging with
remote gdb</p>

<p>Only generic serial port (8250) is supported in the lite version. Configure
8250 options.</p>

<p align="center">Booting the kernel:</p>

<p>Kernel command line option "kgdbwait" makes kgdb wait for gdb connection
during booting of a kernel. If you have configured simple serial port, the
port number and speed can be overriden on command line by using option
"kgdb8250=portnumber,speed", where port numbers are 0-3 for COM1 to COM4
respectively and supported speeds are 9600, 19200, 38400, 57600, 115200.
Example: kgdbwait kgdb8250=0,115200</p>

<p align="center">Connecting gdb:</p>

<p>If you have used "kgdbwait", kgdb prints a message "Waiting for connection
from remote gdb..." on the console and waits for connection from gdb. At this
point you connect gdb to kgdb.
Example:</p>

<pre>   % gdb ./vmlinux
   (gdb) set remotebaud 115200
   (gdb) target remote /dev/ttyS0</pre>

<p>Once connected, you can debug a kernel the way you would debug an application
program.</p>

</quote>

</section>

<section
  title="Linux 2.4.26-pre2"
  subject="Linux 2.4.26-pre2"
  archive="http://www.google.com/groups?hl=en&amp;lr=&amp;ie=UTF-8&amp;selm=1wPF3-4GY-27%40gated-at.bofh.it"
  posts="11"
  startdate="06 Mar 2004 11:20:55 -0800"
  enddate="07 Mar 2004 12:58:52 -0800"
>
<topic>FS: XFS</topic>

<p>Marcelo Tosatti announced kernel 2.4.26-pre2, saying, <quote who="Marcelo
Tosatti">Here goes -pre2 -- it contains networking updates, network drivers
updates, an XFS update, amongst others.</quote></p>

</section>

<section
  title="Status Of Highmem Support On Non-Highmem Machines Under 2.6"
  subject="Highmem emulation for 2.6?"
  archive="http://www.google.com/groups?hl=en&amp;lr=&amp;ie=UTF-8&amp;selm=1x6cF-6EL-3%40gated-at.bofh.it"
  posts="4"
  startdate="07 Mar 2004 04:59:40 -0800"
  enddate="07 Mar 2004 05:41:24 -0800"
>
<topic>Big Memory Support</topic>
<topic>SMP</topic>

<mention>Pavel Machek</mention>
<mention>Marc-Christian Petersen</mention>

<p>Pavel Machek asked if anyone had highmem emulation for the 2.6 kernel;
Michael Frank and Marc-Christian Petersen offered patches for this. Michael
said of his own patch, <quote who="Michael Frank">It was in -mm until
Andrew dropped it due to it causing problems on SMP, NUMA and with ramdisk.
Ramdisk expects to be at the end of lowmem zone so it wont work in it's
current implementation with this patch when memory is shiften into highmem
zone.</quote></p>

</section>

<section
  title="Struggling To Get KGDB Into The Main Kernel Tree"
  subject="kgdb for mainline kernel: core-lite [patch 1/3]"
  archive="http://www.google.com/groups?hl=en&amp;lr=&amp;ie=UTF-8&amp;selm=1xLSG-3ad-33%40gated-at.bofh.it&amp;prev=/groups%3Fas_ugroup%3Dlinux.kernel%26as_uauthors%3DAmit%2520S.%2520Kale%26as_usubject%3Dkgdb%2520for%2520mainline%2520kernel:%2520core-lite%2520%255Bpatch%25201/3%255D%26as_drbb%3Db%26as_mind%3D08%26as_minm%3DMar%26as_miny%3D2004%26as_maxd%3D08%26as_maxm%3DMar%26as_maxy%3D2004"
  posts="36"
  startdate="08 Mar 2004 01:39:10 -0800"
  enddate="10 Mar 2004 21:11:20 -0800"
>
<topic>Networking</topic>

<mention>Andrew Morton</mention>

<p>Amit S. Kale said:</p>

<quote who="Amit S. Kale">

<p>Here is kgdb for mainline kernel in three patches. This is a lite
version of kgdb available from kgdb.sourceforge.net. I believe that all of us
agree on this lite kgdb.</p>

<p>It supports basic debugging of i386 architecture and debugging over a serial
line. Contents of these patches are as follows:</p>

<p>[1] core-lite.patch: architecture indepndent code<br />
[2] i386-lite.patch: i386 architecture dependent code<br />
[3] 8250.patch: support for generic serial driver</p>

</quote>

<p>Andrew Morton thanked him for working on this, and asked what exactly made
the patch 'lite', i.e. what features had been left out for submission. Amit
said:</p>

<quote who="Amit S. Kale">

<p>Here are features that are present only in full kgdb:</p>

<p>

<ol>

<li>Thread support  (aka info threads)</li>
<li>console messages through gdb</li>
<li>Automatic loading of modules in gdb</li>
<li>Support for x86_64</li>
<li>Support for powerpc</li>
<li>kgdb over ethernet [This isn't ready in the full version as well at this
point of time]</li>

</ol>

</p>

</quote>

<p>It turned out that Andrew wanted most of those features back into the patch;
but according to Amit, there was some question of whether the patch could
remain as clean as it was if those features were reinserted. In particular,
Info Threads seemed to be a must-have for Andrew, while Amit felt this would
be a particularly ugly feature to add back into the patch. But Amit said
he'd look into this further, since Andrew wanted it so badly. Various folks
descended into the code, but nothing conclusive came out of it.</p>

</section>

<section
  title="Update For powernow-k8-acpi Driver"
  subject="powernow-k8 updates"
  archive="http://www.google.com/groups?hl=en&amp;lr=&amp;ie=UTF-8&amp;selm=1xXqU-8e6-31%40gated-at.bofh.it"
  posts="4"
  startdate="09 Mar 2004 13:48:31 -0800"
  enddate="10 Mar 2004 05:48:11 -0800"
>

<p>Pavel Machek said:</p>

<quote who="Pavel Machek">

<p>This adds powernow-k8-acpi driver, which likes on more machines than
powernow-k8, but depends on acpi. I'd like to get this into 2.6.5... Does
it look okay?</p>

<p>Also if you have problems with your eMachines cpufreq, apply this and
switch to -acpi driver. It should fix it for you.</p>

</quote>

</section>

<section
  title="Emulex Goes Open Source"
  subject="[Announce] Emulex LightPulse Device Driver"
  archive="http://www.google.com/groups?hl=en&amp;lr=&amp;ie=UTF-8&amp;selm=1xYPY-1l7-53%40gated-at.bofh.it"
  posts="9"
  startdate="09 Mar 2004 14:45:26 -0800"
  enddate="10 Mar 2004 17:10:54 -0800"
>
<topic>PCI</topic>

<p>James Smart said:</p>

<quote who="James Smart">

<p>Emulex is embarking on an effort to open source the driver for its
LightPulse Fibre Channel Adapter family. This effort will migrate Emulex's
current code base to a driver centric to the Linux 2.6 kernel, with the goal
to eventually gain inclusion in the base Linux kernel.</p>

<p>A new project has been created on SourceForge to host this effort - see <a
href="http://sourceforge.net/projects/lpfcxxxx/">http://sourceforge.net/projects/lpfcxxxx/</a>
. Further information, such as the lastest FAQ, can be found on the project
site.</p>

<p>We realize that this will be a significant effort for Emulex. We welcome
any feedback that the community can provide us.</p>

</quote>

<p>Stefan Smietanowski remarked:</p>

<quote who="Stefan Smietanowski">

<p>I wish to just tell you that I think you're doing the Right Thing(TM).</p>

<p>There are people that don't buy hardware for which the source isn't
either available or included in the standard kernel, even if there
are more patches or newer driver versions external to the main tree.</p>

<p>Good work and good luck!</p>

</quote>

<p>Jeff Garzik also congratulated Emulex for making the move to Open Source,
adding:</p>

<quote who="Jeff Garzik">

<p>I'm only part way through a review of the driver, but I felt there is a
rather large and important issue that needs addressing...  "wrappers."
These are a common tool for many hardware vendors, which allow one to
more easily port a kernel driver across operating systems.
Unfortunately, these sorts of abstractions continually lead to bugs.  In
particular, the areas of locking, memory management, and PCI bus
interaction are often most negatively affected.</p>

<p>In particular, here is an example of such a bug:</p>

<pre>void
elx_sli_lock(elxHBA_t * phba, unsigned long *iflag)
{

        unsigned long flag;
        LINUX_HBA_t *lhba;

        flag = 0;
        lhba = (LINUX_HBA_t *) phba-&gt;pHbaOSEnv;
        spin_lock_irqsave(&amp;lhba-&gt;slilock.elx_lock, flag);
        *iflag = flag;
        return;
}</pre>

<p>It is not portable for code to return the value stored in the 'flags'
argument of spin_lock_irqsave.  The usage _must_ be inlined.  This fails
on, e.g., sparc64's register windows.</p>

<p>But this bug is only an example that serves to highlight the importance
of directly using Linux API functions throughout your code.  It may
sound redundant, but "Linux code should look like Linux code."  This
emphasis on style may sound trivial, but it's important for
review-ability, long term maintenance, and as we see here, bug prevention.</p>

<p>It may not be immediately apparent, but elimination of these wrappers
also increases performance.  Many of the Linux API functions are inlined
in key areas, intentionally, to improve performance.  By further
wrapping these functions in non-inline functions of your own, you
eliminate several compiler optimization opportunties.  In the case of
spinlocks (above), you violate the API.</p>

<p>So I would like to see a slow unwinding, and elimination, of several of
the wrappers in prod_linux.c.</p>

<p>

<ol>

<li>elx_kmem_alloc, elx_kmem_free:  directly use kmalloc(size,
GFP_KERNEL/ATOMIC) in the driver code.</li>

<li>eliminate all *_init_lock, *_lock, and *_unlock wrappers, and
directly call the Linux spinlock primitives throughout your code.</li>

<li>strongly consider eliminating elx_read_pci_cmd, elx_read_pci, and
simply calling the Linux PCI API directly from the lpfc driver code.</li>

<li>eliminate elx_sli_write_pci_cmd hook, elx_write_pci_cmd wrapper, and
directly call the Linux PCI API in the code.</li>

<li>eliminate elx_remap_pci_mem, elx_unmap_pci_mem</li>

<li>

<p>fix unacceptably long delay in elx_sli_brdreset().  udelay() and
mdelay() functions are meant for very small delays, since they do not
reschedule.  Delays such as</p>

<pre>        if (skip_post) {
                mdelay(100);
        } else {
                mdelay(2000);
        }</pre>

<p>should be converted to timers or (if in kernel thread context)
schedule_timeout().</p>

</li>

<li>eliminate elx_sli_pcimem_bcopy(,,sizeof(uint32_t)) in favor of "u32
foo = readl()"</li>

<li>

replace code such as

<pre>       ((SLI2_SLIM_t *) phba-&gt;slim2p.virt)-&gt;un.slim.pcb.hgpAddrHigh =
  (uint32_t) (psli-&gt;sliinit.elx_sli_read_pci) (phba, PCI_BAR_1_REGISTER);
  Laddr = (psli-&gt;sliinit.elx_sli_read_pci) (phba, PCI_BAR_0_REGISTER);
  Laddr &amp;= ~0x4;</pre>

<p>with calls to pci_resource_start() and/or pci_resource_len()</p>

</li>

<li>call pci_set_master() when you wish to enable PCI busmastering.  This
will set the busmaster bit in PCI_COMMAND for you, as well as set up the
PCI latency timer.</li>

<li>call pci_dma_sync functions rather than elx_pci_dma_sync()</li>

</ol>

</p>

<p>That should get you started ;-)</p>

</quote>

<p>James Bottomley also congratulated Emulex, and replied to Jeff's post,
saying:</p>

<quote who="James Bottomley">

<p>Actually, it would be my interpretation of the FAQ that most of this
work is already intended (although Jeff gave specific instances than the
generalities in the FAQ).</p>

<p>There were many more places than this in the driver that caused me to go
"good grief no".  However, it probably makes more sense if you work down
your todo list and come back for a review when you're nearing the end of it.
That way you don't get boat loads of comments about things you were planning
to fix anyway.</p>

</quote>

<p>James Smart replied:</p>

<quote who="James Smart">

<p>First, thanks to those that have actually taken a look at the FAQ and
source already. Do not believe your time was in vain - we will use every
comment we receive.</p>

<p>We know there are a lot of issues we need to address. We echo many of the
same sentiments. We had hoped the FAQ would explain where we are and where
we are heading, so that people can judiciously choose when to evaluate
the code base. That said, we will welcome any comments, at any time, at
any detail level. I would hope that, even while the code base is changing,
that we receive comments. There are constructs in the driver that are likely
not going to change, such as the logging facility. How contentious is this ?
What about the IP interfaces? and so on.  Anything we receive, especially on
the larger concepts in the driver, only helps us understand what's ahead.</p>

<p>Our plans are to complete most of the work list on the FAQ by early April.
We'll try to make weekly drops on SourceForge, with each snapshot containing
a log of the changes.  Once the code base matures, we will ping the lists
again, asking for feedback.</p>

</quote>

<p>Elsewhere, Pete Zaitcev also responded to Jeff's long critique, saying,
<quote who="Pete Zaitcev">I agree completely that Emulex code is infested
with wrappers so much that it's harmful. However, the particular example
you selected you interpret wrong.</quote> He went on:</p>

<quote who="Pete Zaitcev">

<p>Flag problem on sparc is fixed by Keith Wesolowsky for 2.6.3-rcX, and it
never existed on sparc64, which keeps CWP in a separate register.</p>

<p>Why it took years to resolve is that the expirience showed that there is
no legitimate reason to pass flags as arguments. Every damn time it was done,
the author was being stupid. Keith resolved it primarily because it was an
unorthogonality in sparc implementation.</p>

</quote>

<p>Jeff replied:</p>

<quote who="Jeff Garzik">

<p>You would never know there were so many sparc people, until I post
something incorrect about it.  &lt;grin&gt;</p>

<p>I stand corrected.  As someone mentioned in private, it's actually a shame
that was fixed, since that's one less argument that can be used against such
wrappers ;-)</p>

</quote>

</section>

<section
  title="Linux 2.6.4-rc3 Released"
  subject="Linux 2.6.4-rc3"
  archive="http://www.google.com/groups?hl=en&amp;lr=&amp;ie=UTF-8&amp;selm=1xZM1-2tK-7%40gated-at.bofh.it"
  posts="1"
  startdate="09 Mar 2004 16:34:14 -0800"
>

<p>Linus Torvalds announced, <quote who="Linus Torvalds">Hmm. Nothing
earth-shaking here, most of the changes end up being minor code cleanups
and fixes for things like memory leaks in some error handling paths
etc.</quote></p>

</section>

</kc>

