Date: Mon, 26 Aug 2002 02:22:39 +0900 (JST) From: Mitsuru IWASAKI <iwasaki@jp.FreeBSD.org> To: current@FreeBSD.ORG Subject: [PATCH]: resource manager (subr_rman.c) has a serious bug Message-ID: <20020826.022239.89228936.iwasaki@jp.FreeBSD.org>
next in thread | raw e-mail | index | archive | help
[resent a few times, sorry if you receive the same messages]
Hi, I've found that there is a serious bug in sys/kern/subr_rman.c
about finding an acceptable region. I'm sure it's a obvious bug and
going to commit it soon, but this is my first commit to resource
manager code, so please review my patch. I'll commit this 2 or 3 days
later.
OK, when I trying to use wi PCCard with NEWCARD, sometimes wrong
I/O port range was allocated and attaching the card was failed
depending on the usage of I/O port resources.
Here is the kernel message w/ RMAN_DEBUG option in subr_rman.c.
----
rman_reserve_resource: <I/O ports> request: [0x100, 0xffffffff], length 0x40, flags 6144, device pccard1
considering [0x100, 0x107]
region is allocated
considering [0x108, 0x10d]
truncated region: [0x140, 0x10d]; size 0xffffffce (requested 0x40)
^^^^^ ^^^^^
start > end, hmmm, very odd.
----
The resource manager is trying to find the I/O port resource range
(length = 0x40) checking the range [0x108 - 0x10d]. Adjusted start
address on boundary and alignment is [0x140], but this address already
exceeds end address of the range. That's the problem.
As the result, wrong address range [0x140 - 0x17f] was allocated.
Here is my patch. very simple but correct I think.
Index: subr_rman.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/subr_rman.c,v
retrieving revision 1.24
diff -u -r1.24 subr_rman.c
--- subr_rman.c 4 Apr 2002 21:03:26 -0000 1.24
+++ subr_rman.c 25 Aug 2002 14:49:20 -0000
@@ -232,6 +234,10 @@
} while ((rstart & amask) != 0 && rstart < end &&
rstart < s->r_end);
rend = ulmin(s->r_end, ulmax(rstart + count, end));
+ if (rstart > rend) {
+ DPRINTF(("adjusted start exceeds end\n"));
+ continue;
+ }
DPRINTF(("truncated region: [%#lx, %#lx]; size %#lx (requested %#lx)\n",
rstart, rend, (rend - rstart + 1), count));
The kernel message w/ my patch is:
----
rman_reserve_resource: <I/O ports> request: [0x100, 0xffffffff], length 0x40, flags 6144, device pccard1
considering [0x100, 0x107]
region is allocated
considering [0x108, 0x10d]
adjusted start exceeds end
considering [0x10e, 0x10e]
region is allocated
considering [0x10f, 0x16f]
truncated region: [0x140, 0x16f]; size 0x30 (requested 0x40)
considering [0x170, 0x177]
region is allocated
considering [0x178, 0x1ef]
truncated region: [0x180, 0x1ef]; size 0x70 (requested 0x40)
----
It seems that correct range is allocated, and wi PCCard is always
working correctly now :-)
Thanks
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?20020826.022239.89228936.iwasaki>
