Date: Thu, 13 Dec 2001 09:19:57 -0800 From: Luigi Rizzo <rizzo@aciri.org> To: arch@freebsd.org Subject: swi_net Message-ID: <20011213091957.B39991@iguana.aciri.org>
next in thread | raw e-mail | index | archive | help
Hi,
we have 2 slightly different versions of swi_net in -current and
-stable, listed below (STABLE/Alpha is approximately the same as
CURRENT).
I like a lot the semantics of the version in -stable, because it
enforces a strict priority in the execution of soft handlers
(remember they are not preemptable), even when schednetisr(FOO) is
called within one of the handlers.
I understand that in the SMP case it is not simple to achieve the
same semantics without using a spinlock to implement an
"atomic_ffs_and_clear()" type of function (which would still be
cheap in the non-SMP case).
However I was wondering if there are objections in changing the
first line of the CURRENT version in
for (; bits = atomic_readandclear_int(&netisr); )
so that we process all pending handlers without exiting from the
function and have a closer approximation of what STABLE does.
comments ?
cheers
luigi
--------- u2/HEAD/src/sys/kern/kern_intr.c -----------------
static void
swi_net(void *dummy)
{
u_int bits;
int i;
bits = atomic_readandclear_int(&netisr);
while ((i = ffs(bits)) != 0) {
i--;
if (netisrs[i] != NULL)
netisrs[i]();
else
printf("swi_net: unregistered isr number: %d.\n", i);
bits &= ~(1 << i);
}
}
----- STABLE/src/sys/i386/isa/ipl.s -----
swi_net:
MCOUNT
bsfl _netisr,%eax
je swi_net_done
swi_net_more:
btrl %eax,_netisr
jnc swi_net_next
call *_netisrs(,%eax,4)
swi_net_next:
bsfl _netisr,%eax
jne swi_net_more
swi_net_done:
ret
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?20011213091957.B39991>
