linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* 2.5.38-mm2 pdflush_list
@ 2002-09-25  2:23 William Lee Irwin III
  2002-09-25  2:54 ` Andrew Morton
  0 siblings, 1 reply; 4+ messages in thread
From: William Lee Irwin III @ 2002-09-25  2:23 UTC (permalink / raw)
  To: linux-mm

Program received signal SIGSEGV, Segmentation fault.
pdflush_operation (fn=0xc0142428 <background_writeout>, arg0=0)
    at /mnt/b/2.5.38/linux-2.5/include/linux/list.h:130
130     /mnt/b/2.5.38/linux-2.5/include/linux/list.h: No such file or directory.
        in /mnt/b/2.5.38/linux-2.5/include/linux/list.h
(gdb) bt
#0  pdflush_operation (fn=0xc0142428 <background_writeout>, arg0=0)
    at /mnt/b/2.5.38/linux-2.5/include/linux/list.h:130
#1  0xc01423cf in balance_dirty_pages (mapping=0xd749383c)
    at page-writeback.c:127
#2  0xc014241f in balance_dirty_pages_ratelimited (mapping=0xd749383c)
    at page-writeback.c:160
#3  0xc013300f in generic_file_write_nolock (file=0xd7c67bc0, iov=0xc6aa9f70, 
    nr_segs=1, ppos=0xd7c67be0) at filemap.c:1643
#4  0xc013313f in generic_file_write (file=0xd7c67bc0, 
    buf=0x804bda0 '\001' <repeats 200 times>..., count=65487, ppos=0xd7c67be0)
    at filemap.c:1675
#5  0xc014640c in vfs_write (file=0xd7c67bc0, 
    buf=0x804bda0 '\001' <repeats 200 times>..., count=65487, pos=0xd7c67be0)
    at read_write.c:214
#6  0xc01464ee in sys_write (fd=7, 
    buf=0x804bda0 '\001' <repeats 200 times>..., count=65487)
    at read_write.c:244
#7  0xc010746f in syscall_call () at process.c:685

There's a NULL in this circular list:

(gdb) p &pdflush_list
$15 = (struct list_head *) 0xc02b5bdc
(gdb) p pdflush_list
$16 = {next = 0xdbf23fe0, prev = 0xe0125fe0}
(gdb) p *(pdflush_list.next)
$17 = {next = 0x0, prev = 0xc02b5bdc}
(gdb) p *(pdflush_list.prev)
$18 = {next = 0xc02b5bdc, prev = 0xdbf23fe0}
(gdb) p *((pdflush_list.prev)->prev)
$19 = {next = 0x0, prev = 0xc02b5bdc}
(gdb) p *(((pdflush_list.prev)->prev)->prev)
$20 = {next = 0xdbf23fe0, prev = 0xe0125fe0}
(gdb) p *pdf
$21 = {who = 0x0, fn = 0, arg0 = 0, list = {next = 0x0, prev = 0xc02b5bdc}, 
  when_i_went_to_sleep = 0}



Cheers,
Bill
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: 2.5.38-mm2 pdflush_list
  2002-09-25  2:23 2.5.38-mm2 pdflush_list William Lee Irwin III
@ 2002-09-25  2:54 ` Andrew Morton
  2002-09-25  2:55   ` William Lee Irwin III
  0 siblings, 1 reply; 4+ messages in thread
From: Andrew Morton @ 2002-09-25  2:54 UTC (permalink / raw)
  To: William Lee Irwin III; +Cc: linux-mm

William Lee Irwin III wrote:
> 
> ...
> There's a NULL in this circular list:
> 

The only way I can see this happen is if someone sprayed out
a bogus wakeup.  Are you using preempt (or software suspend??)
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: 2.5.38-mm2 pdflush_list
  2002-09-25  2:54 ` Andrew Morton
@ 2002-09-25  2:55   ` William Lee Irwin III
  2002-09-25  3:13     ` Andrew Morton
  0 siblings, 1 reply; 4+ messages in thread
From: William Lee Irwin III @ 2002-09-25  2:55 UTC (permalink / raw)
  To: Andrew Morton; +Cc: linux-mm

William Lee Irwin III wrote:
>> There's a NULL in this circular list:

On Tue, Sep 24, 2002 at 07:54:47PM -0700, Andrew Morton wrote:
> The only way I can see this happen is if someone sprayed out
> a bogus wakeup.  Are you using preempt (or software suspend??)

Nope. Just SMP. Happened on the NUMA-Q's. I couldn't figure out
what was going on from this. It's still up for postmortem, though.


Cheers,
Bill
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: 2.5.38-mm2 pdflush_list
  2002-09-25  2:55   ` William Lee Irwin III
@ 2002-09-25  3:13     ` Andrew Morton
  0 siblings, 0 replies; 4+ messages in thread
From: Andrew Morton @ 2002-09-25  3:13 UTC (permalink / raw)
  To: William Lee Irwin III; +Cc: linux-mm

