Re: 2.5.74-mm3 yenta-socket oops back

Andrew Morton (akpm@osdl.org)
Wed, 9 Jul 2003 21:30:10 -0700


Michael Frank <mflt1@micrologica.com.hk> wrote:
>
> 2.5.74-mm3 yenta-socket oopsed on the first boot at the same spot.
>
> I have successfully used both patches below with -mm1.
>
> --- 1.50/drivers/pcmcia/cs.c Mon Jun 30 22:22:30 2003
> +++ edited/cs.c Sat Jul 5 23:58:07 2003
> @@ -338,13 +338,13 @@
> socket->erase_busy.next = socket->erase_busy.prev = &socket->erase_busy;
> INIT_LIST_HEAD(&socket->cis_cache);
> spin_lock_init(&socket->lock);
> -
> - init_socket(socket);
> -
> init_completion(&socket->thread_done);
> init_waitqueue_head(&socket->thread_wait);
> init_MUTEX(&socket->skt_sem);
> spin_lock_init(&socket->thread_lock);
> +
> + init_socket(socket);
> +
> ret = kernel_thread(pccardd, socket, CLONE_KERNEL);
> if (ret < 0)
> return ret;
>

This one is clearly correct.

> and my patch (may apply with some offset, which I'm about to check
> into bk anyway):
>
> --- linux/drivers/pcmcia/cs.c.old Fri Jul 4 10:21:50 2003
> +++ linux/drivers/pcmcia/cs.c Sun Jul 6 23:04:10 2003
> @@ -870,11 +870,13 @@
>
> void pcmcia_parse_events(struct pcmcia_socket *s, u_int events)
> {
> - spin_lock(&s->thread_lock);
> - s->thread_events |= events;
> - spin_unlock(&s->thread_lock);
> + if (s->thread) {
> + spin_lock(&s->thread_lock);
> + s->thread_events |= events;
> + spin_unlock(&s->thread_lock);
>
> - wake_up(&s->thread_wait);
> + wake_up(&s->thread_wait);
> + }
> } /* pcmcia_parse_events */

This one may not be. How did we get here with no thread to handle the
event? Do you have an oops trace on this one?

Or just stick a

if (!s->thread)
dump_stack();

in there as well.

-
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/