Date: Mon, 25 Feb 2002 01:00:31 -0500 From: Jake Burkholder <jake@locore.ca> To: Matthew Dillon <dillon@apollo.backplane.com> Cc: current@FreeBSD.ORG Subject: Re: Patch for critical_enter()/critical_exit() & interrupt assembly revamp, please review! Message-ID: <20020225010031.A43767@locore.ca> In-Reply-To: <200202250503.g1P53rd29132@apollo.backplane.com>; from dillon@apollo.backplane.com on Sun, Feb 24, 2002 at 09:03:53PM -0800 References: <20020224131027.I31343-100000@gamplex.bde.org> <200202241912.g1OJCMx95238@apollo.backplane.com> <20020224224927.D35990@locore.ca> <200202250503.g1P53rd29132@apollo.backplane.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Apparently, On Sun, Feb 24, 2002 at 09:03:53PM -0800, Matthew Dillon said words to the effect of; > :... > :interrupts; hard interrupts are rarely masked. The queueing is written > :in assmebler and runs outside of the kernel so it is fast. Traps in > :general are fast because they don't touch memory until the trapframe > :is written out, so I don't see much point in changing this do the masking > :in software and avoid the soft interrupt. > > I have no idea what you are talking about Jake. Could you supply > some context? Sorry, maybe I got ahead of myself. I was responding to your suggestion that other architectures should pick up this design. This does not make sense for sparc64. > > :In regards to the patch I think that making critical_enter/exit MD in > :certain cases is a mistake. cpu_critical_enter/exit are already MD > :and it looks you could hide this behind them with some minor changes. > : > :Like in the critical_enter case, make cpu_critical_enter take a thread > :as its argument. It could be a null macro in the i386 case, which would > :optimize out the test. > : > :if (td->td_critnest == 0) > : cpu_critical_enter(td); > :td->td_critnest++; > : > :Likewise with cpu_critical_exit, make it take the thread as its argument. > : > :If (td->td_critnest == 1) { > : td->td_critnest = 0; > : cpu_critical_exit(td); > :} else > : td->td_critnest--; > :(This is equivalent to if (--td->td_critnest == 0), its a matter of taste.) > > I'm afraid I have to strongly disagree. I believe that > critical_enter()/exit is *ALREADY* being severely misused in current. > For example, fork_exit() makes assumptions about the underlying hardware > in order to initialize td_critnest and the scheduler mutex safely. This > is just plain broken. fork_exit() should not make any such assumptions. > It is the clear responsibility of either the trampoline code or > cpu_fork() to properly set up td_critnest. One can make an argument > that the sched_lock fixup is in fork_exit()'s domain but you cannot > make the argument that the initialization of critnest (and any associated > hardware state) is MI. It just isn't. > > Additionally, critical_enter()/exit themselves are certainly much > more MD then MI. It makes little sense to abstract out an MI interface > that forces unnecessary overhead when all you have to do is define an > MD API that has a few MI requirements, like td_critnest being a critical > nesting count that the MI code can count on. But as MI code the existing > critical_enter()/exit impose additional MD fields and do not give the > MD code the option of not using them (except in a degenerate fashion). > Specifically, the use of the td_savecrit field is under the partial > contorl of the MI code when it shouldn't be, not just in fork_exit() > but also in critical_enter() and critical_exit() themselves. > > The existing critical_enter/exit code is far too abstracted for its > low-level purpose and I *WILL* be moving them into MD sections of the > system where they belong. These are really MD routines, not MI routines. Fine. As long as their functionality with respect to MI code does not change I don't care. 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?20020225010031.A43767>