qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Jamie Lokier <jamie@shareable.org>
To: Artyom Tarasenko <atar4qemu@googlemail.com>
Cc: Blue Swirl <blauwirbel@gmail.com>, qemu-devel <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] Re: [PATCH] sparc32 irq clearing (guest Solaris performance+NetBSD) fix
Date: Mon, 16 Nov 2009 22:27:18 +0000	[thread overview]
Message-ID: <20091116222718.GA12063@shareable.org> (raw)
In-Reply-To: <fb8d4f70911160347v32ffe6a0rbdd65660c4facfcf@mail.gmail.com>

Artyom Tarasenko wrote:
> 2009/11/15 Blue Swirl <blauwirbel@gmail.com>:
> > On Sun, Nov 15, 2009 at 1:15 AM, Artyom Tarasenko
> > <atar4qemu@googlemail.com> wrote:
> >> 2009/11/14 Blue Swirl <blauwirbel@gmail.com>:
> >>> On Sat, Nov 14, 2009 at 3:03 AM, Artyom Tarasenko
> >>> <atar4qemu@googlemail.com> wrote:
> >>>> According to NCR89C105 documentation
> >>>> http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C105.txt
> >>>>
> >>>> Interrupts are cleared by disabling and then re-enabling them.
> >>>> This patch implements the specified behaviour. The most visible effects:
> >>>
> >>> I think the current version also implements this behaviour. The
> >>> difference is that now we clear on disable, with your version, the
> >>> interrupts are cleared when re-enabling them.
> >>
> >> Doesn't this imply that the current version does not implement this
> >> ("Interrupts are cleared by disabling and then re-enabling them") behavior? ;-)
> >
> > The specification only says that the sequence disable-enable clears
> > interrupts, but not which of these is true:
> > - clearing happens in the moment of disabling (and interrupts after
> > that are not cleared, current version)
> > - clearing happens  in the moment of re-enabling (your version, sort of)
> > - clearing happens in both cases (lose interrupts)
> 
> English is not my native language, but fwiw I think "and then
> re-enabling" can only be the second variant. Without "then" it could
> be either one or three. And if the first variant is what they really
> meant, the part with "and then" is totally redundant and misleading.

It could also be a fourth:

- Clearing happens continuously _during_ the time the interrupt is disabled.

Note that neither this, nor the third possibility, have to cause lost
interrupts - that depends on whether the code which enables interrupts
checks for them being pending after enabling them, or checks the
devices generating them.

> > It's also interesting to think what happens between the interrupt
> > controller and the devices. Clearing an interrupt at controller level
> > does not clear the interrupt condition at the device. Aren't the
> > interrupts level triggered on Sparc, so the interrupt is still posted?
> > Is the interrupt actually masked by clearing until the level is
> > deactivated?
> 
> Looks unlikely to me. In the book "Panic! Unix system crash dump
> analysis" the authors write that the first thing interrupt handler has
> to do is disable the interrupt, and yes wrting "unix" they mean
> "SunOS/Solaris".
>
> That's also what I observe debugging the Solaris kernel code
> (Solaris kernel debugger is a really powerful tool).
> Looks like interrupts can be shared between devices, so the general
> handler disables the interrupt and then calls multiple device-specific
> handlers sequentially and checks if any of then claims the interrupt.
> If no one does it writes the message "Spurious interrupt %d\n".

That's consistent with level triggered interrupts, and may require the
interrupt to be cleared at the device before it is re-enabled at the
interrupt controller.

> > Or maybe the controller latches the interrupt so that even after the
> > device releases the interrupt line, interrupt is still active towards
> > the CPU. Then the clearing would make sense.
> 
> Looks very realistic to me.

>From what you said above about Solaris, I don't think you can
distinguish between interrupts being asserted only while a device
continues to assert it, and interrupts remaining asserted after the
device stops.

-- Jamie

      parent reply	other threads:[~2009-11-16 22:27 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-11-14  1:03 [Qemu-devel] [PATCH] sparc32 irq clearing (guest Solaris performance+NetBSD) fix Artyom Tarasenko
2009-11-14 15:26 ` [Qemu-devel] " Blue Swirl
2009-11-14 23:15   ` Artyom Tarasenko
2009-11-15 22:13     ` Blue Swirl
2009-11-16 11:47       ` Artyom Tarasenko
2009-11-16 16:14         ` Blue Swirl
2009-11-16 17:19           ` Artyom Tarasenko
2009-11-16 21:53             ` Blue Swirl
2009-11-16 22:31               ` Jamie Lokier
2009-11-16 22:50               ` Artyom Tarasenko
2009-11-16 22:35             ` Jamie Lokier
2009-11-16 22:44               ` Artyom Tarasenko
2009-11-17 20:45               ` Blue Swirl
2010-01-15 22:37                 ` Artyom Tarasenko
2009-11-16 16:45         ` Artyom Tarasenko
2009-11-16 22:27         ` Jamie Lokier [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20091116222718.GA12063@shareable.org \
    --to=jamie@shareable.org \
    --cc=atar4qemu@googlemail.com \
    --cc=blauwirbel@gmail.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).