Re: 2.6.0-t1 garbage in /proc/ioports and oops

From: Adam Belay (ambx1@neo.rr.com)
Date: Sun Jul 27 2003 - 17:43:57 EST


On Sun, Jul 27, 2003 at 04:38:12PM -0700, Andrew Morton wrote:
> Chris Ruvolo <chris@ruvolo.net> wrote:
> >
> > (adding alsa-devel)
> >
> > On Thu, Jul 17, 2003 at 09:15:33PM -0700, Andrew Morton wrote:
> > > You could load all those modules one at a time, doing a `cat /proc/ioports'
> > > after each one. One sneaky way of doing that would be to make your
> > > modprobe executable be:
> >
> > Ok, this let me track it down to the ALSA snd-sbawe module. I did not have
> > isapnp compiled into the kernel and was relying on the userspace isapnp to
> > configure the device (carried over from 2.4). Apparently the module didn't
> > like this.
>
> OK, thanks for that.
>
> >From my reading, snd_sb16_probe() is, in the case of !CONFIG_PNP, doing:
>
> /* block the 0x388 port to avoid PnP conflicts */
> acard->fm_res = request_region(0x388, 4, "SoundBlaster FM");
>
> but this reservation is never undone. So later, after the module is
> unloaded, a read of /proc/ioports is oopsing when trying to access that
> string "SoundBlaster FM". Because it now resides in vfree'd memory.
>
> The fix would be to run release_region() either at the end of
> snd_sb16_probe() or on module unload.
>
> Adam or Jaroslav, could you please take care of this?
>
> Thanks.

I believe this will fix it. Testing would be appreciated.

Thanks,
Adam

--- a/sound/isa/sb/sb16.c 2003-07-14 03:37:15.000000000 +0000
+++ b/sound/isa/sb/sb16.c 2003-07-27 22:33:22.000000000 +0000
@@ -350,6 +350,18 @@
 
 #endif /* CONFIG_PNP */
 
+static void snd_sb16_free(snd_card_t *card)
+{
+ struct snd_card_sb16 *acard = (struct snd_card_sb16 *) card->private_data;
+
+ if (acard == NULL)
+ return;
+ if (acard->fm_res) {
+ release_resource(acard->fm_res);
+ kfree_nocheck(acard->fm_res);
+ }
+}
+
 static int __init snd_sb16_probe(int dev,
                                  struct pnp_card_link *pcard,
                                  const struct pnp_card_device_id *pid)
@@ -374,6 +386,7 @@
         if (card == NULL)
                 return -ENOMEM;
         acard = (struct snd_card_sb16 *) card->private_data;
+ card->private_free = snd_sb16_free;
 #ifdef CONFIG_PNP
         if (isapnp[dev]) {
                 if ((err = snd_card_sb16_pnp(dev, acard, pcard, pid))) {
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Jul 31 2003 - 22:00:34 EST