2003-06-12 16:55:14

by Luca

[permalink] [raw]
Subject: [2.5.70][XFS] Sleeping function called from illegal context


Hi,
I get this at shutdown, just after umount:

Debug: Sleeping function called from illegal context at
kernel/workqueue.c:327
Call Trace:
__might_sleep+0x5f/0x90
flush_workqueue+0x1f/0x360
xfs_idestroy+0x6e/0xb0
xfs_sync_inodes+01da/0xa80
xfs_sync_inodes+01da/0xa80
apic_timer_interrupt+0x1a/0x20
pagebuf_delwri_flush+0x9b/0x480
xfs_flush_buftarg+0x21/0x30
xfs_unmount+0xd1/0x180
wakeupup_process+0x26/0x30
linvfs_sosp+0x0/0x60
vfs_unmount+0x34/0x40
linvfs_put_super+0x1d/0x50
generic_shutdown_super+0x3b4/0x420
kill_block_super+0x1d/0x50
deactivate_super+0xd2/0x2b0
free_vfsmnt+0x20/0x30
xfs_fs_type+0x0/0xa0
sys_umount+0x3c/x0a0
sys_oldumount+0x19/0x20
syscall_call+0x7/0xb


I see it almost every time I shutdown my PC. Kernel is 2.5.70 vanilla,
UP with CONFIG_PREEMPT. XFS is compiled as module.


Luca
--
Reply-To: [email protected]
Home: http://kronoz.cjb.net
Alcuni pensano che io sia una persona orribile, ma non vero. Ho il
cuore di un ragazzino - in un vaso sulla scrivania.


2003-06-12 17:04:54

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [2.5.70][XFS] Sleeping function called from illegal context


--- 1.53/fs/xfs/pagebuf/page_buf.c Mon May 19 21:00:43 2003
+++ edited/fs/xfs/pagebuf/page_buf.c Wed Jun 11 21:30:21 2003
@@ -1689,10 +1689,10 @@
int pincount = 0;
int flush_cnt = 0;

+ pagebuf_runall_queues(pagebuf_dataio_workqueue);
+
spin_lock(&pbd_delwrite_lock);
INIT_LIST_HEAD(&tmp);
-
- pagebuf_runall_queues(pagebuf_dataio_workqueue);

list_for_each_safe(curr, next, &pbd_delwrite_queue) {
pb = list_entry(curr, page_buf_t, pb_list);

2003-06-12 17:11:40

by Steve Lord

[permalink] [raw]
Subject: Re: [2.5.70][XFS] Sleeping function called from illegal context

On Thu, 2003-06-12 at 12:18, Christoph Hellwig wrote:
> --- 1.53/fs/xfs/pagebuf/page_buf.c Mon May 19 21:00:43 2003
> +++ edited/fs/xfs/pagebuf/page_buf.c Wed Jun 11 21:30:21 2003
> @@ -1689,10 +1689,10 @@
> int pincount = 0;
> int flush_cnt = 0;
>
> + pagebuf_runall_queues(pagebuf_dataio_workqueue);
> +
> spin_lock(&pbd_delwrite_lock);
> INIT_LIST_HEAD(&tmp);
> -
> - pagebuf_runall_queues(pagebuf_dataio_workqueue);
>
> list_for_each_safe(curr, next, &pbd_delwrite_queue) {
> pb = list_entry(curr, page_buf_t, pb_list);

Yep, I will check this in.

Thanks Christoph,

Steve

--

Steve Lord voice: +1-651-683-3511
Principal Engineer, Filesystem Software email: [email protected]