Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 17 Jul 2000 16:30:38 +0930
From:      Greg Lehey <grog@lemis.com>
To:        arch@FreeBSD.org, smp@FreeBSD.org
Subject:   Tidying up the interrupt registration process
Message-ID:  <20000717163038.J26231@wantadilla.lemis.com>

next in thread | raw e-mail | index | archive | help
I think I now understand how drivers register interrupts with newbus,
and it seems that some tidying up is in order.

Currently the handlers call BUS_SETUP_INTR with flags intr_type
(defined in sys/bus.h):

enum intr_type {
    INTR_TYPE_TTY = 1,
    INTR_TYPE_BIO = 2,
    INTR_TYPE_NET = 4,
    INTR_TYPE_CAM = 8,
    INTR_TYPE_MISC = 16,
    INTR_TYPE_FAST = 128
};

At least in nexus_setup_intr (sys/i386/i386/nexus.c), and possibly
elsewhere as well, these flags get converted into an interrupt mask
and flags for struct intrec, defined in sys/i386/isa/intr_machdep.h:

#define	INTR_FAST	0x00000001	/* fast interrupt handler */
#define INTR_EXCL	0x00010000	/* exclusive interrupt */

INTR_EXCL comes from the r_flags field in struct resource
(sys/rman.h), where it is the complement of RF_SHAREABLE:

#define	RF_ALLOCATED	0x0001	/* resource has been reserved */
#define	RF_ACTIVE	0x0002	/* resource allocation has been activated */
#define	RF_SHAREABLE	0x0004	/* resource permits contemporaneous sharing */
#define	RF_TIMESHARE	0x0008	/* resource permits time-division sharing */
#define	RF_WANTED	0x0010	/* somebody is waiting for this resource */
#define	RF_FIRSTSHARE	0x0020	/* first in sharing list */

These flag bits are all lightly used, and there's confusing
duplication of functionality.  For example, in nexus_setup_intr we
have:

	case (INTR_TYPE_TTY | INTR_TYPE_FAST):
		mask = &tty_imask;
		icflags |= INTR_FAST;

In sys/pci/pci_compat.c we have

		if (intflags & INTR_FAST)
			flags |= INTR_TYPE_FAST;

It seems to me that we should define the flags to the *setup_intr
functions to match those in struct intrec.  Probably the RF_* flags
are different enough in purpose that we shouldn't do the same thing
there.

In addition, these flags will have to change a lot in the change to
threaded interrupts.  First, I intend to add two additional flags to
struct intrec:

#define INTR_HEAVY	0x00000002	/* heavyweight interrupt process */
#define INTR_LIGHT	0x00000004	/* light weight interrupt thread */
#define INTR_THREADED   (INTR_LIGHT | INTR_HEAVY) /* any kind of interrupt thread */

This will allow us to let traditional interrupts, lightweight threads
and heavyweight processes to coexist; when the change is complete, we
may be able to let them go away.  The INTR_TYPE_TTY and friends are a
different issue; at the moment I don't know if they're enough, but
probably we should replace them with a process priority.  I'd be
grateful for any thoughts on these subjects.

About fast interrupts, which currently seem to be used only by the sio
driver: they perform their entire work before reenabling interrupts,
and it's possible that we can keep them like that, though I haven't
looked at the code yet.  Does anybody know any reason why we should
convert them to threaded interrupts?

Greg
--
Finger grog@lemis.com for PGP public key
See complete headers for address and phone numbers


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000717163038.J26231>