Re: Sporadius hangs on 2.0.34pre10... I cought one.

Daniel Ryde (ryde@tripnet.se)
Wed, 22 Apr 1998 15:18:45 +0200 (CEST)


On Wed, 22 Apr 1998, Andrea Arcangeli wrote:

> On Tue, 21 Apr 1998, Daniel Ryde wrote:
>
> >Finally I cought one of these complete freeze scenarios using Andreas
> >print_eip patch port on a 2.0.34pre10 kernel.
>
> Cool! I am happy it helped! I will debug things soon.

FYI it happend again this morning.
Same location: 12d924 <free_wait+10/58>.

free_wait is only called from do_select() probably whith a broken
wait_queue. That's as far as I can understand it.

In fs/select.c (from a clean 2.0.33):
48 static void free_wait(select_table * p)
49 {
50 struct select_table_entry * entry = p->entry + p->nr;
51
52 while (p->nr > 0) {
53 p->nr--;
54 entry--;
55 remove_wait_queue(entry->wait_address,&entry->wait);
56 }
57 }

from include/linux/sched.h:
425 extern inline void __remove_wait_queue(struct wait_queue ** p, struct wait_queue * wait)
426 {
427 struct wait_queue * next = wait->next;
428 struct wait_queue * head = next;
429
430 for (;;) {
431 struct wait_queue * nextlist = head->next;
432 if (nextlist == wait)
433 break;
434 head = nextlist;
435 }
436 head->next = next;
437 }
439 extern inline void remove_wait_queue(struct wait_queue ** p, struct wait_queue * wait)
440 {
441 unsigned long flags;
442
443 save_flags(flags);

Ok, here is the cli

444 cli();

And then looop forever in:

445 __remove_wait_queue(p, wait);
446 restore_flags(flags);
447 }

/D.Ryde

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu