From mboxrd@z Thu Jan 1 00:00:00 1970 From: Linus Torvalds Subject: Re: [patch 13/26] Xen-paravirt_ops: Consistently wrap paravirt ops callsites to make them patchable Date: Tue, 20 Mar 2007 17:24:58 -0700 (PDT) Message-ID: References: <20070316.023331.59468179.davem@davemloft.net> <45FB005D.9060809@goop.org> <1174127638.8897.75.camel@localhost.localdomain> <20070318.003309.71088169.davem@davemloft.net> <20070318120814.GA45869@muc.de> <1174272469.11680.23.camel@localhost.localdomain> <1174348905.11680.54.camel@localhost.localdomain> <45FF4043.4000805@vmware.com> <45FF770C.7050301@goop.org> <46000C7E.4070001@goop.org> <46005B89.5070301@vmware.com> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Return-path: In-Reply-To: <46005B89.5070301@vmware.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: virtualization-bounces@lists.linux-foundation.org Errors-To: virtualization-bounces@lists.linux-foundation.org To: Zachary Amsden Cc: xen-devel@lists.xensource.com, akpm@linux-foundation.org, virtualization@lists.osdl.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, chrisw@sous-sol.org, Andi Kleen , "Eric W. Biederman" , anthony@codemonkey.ws, mingo@elte.hu, David Miller List-Id: virtualization@lists.linuxfoundation.org On Tue, 20 Mar 2007, Zachary Amsden wrote: > = > void local_irq_restore(int enabled) > { > pda.intr_mask =3D enabled; > /* > * note there is a window here where softirqs are not processed by > * the interrupt handler, but that is not a problem, since it will > * get done here in the outer enable of any nested pair. > */ > if (enabled) > local_bh_enable(); > } Actually, this one is more complicated. You also need to actually enable = hardware interrupts again if they got disabled by an interrupt actually = occurring while the "soft-interrupt" was disabled. But since it's all a local-cpu issue, you can do things like test = cpu-local memory flags for whetehr that has happened or not. So it *should* be something as simple as local_irq_disable() { pda.irq_enable =3D 0; } handle_interrupt() { if (!pda.irq_enable) { pda.irq_queued =3D 1; queue_interrupt(); .. make sure we return with hardirq's now = disabled: just clear IF in the pt_regs .. return; } .. normal .. } local_irq_enable() { pda.irq_enable =3D 1; barrier(); /* Common case - nothing happened while we were fake-disabled.. */ if (!pda.irq_queued) return; = /* Ok, actually handle the things! */ handle_queued_irqs(); /* * And enable the hw interrupts again, they got disabled = * when we were queueing stuff.. = */ hardware_sti(); } but I haven't really gone over it in any detail, I may have missed = something really obvious. Anyway, it really *should* be pretty damn simple. No need to disable = preemption, there should be no events that can *cause* it, since all = interrupts get headed off at the pass.. (the return-from-interrupt thng = should already notice that it's returning to an interrupts-disabled = section and not try to do any preemption). What did I miss? Linus