William Lee Irwin III wrote:
> 
> William Lee Irwin III wrote:
> >> There's a NULL in this circular list:
> 
> On Tue, Sep 24, 2002 at 07:54:47PM -0700, Andrew Morton wrote:
> > The only way I can see this happen is if someone sprayed out
> > a bogus wakeup.  Are you using preempt (or software suspend??)
> 
> Nope. Just SMP. Happened on the NUMA-Q's. I couldn't figure out
> what was going on from this. It's still up for postmortem, though.
> 

Don't know.

I tightened up the locking in there, added some paranoia and a
couple of printks for when it happens again.


--- 2.5.38/mm/pdflush.c~pdflush-tightening	Tue Sep 24 19:55:10 2002
+++ 2.5.38-akpm/mm/pdflush.c	Tue Sep 24 20:01:19 2002
@@ -79,9 +79,9 @@ static unsigned long last_empty_jifs;
  */
 struct pdflush_work {
 	struct task_struct *who;	/* The thread */
-	void (*fn)(unsigned long);	/* A callback function for pdflush to work on */
-	unsigned long arg0;		/* An argument to the callback function */
-	struct list_head list;		/* On pdflush_list, when the thread is idle */
+	void (*fn)(unsigned long);	/* A callback function */
+	unsigned long arg0;		/* An argument to the callback */
+	struct list_head list;		/* On pdflush_list, when idle */
 	unsigned long when_i_went_to_sleep;
 };
 
@@ -99,24 +99,35 @@ static int __pdflush(struct pdflush_work
 	current->flags |= PF_FLUSHER;
 	my_work->fn = NULL;
 	my_work->who = current;
+	INIT_LIST_HEAD(&my_work->list);
 
 	spin_lock_irq(&pdflush_lock);
 	nr_pdflush_threads++;
-//	printk("pdflush %d [%d] starts\n", nr_pdflush_threads, current->pid);
 	for ( ; ; ) {
 		struct pdflush_work *pdf;
 
-		list_add(&my_work->list, &pdflush_list);
-		my_work->when_i_went_to_sleep = jiffies;
 		set_current_state(TASK_INTERRUPTIBLE);
+		list_move(&my_work->list, &pdflush_list);
+		my_work->when_i_went_to_sleep = jiffies;
 		spin_unlock_irq(&pdflush_lock);
 
 		if (current->flags & PF_FREEZE)
 			refrigerator(PF_IOTHREAD);
 		schedule();
 
-		if (my_work->fn)
-			(*my_work->fn)(my_work->arg0);
+		spin_lock_irq(&pdflush_lock);
+		if (!list_empty(&my_work->list)) {
+			printk("pdflush: bogus wakeup!\n");
+			my_work->fn = NULL;
+			continue;
+		}
+		if (my_work->fn == NULL) {
+			printk("pdflush: NULL work function\n");
+			continue;
+		}
+		spin_unlock_irq(&pdflush_lock);
+
+		(*my_work->fn)(my_work->arg0);
 
 		/*
 		 * Thread creation: For how long have there been zero
@@ -132,6 +143,7 @@ static int __pdflush(struct pdflush_work
 		}
 
 		spin_lock_irq(&pdflush_lock);
+		my_work->fn = NULL;
 
 		/*
 		 * Thread destruction: For how long has the sleepiest
@@ -143,13 +155,12 @@ static int __pdflush(struct pdflush_work
 			continue;
 		pdf = list_entry(pdflush_list.prev, struct pdflush_work, list);
 		if (jiffies - pdf->when_i_went_to_sleep > 1 * HZ) {
-			pdf->when_i_went_to_sleep = jiffies;	/* Limit exit rate */
+			/* Limit exit rate */
+			pdf->when_i_went_to_sleep = jiffies;
 			break;					/* exeunt */
 		}
-		my_work->fn = NULL;
 	}
 	nr_pdflush_threads--;
-//	printk("pdflush %d [%d] ends\n", nr_pdflush_threads, current->pid);
 	spin_unlock_irq(&pdflush_lock);
 	return 0;
 }
@@ -191,11 +202,10 @@ int pdflush_operation(void (*fn)(unsigne
 		list_del_init(&pdf->list);
 		if (list_empty(&pdflush_list))
 			last_empty_jifs = jiffies;
-		spin_unlock_irqrestore(&pdflush_lock, flags);
 		pdf->fn = fn;
 		pdf->arg0 = arg0;
-		wmb();			/* ? */
 		wake_up_process(pdf->who);
+		spin_unlock_irqrestore(&pdflush_lock, flags);
 	}
 	return ret;
 }

.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2002-09-25  3:13 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-09-25  2:23 2.5.38-mm2 pdflush_list William Lee Irwin III
2002-09-25  2:54 ` Andrew Morton
2002-09-25  2:55   ` William Lee Irwin III
2002-09-25  3:13     ` Andrew Morton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox